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 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