cztop 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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