cztop 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGES.md +18 -0
- data/lib/cztop/poller.rb +91 -21
- data/lib/cztop/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a2f6944c31fc9ad2963801d45a819492a0c4a82c
|
4
|
+
data.tar.gz: cf4cacb4b356309058278b871143fb22c1ba53fa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 49e3cfd581c7424139a818450aa46b063a244610e96ef488371e2e70583a595b57e5c373799b58ac42c291f92e9c5bacb83f8f26fadf7363a2c6dd05e24ef775
|
7
|
+
data.tar.gz: a3cf1ea8a5b50b522eb0c7a7505c11fd068100fead2cd141410f9ae5dfb64f69f8a79f5ba3008dcd62b46ae95f258a5b1db30901188916ee863bd0e99198e717
|
data/CHANGES.md
CHANGED
@@ -1,3 +1,21 @@
|
|
1
|
+
0.4.0 (13/04/2016)
|
2
|
+
-----
|
3
|
+
* CZTop::Poller learns the following methods for convenience and compatibility:
|
4
|
+
* #add_reader
|
5
|
+
* #add_writer
|
6
|
+
* #remove_reader
|
7
|
+
* #remove_writer
|
8
|
+
* CZTop::Poller::Aggregated gets method delegators for the following 8 methods
|
9
|
+
for compatibility:
|
10
|
+
* CZTop::Poller#add
|
11
|
+
* CZTop::Poller#add_reader
|
12
|
+
* CZTop::Poller#add_writer
|
13
|
+
* CZTop::Poller#modify
|
14
|
+
* CZTop::Poller#remove
|
15
|
+
* CZTop::Poller#remove_reader
|
16
|
+
* CZTop::Poller#remove_writer
|
17
|
+
* CZTop::Poller#sockets
|
18
|
+
|
1
19
|
0.3.0 (13/04/2016)
|
2
20
|
-----
|
3
21
|
* port CZTop::Poller to zmq_poller_*() functions so it supports thread-safe
|
data/lib/cztop/poller.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
module CZTop
|
2
2
|
# A non-trivial socket poller.
|
3
3
|
#
|
4
|
-
# It can poll for
|
5
|
-
# (SERVER/CLIENT/RADIO/DISH).
|
4
|
+
# It can poll for readability and writability, and supports thread-safe
|
5
|
+
# sockets (SERVER/CLIENT/RADIO/DISH).
|
6
6
|
#
|
7
7
|
# This implementation is NOT based on CZMQ's +zpoller+. Reasons:
|
8
8
|
#
|
9
|
-
# * +zpoller+ can only poll for
|
9
|
+
# * +zpoller+ can only poll for readability
|
10
10
|
#
|
11
11
|
class Poller
|
12
12
|
include ::CZMQ::FFI
|
@@ -23,22 +23,36 @@ module CZTop
|
|
23
23
|
ZMQ.poller_destroy(ptr_ptr)
|
24
24
|
end)
|
25
25
|
@event_ptr = FFI::MemoryPointer.new(ZMQ::PollerEvent)
|
26
|
-
readers.each { |r|
|
26
|
+
readers.each { |r| add_reader(r) }
|
27
27
|
end
|
28
28
|
|
29
|
-
# Adds a socket to be polled for
|
29
|
+
# Adds a socket to be polled for readability.
|
30
30
|
# @param socket [Socket, Actor] the socket
|
31
|
-
# @param events [Integer] events you're interested in (see
|
32
|
-
# {ZMQ}
|
31
|
+
# @param events [Integer] bitwise-OR'd events you're interested in (see
|
32
|
+
# POLLIN and POLLOUT constants in {CZTop::Poller::ZMQ}
|
33
33
|
# @return [void]
|
34
34
|
# @raise [ArgumentError] if it's not a socket
|
35
|
-
def add(socket, events
|
35
|
+
def add(socket, events)
|
36
36
|
ptr = ptr_for_socket(socket)
|
37
37
|
rc = ZMQ.poller_add(@poller_ptr, ptr, nil, events)
|
38
38
|
HasFFIDelegate.raise_zmq_err if rc == -1
|
39
39
|
remember_socket(socket, events)
|
40
40
|
end
|
41
41
|
|
42
|
+
# Convenience method to register a socket for readability. See {#add}.
|
43
|
+
# @param socket [Socket, Actor] the socket
|
44
|
+
# @return [void]
|
45
|
+
def add_reader(socket)
|
46
|
+
add(socket, ZMQ::POLLIN)
|
47
|
+
end
|
48
|
+
|
49
|
+
# Convenience method to register a socket for writability. See {#add}.
|
50
|
+
# @param socket [Socket, Actor] the socket
|
51
|
+
# @return [void]
|
52
|
+
def add_writer(socket)
|
53
|
+
add(socket, ZMQ::POLLOUT)
|
54
|
+
end
|
55
|
+
|
42
56
|
# Modifies the events of interest for the given socket.
|
43
57
|
# @param socket [Socket, Actor] the socket
|
44
58
|
# @param events [Integer] events you're interested in (see constants in
|
@@ -64,6 +78,32 @@ module CZTop
|
|
64
78
|
forget_socket(socket)
|
65
79
|
end
|
66
80
|
|
81
|
+
# Removes a reader socket that was registered for readability only.
|
82
|
+
#
|
83
|
+
# @param socket [Socket, Actor] the socket
|
84
|
+
# @raise [ArgumentError] if it's not registered, not registered for
|
85
|
+
# readability, or registered for more than just readability
|
86
|
+
def remove_reader(socket)
|
87
|
+
if event_mask_for_socket(socket) == ZMQ::POLLIN
|
88
|
+
remove(socket)
|
89
|
+
return
|
90
|
+
end
|
91
|
+
raise ArgumentError, "not registered for readability only: %p" % socket
|
92
|
+
end
|
93
|
+
|
94
|
+
# Removes a reader socket that was registered for writability only.
|
95
|
+
#
|
96
|
+
# @param socket [Socket, Actor] the socket
|
97
|
+
# @raise [ArgumentError] if it's not registered, not registered for
|
98
|
+
# writability, or registered for more than just writability
|
99
|
+
def remove_writer(socket)
|
100
|
+
if event_mask_for_socket(socket) == ZMQ::POLLOUT
|
101
|
+
remove(socket)
|
102
|
+
return
|
103
|
+
end
|
104
|
+
raise ArgumentError, "not registered for writability only: %p" % socket
|
105
|
+
end
|
106
|
+
|
67
107
|
# Waits for registered sockets to become readable or writable, depending
|
68
108
|
# on what you're interested in.
|
69
109
|
#
|
@@ -98,13 +138,10 @@ module CZTop
|
|
98
138
|
|
99
139
|
# @param ptr [FFI::Pointer] pointer to the socket
|
100
140
|
# @return [Socket, Actor] socket corresponding to given pointer
|
141
|
+
# @raise [ArgumentError] if pointer is not known
|
101
142
|
def socket_for_ptr(ptr)
|
102
143
|
@sockets[ptr.to_i] or
|
103
|
-
|
104
|
-
# +zpoller_wait+ returned NULL. But it's better to fail early in case
|
105
|
-
# it ever returns a wrong pointer.
|
106
|
-
HasFFIDelegate.raise_zmq_err(
|
107
|
-
"no socket known for pointer #{ptr.inspect}")
|
144
|
+
raise ArgumentError, "no socket known for pointer %p" % ptr
|
108
145
|
end
|
109
146
|
|
110
147
|
# @return [Array<CZTop::Socket>] all sockets registered with this poller
|
@@ -113,9 +150,13 @@ module CZTop
|
|
113
150
|
@sockets.values
|
114
151
|
end
|
115
152
|
|
153
|
+
# Returns the event mask for the given, registered socket.
|
154
|
+
# @param socket [Socket, Actor] which socket's events to return
|
155
|
+
# @return [Integer] event mask for the given socket
|
156
|
+
# @raise [ArgumentError] if socket is not registered
|
116
157
|
def event_mask_for_socket(socket)
|
117
158
|
@events[socket] or
|
118
|
-
raise "no event mask known for socket %p" % socket
|
159
|
+
raise ArgumentError, "no event mask known for socket %p" % socket
|
119
160
|
end
|
120
161
|
|
121
162
|
private
|
@@ -128,11 +169,16 @@ module CZTop
|
|
128
169
|
Zsock.resolve(socket)
|
129
170
|
end
|
130
171
|
|
172
|
+
# Keeps a reference to the given socket, and remembers its event mask.
|
173
|
+
# @param socket [Socket, Actor] the socket
|
174
|
+
# @param events [Integer] the event mask
|
131
175
|
def remember_socket(socket, events)
|
132
176
|
@sockets[ptr_for_socket(socket).to_i] = socket
|
133
177
|
@events[socket] = events
|
134
178
|
end
|
135
179
|
|
180
|
+
# Discards the referencel to the given socket, and forgets its event mask.
|
181
|
+
# @param socket [Socket, Actor] the socket
|
136
182
|
def forget_socket(socket)
|
137
183
|
@sockets.delete(ptr_for_socket(socket).to_i)
|
138
184
|
@events.delete(socket)
|
@@ -182,9 +228,24 @@ module CZTop
|
|
182
228
|
# getting an array of readable/writable sockets:
|
183
229
|
#
|
184
230
|
# * in {#wait}, poll with given timeout
|
185
|
-
# * in case there was an event
|
186
|
-
#
|
187
|
-
#
|
231
|
+
# * in case there was an event:
|
232
|
+
# * deregister the corresponding event(s) on the registered socket
|
233
|
+
# * poll again with zero timeout until no more sockets
|
234
|
+
# * repeat and accumulate results into two lists
|
235
|
+
#
|
236
|
+
# = Forwarded Methods
|
237
|
+
#
|
238
|
+
# The following methods are defined on this class too, and calls are
|
239
|
+
# forwarded directly to the actual {CZTop::Poller} instance:
|
240
|
+
#
|
241
|
+
# * {CZTop::Poller#add}
|
242
|
+
# * {CZTop::Poller#add_reader}
|
243
|
+
# * {CZTop::Poller#add_writer}
|
244
|
+
# * {CZTop::Poller#modify}
|
245
|
+
# * {CZTop::Poller#remove}
|
246
|
+
# * {CZTop::Poller#remove_reader}
|
247
|
+
# * {CZTop::Poller#remove_writer}
|
248
|
+
# * {CZTop::Poller#sockets}
|
188
249
|
#
|
189
250
|
class Poller::Aggregated
|
190
251
|
|
@@ -197,6 +258,17 @@ module CZTop
|
|
197
258
|
# @return [Array<CZTop::Socket>] writable sockets
|
198
259
|
attr_reader :writables
|
199
260
|
|
261
|
+
extend Forwardable
|
262
|
+
def_delegators :@poller,
|
263
|
+
:add,
|
264
|
+
:add_reader,
|
265
|
+
:add_writer,
|
266
|
+
:modify,
|
267
|
+
:remove,
|
268
|
+
:remove_reader,
|
269
|
+
:remove_writer,
|
270
|
+
:sockets
|
271
|
+
|
200
272
|
# Initializes the aggregated poller.
|
201
273
|
# @param poller [CZTop::Poller] the wrapped poller
|
202
274
|
def initialize(poller = CZTop::Poller.new)
|
@@ -263,9 +335,7 @@ module CZTop
|
|
263
335
|
# were before the call to {#wait}.
|
264
336
|
# @return [void]
|
265
337
|
def restore_event_masks
|
266
|
-
@event_masks.each
|
267
|
-
poller.modify(socket, mask)
|
268
|
-
end
|
338
|
+
@event_masks.each { |socket, mask| poller.modify(socket, mask) }
|
269
339
|
end
|
270
340
|
end
|
271
341
|
|
@@ -333,7 +403,7 @@ module CZTop
|
|
333
403
|
end
|
334
404
|
|
335
405
|
# This is the trivial poller based on zpoller. It only supports polling
|
336
|
-
# for
|
406
|
+
# for readability, but it also supports doing that on CLIENT/SERVER sockets,
|
337
407
|
# which is useful for {CZTop::Poller}.
|
338
408
|
#
|
339
409
|
# @see http://api.zeromq.org/czmq3-0:zpoller
|
data/lib/cztop/version.rb
CHANGED