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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1619d296889181d095f1d88cf2fbf9b3f1d99f9c
4
- data.tar.gz: c85c0ac08700a9f7558a9936acf8397688138248
3
+ metadata.gz: a2f6944c31fc9ad2963801d45a819492a0c4a82c
4
+ data.tar.gz: cf4cacb4b356309058278b871143fb22c1ba53fa
5
5
  SHA512:
6
- metadata.gz: 65d9cac510d5e66ae019827bd87c3959362f3e9a5ff5e4579864a2a56e5bfaef7b9de7e9b072e26c6862130b7e0b22f86c93a9f5cf0b498004c68fe1e140fc80
7
- data.tar.gz: 371faea1cc8ccdb339033a2db20960cddfa9c5e40d59db4841013a06d3a72c0e70ccfe63b7e478724f46e4a963b956f045d52257f8e88787c38cbd588a836a1d
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 reading and writing, and supports thread-safe sockets
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 reading
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| add(r) }
26
+ readers.each { |r| add_reader(r) }
27
27
  end
28
28
 
29
- # Adds a socket to be polled for reading.
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 constants in
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 = ZMQ::POLLIN)
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
- # NOTE: This should never happen, since #wait will return nil if
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, poll again with zero timeout until no more
186
- # sockets
187
- # * accumulate results into two lists
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 do |socket, mask|
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 reading, but it also supports doing that on CLIENT/SERVER sockets,
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
@@ -1,3 +1,3 @@
1
1
  module CZTop
2
- VERSION = "0.3.0"
2
+ VERSION = "0.4.0"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cztop
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Patrik Wenger