ffi-rzmq 1.0.3 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.travis.yml +1 -1
- data/AUTHORS.txt +5 -1
- data/History.txt +19 -0
- data/README.rdoc +2 -4
- data/examples/README.rdoc +1 -3
- data/examples/{v3api/latency_measurement.rb → latency_measurement.rb} +1 -2
- data/examples/{v3api/local_lat.rb → local_lat.rb} +1 -1
- data/examples/{v3api/local_lat_poll.rb → local_lat_poll.rb} +4 -4
- data/examples/{v3api/local_throughput.rb → local_throughput.rb} +1 -1
- data/examples/{v3api/pub.rb → pub.rb} +1 -1
- data/examples/{v2api/publish_subscribe.rb → publish_subscribe.rb} +2 -2
- data/examples/{v2api/remote_lat.rb → remote_lat.rb} +1 -1
- data/examples/{v3api/remote_throughput.rb → remote_throughput.rb} +4 -3
- data/examples/{v2api/reqrep_poll.rb → reqrep_poll.rb} +3 -4
- data/examples/{v2api/request_response.rb → request_response.rb} +1 -2
- data/examples/{v3api/sub.rb → sub.rb} +1 -2
- data/examples/{v3api/throughput_measurement.rb → throughput_measurement.rb} +1 -1
- data/examples/{v3api/xreqxrep_poll.rb → xreqxrep_poll.rb} +6 -7
- data/ffi-rzmq.gemspec +4 -4
- data/lib/ffi-rzmq.rb +2 -3
- data/lib/ffi-rzmq/context.rb +25 -53
- data/lib/ffi-rzmq/device.rb +8 -4
- data/lib/ffi-rzmq/message.rb +24 -30
- data/lib/ffi-rzmq/poll.rb +5 -16
- data/lib/ffi-rzmq/socket.rb +129 -278
- data/lib/ffi-rzmq/util.rb +11 -36
- data/lib/ffi-rzmq/version.rb +1 -1
- data/spec/context_spec.rb +3 -8
- data/spec/device_spec.rb +10 -9
- data/spec/nonblocking_recv_spec.rb +7 -7
- data/spec/pushpull_spec.rb +8 -7
- data/spec/reqrep_spec.rb +6 -6
- data/spec/socket_spec.rb +43 -130
- data/spec/spec_helper.rb +3 -11
- metadata +77 -104
- data/examples/v2api/latency_measurement.rb +0 -139
- data/examples/v2api/local_lat.rb +0 -58
- data/examples/v2api/local_lat_poll.rb +0 -66
- data/examples/v2api/local_throughput.rb +0 -58
- data/examples/v2api/pub.rb +0 -46
- data/examples/v2api/remote_throughput.rb +0 -39
- data/examples/v2api/sub.rb +0 -74
- data/examples/v2api/throughput_measurement.rb +0 -138
- data/examples/v2api/xreqxrep_poll.rb +0 -93
- data/examples/v3api/publish_subscribe.rb +0 -82
- data/examples/v3api/remote_lat.rb +0 -71
- data/examples/v3api/reqrep_poll.rb +0 -62
- data/examples/v3api/request_response.rb +0 -40
- data/lib/ffi-rzmq/constants.rb +0 -187
- data/lib/ffi-rzmq/libc.rb +0 -19
- data/lib/ffi-rzmq/libzmq.rb +0 -283
data/lib/ffi-rzmq/message.rb
CHANGED
@@ -84,8 +84,8 @@ module ZMQ
|
|
84
84
|
# puts "value1 is #{message.value1}"
|
85
85
|
#
|
86
86
|
class Message
|
87
|
-
|
88
|
-
# Recommended way to create a standard message. A Message object is
|
87
|
+
|
88
|
+
# Recommended way to create a standard message. A Message object is
|
89
89
|
# returned upon success, nil when allocation fails.
|
90
90
|
#
|
91
91
|
def self.create message = nil
|
@@ -129,7 +129,7 @@ module ZMQ
|
|
129
129
|
data_buffer.write_string bytes, len
|
130
130
|
|
131
131
|
# use libC to call free on the data buffer; earlier versions used an
|
132
|
-
# FFI::Function here that called back into Ruby, but Rubinius won't
|
132
|
+
# FFI::Function here that called back into Ruby, but Rubinius won't
|
133
133
|
# support that and there are issues with the other runtimes too
|
134
134
|
LibZMQ.zmq_msg_init_data @pointer, data_buffer, len, LibC::Free, nil
|
135
135
|
end
|
@@ -182,42 +182,36 @@ module ZMQ
|
|
182
182
|
#
|
183
183
|
def close
|
184
184
|
rc = 0
|
185
|
-
|
185
|
+
|
186
186
|
if @pointer
|
187
187
|
rc = LibZMQ.zmq_msg_close @pointer
|
188
188
|
@pointer = nil
|
189
189
|
end
|
190
|
-
|
190
|
+
|
191
191
|
rc
|
192
192
|
end
|
193
|
-
|
193
|
+
|
194
194
|
# cache the msg size so we don't have to recalculate it when creating
|
195
195
|
# each new instance
|
196
|
-
@msg_size = LibZMQ::
|
197
|
-
|
196
|
+
@msg_size = LibZMQ::Message.size
|
197
|
+
|
198
198
|
def self.msg_size() @msg_size; end
|
199
199
|
|
200
200
|
end # class Message
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
Util.resultcode_ok?(get(MORE))
|
216
|
-
end
|
217
|
-
|
218
|
-
def set(property, value)
|
219
|
-
LibZMQ.zmq_msg_set(@pointer, property, value)
|
220
|
-
end
|
201
|
+
|
202
|
+
class Message
|
203
|
+
def get(property)
|
204
|
+
LibZMQ.zmq_msg_get(@pointer, property)
|
205
|
+
end
|
206
|
+
|
207
|
+
# Returns true if this message has additional parts coming.
|
208
|
+
#
|
209
|
+
def more?
|
210
|
+
Util.resultcode_ok?(get(MORE))
|
211
|
+
end
|
212
|
+
|
213
|
+
def set(property, value)
|
214
|
+
LibZMQ.zmq_msg_set(@pointer, property, value)
|
221
215
|
end
|
222
216
|
end
|
223
217
|
|
@@ -254,7 +248,7 @@ module ZMQ
|
|
254
248
|
#
|
255
249
|
def copy_in_bytes bytes, len
|
256
250
|
rc = super(bytes, len)
|
257
|
-
|
251
|
+
|
258
252
|
# make sure we have a way to deallocate this memory if the object goes
|
259
253
|
# out of scope
|
260
254
|
define_finalizer
|
@@ -296,7 +290,7 @@ module ZMQ
|
|
296
290
|
# cache the msg size so we don't have to recalculate it when creating
|
297
291
|
# each new instance
|
298
292
|
# need to do this again because ivars are not inheritable
|
299
|
-
@msg_size = LibZMQ::
|
293
|
+
@msg_size = LibZMQ::Message.size
|
300
294
|
|
301
295
|
end # class ManagedMessage
|
302
296
|
|
data/lib/ffi-rzmq/poll.rb
CHANGED
@@ -150,22 +150,11 @@ module ZMQ
|
|
150
150
|
# milliseconds, so we need to convert that value to
|
151
151
|
# microseconds for the library.
|
152
152
|
#
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
(timeout * 1000).to_i
|
159
|
-
end
|
160
|
-
end
|
161
|
-
else
|
162
|
-
# version3 changed units from microseconds to milliseconds
|
163
|
-
def adjust timeout
|
164
|
-
if :blocking == timeout || -1 == timeout
|
165
|
-
-1
|
166
|
-
else
|
167
|
-
timeout.to_i
|
168
|
-
end
|
153
|
+
def adjust timeout
|
154
|
+
if :blocking == timeout || -1 == timeout
|
155
|
+
-1
|
156
|
+
else
|
157
|
+
timeout.to_i
|
169
158
|
end
|
170
159
|
end
|
171
160
|
|
data/lib/ffi-rzmq/socket.rb
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
|
2
2
|
module ZMQ
|
3
3
|
|
4
|
-
|
5
|
-
|
4
|
+
class Socket
|
6
5
|
attr_reader :socket, :name
|
7
6
|
|
8
7
|
# Allocates a socket of type +type+ for sending and receiving data.
|
@@ -70,15 +69,15 @@ module ZMQ
|
|
70
69
|
|
71
70
|
context_ptr = context_ptr.pointer if context_ptr.kind_of?(ZMQ::Context)
|
72
71
|
|
73
|
-
|
72
|
+
if context_ptr.nil? || context_ptr.null?
|
73
|
+
raise ContextError.new 'zmq_socket', 0, ETERM, "Context pointer was null"
|
74
|
+
else
|
74
75
|
@socket = LibZMQ.zmq_socket context_ptr, type
|
75
76
|
if @socket && !@socket.null?
|
76
77
|
@name = SocketTypeNameMap[type]
|
77
78
|
else
|
78
79
|
raise ContextError.new 'zmq_socket', 0, ETERM, "Socket pointer was null"
|
79
80
|
end
|
80
|
-
else
|
81
|
-
raise ContextError.new 'zmq_socket', 0, ETERM, "Context pointer was null"
|
82
81
|
end
|
83
82
|
|
84
83
|
@longlong_cache = @int_cache = nil
|
@@ -118,7 +117,7 @@ module ZMQ
|
|
118
117
|
# Returns 0 when the operation completed successfully.
|
119
118
|
# Returns -1 when this operation failed.
|
120
119
|
#
|
121
|
-
# With a -1 return code, the user must check ZMQ.errno to determine the
|
120
|
+
# With a -1 return code, the user must check ZMQ::Util.errno to determine the
|
122
121
|
# cause.
|
123
122
|
#
|
124
123
|
# rc = socket.setsockopt(ZMQ::LINGER, 1_000)
|
@@ -193,7 +192,7 @@ module ZMQ
|
|
193
192
|
# depending upon the value of the socket option ZMQ::LINGER.
|
194
193
|
#
|
195
194
|
# Returns 0 upon success *or* when the socket has already been closed.
|
196
|
-
# Returns -1 when the operation fails. Check ZMQ.errno for the error code.
|
195
|
+
# Returns -1 when the operation fails. Check ZMQ::Util.errno for the error code.
|
197
196
|
#
|
198
197
|
# rc = socket.close
|
199
198
|
# puts("Given socket was invalid!") unless 0 == rc
|
@@ -215,15 +214,15 @@ module ZMQ
|
|
215
214
|
#
|
216
215
|
# +flags+ may take two values:
|
217
216
|
# * 0 (default) - blocking operation
|
218
|
-
# * ZMQ::
|
217
|
+
# * ZMQ::DONTWAIT - non-blocking operation
|
219
218
|
# * ZMQ::SNDMORE - this message is part of a multi-part message
|
220
219
|
#
|
221
220
|
# Returns 0 when the message was successfully enqueued.
|
222
221
|
# Returns -1 under two conditions.
|
223
222
|
# 1. The message could not be enqueued
|
224
|
-
# 2. When +flags+ is set with ZMQ::
|
223
|
+
# 2. When +flags+ is set with ZMQ::DONTWAIT and the socket returned EAGAIN.
|
225
224
|
#
|
226
|
-
# With a -1 return code, the user must check ZMQ.errno to determine the
|
225
|
+
# With a -1 return code, the user must check ZMQ::Util.errno to determine the
|
227
226
|
# cause.
|
228
227
|
#
|
229
228
|
def sendmsg message, flags = 0
|
@@ -233,14 +232,14 @@ module ZMQ
|
|
233
232
|
# Helper method to make a new #Message instance out of the +string+ passed
|
234
233
|
# in for transmission.
|
235
234
|
#
|
236
|
-
# +flags+ may be ZMQ::
|
235
|
+
# +flags+ may be ZMQ::DONTWAIT and ZMQ::SNDMORE.
|
237
236
|
#
|
238
237
|
# Returns 0 when the message was successfully enqueued.
|
239
238
|
# Returns -1 under two conditions.
|
240
239
|
# 1. The message could not be enqueued
|
241
|
-
# 2. When +flags+ is set with ZMQ::
|
240
|
+
# 2. When +flags+ is set with ZMQ::DONTWAIT and the socket returned EAGAIN.
|
242
241
|
#
|
243
|
-
# With a -1 return code, the user must check ZMQ.errno to determine the
|
242
|
+
# With a -1 return code, the user must check ZMQ::Util.errno to determine the
|
244
243
|
# cause.
|
245
244
|
#
|
246
245
|
def send_string string, flags = 0
|
@@ -252,14 +251,14 @@ module ZMQ
|
|
252
251
|
# passed in for transmission. Every element of +parts+ should be
|
253
252
|
# a String.
|
254
253
|
#
|
255
|
-
# +flags+ may be ZMQ::
|
254
|
+
# +flags+ may be ZMQ::DONTWAIT.
|
256
255
|
#
|
257
256
|
# Returns 0 when the messages were successfully enqueued.
|
258
257
|
# Returns -1 under two conditions.
|
259
258
|
# 1. A message could not be enqueued
|
260
|
-
# 2. When +flags+ is set with ZMQ::
|
259
|
+
# 2. When +flags+ is set with ZMQ::DONTWAIT and the socket returned EAGAIN.
|
261
260
|
#
|
262
|
-
# With a -1 return code, the user must check ZMQ.errno to determine the
|
261
|
+
# With a -1 return code, the user must check ZMQ::Util.errno to determine the
|
263
262
|
# cause.
|
264
263
|
#
|
265
264
|
def send_strings parts, flags = 0
|
@@ -270,14 +269,14 @@ module ZMQ
|
|
270
269
|
# passed in for transmission. Every element of +parts+ should be
|
271
270
|
# a Message (or subclass).
|
272
271
|
#
|
273
|
-
# +flags+ may be ZMQ::
|
272
|
+
# +flags+ may be ZMQ::DONTWAIT.
|
274
273
|
#
|
275
274
|
# Returns 0 when the messages were successfully enqueued.
|
276
275
|
# Returns -1 under two conditions.
|
277
276
|
# 1. A message could not be enqueued
|
278
|
-
# 2. When +flags+ is set with ZMQ::
|
277
|
+
# 2. When +flags+ is set with ZMQ::DONTWAIT and the socket returned EAGAIN.
|
279
278
|
#
|
280
|
-
# With a -1 return code, the user must check ZMQ.errno to determine the
|
279
|
+
# With a -1 return code, the user must check ZMQ::Util.errno to determine the
|
281
280
|
# cause.
|
282
281
|
#
|
283
282
|
def sendmsgs parts, flags = 0
|
@@ -290,9 +289,9 @@ module ZMQ
|
|
290
289
|
# Returns 0 when the message was successfully enqueued.
|
291
290
|
# Returns -1 under two conditions.
|
292
291
|
# 1. The message could not be enqueued
|
293
|
-
# 2. When +flags+ is set with ZMQ::
|
292
|
+
# 2. When +flags+ is set with ZMQ::DONTWAIT and the socket returned EAGAIN.
|
294
293
|
#
|
295
|
-
# With a -1 return code, the user must check ZMQ.errno to determine the
|
294
|
+
# With a -1 return code, the user must check ZMQ::Util.errno to determine the
|
296
295
|
# cause.
|
297
296
|
#
|
298
297
|
def send_and_close message, flags = 0
|
@@ -305,14 +304,14 @@ module ZMQ
|
|
305
304
|
#
|
306
305
|
# +flags+ may take two values:
|
307
306
|
# 0 (default) - blocking operation
|
308
|
-
# ZMQ::
|
307
|
+
# ZMQ::DONTWAIT - non-blocking operation
|
309
308
|
#
|
310
309
|
# Returns 0 when the message was successfully dequeued.
|
311
310
|
# Returns -1 under two conditions.
|
312
311
|
# 1. The message could not be dequeued
|
313
|
-
# 2. When +flags+ is set with ZMQ::
|
312
|
+
# 2. When +flags+ is set with ZMQ::DONTWAIT and the socket returned EAGAIN.
|
314
313
|
#
|
315
|
-
# With a -1 return code, the user must check ZMQ.errno to determine the
|
314
|
+
# With a -1 return code, the user must check ZMQ::Util.errno to determine the
|
316
315
|
# cause.
|
317
316
|
#
|
318
317
|
# The application code is responsible for handling the +message+ object lifecycle
|
@@ -326,14 +325,14 @@ module ZMQ
|
|
326
325
|
# Helper method to make a new #Message instance and convert its payload
|
327
326
|
# to a string.
|
328
327
|
#
|
329
|
-
# +flags+ may be ZMQ::
|
328
|
+
# +flags+ may be ZMQ::DONTWAIT.
|
330
329
|
#
|
331
330
|
# Returns 0 when the message was successfully dequeued.
|
332
331
|
# Returns -1 under two conditions.
|
333
332
|
# 1. The message could not be dequeued
|
334
|
-
# 2. When +flags+ is set with ZMQ::
|
333
|
+
# 2. When +flags+ is set with ZMQ::DONTWAIT and the socket returned EAGAIN.
|
335
334
|
#
|
336
|
-
# With a -1 return code, the user must check ZMQ.errno to determine the
|
335
|
+
# With a -1 return code, the user must check ZMQ::Util.errno to determine the
|
337
336
|
# cause.
|
338
337
|
#
|
339
338
|
# The application code is responsible for handling the +message+ object lifecycle
|
@@ -349,7 +348,7 @@ module ZMQ
|
|
349
348
|
|
350
349
|
# Receive a multipart message as a list of strings.
|
351
350
|
#
|
352
|
-
# +flag+ may be ZMQ::
|
351
|
+
# +flag+ may be ZMQ::DONTWAIT. Any other flag will be
|
353
352
|
# removed.
|
354
353
|
#
|
355
354
|
def recv_strings list, flag = 0
|
@@ -369,11 +368,11 @@ module ZMQ
|
|
369
368
|
# Receive a multipart message as an array of objects
|
370
369
|
# (by default these are instances of Message).
|
371
370
|
#
|
372
|
-
# +flag+ may be ZMQ::
|
371
|
+
# +flag+ may be ZMQ::DONTWAIT. Any other flag will be
|
373
372
|
# removed.
|
374
373
|
#
|
375
374
|
def recvmsgs list, flag = 0
|
376
|
-
flag =
|
375
|
+
flag = DONTWAIT if dontwait?(flag)
|
377
376
|
|
378
377
|
message = @receiver_klass.new
|
379
378
|
rc = recvmsg message, flag
|
@@ -426,24 +425,96 @@ module ZMQ
|
|
426
425
|
rc
|
427
426
|
end
|
428
427
|
|
428
|
+
# Get the options set on this socket.
|
429
|
+
#
|
430
|
+
# +name+ determines the socket option to request
|
431
|
+
# +array+ should be an empty array; a result of the proper type
|
432
|
+
# (numeric, string, boolean) will be inserted into
|
433
|
+
# the first position.
|
434
|
+
#
|
435
|
+
# Valid +option_name+ values:
|
436
|
+
# ZMQ::RCVMORE - true or false
|
437
|
+
# ZMQ::HWM - integer
|
438
|
+
# ZMQ::SWAP - integer
|
439
|
+
# ZMQ::AFFINITY - bitmap in an integer
|
440
|
+
# ZMQ::IDENTITY - string
|
441
|
+
# ZMQ::RATE - integer
|
442
|
+
# ZMQ::RECOVERY_IVL - integer
|
443
|
+
# ZMQ::SNDBUF - integer
|
444
|
+
# ZMQ::RCVBUF - integer
|
445
|
+
# ZMQ::FD - fd in an integer
|
446
|
+
# ZMQ::EVENTS - bitmap integer
|
447
|
+
# ZMQ::LINGER - integer measured in milliseconds
|
448
|
+
# ZMQ::RECONNECT_IVL - integer measured in milliseconds
|
449
|
+
# ZMQ::BACKLOG - integer
|
450
|
+
# ZMQ::RECOVER_IVL_MSEC - integer measured in milliseconds
|
451
|
+
# ZMQ::IPV4ONLY - integer
|
452
|
+
#
|
453
|
+
# Returns 0 when the operation completed successfully.
|
454
|
+
# Returns -1 when this operation failed.
|
455
|
+
#
|
456
|
+
# With a -1 return code, the user must check ZMQ::Util.errno to determine the
|
457
|
+
# cause.
|
458
|
+
#
|
459
|
+
# # retrieve high water mark
|
460
|
+
# array = []
|
461
|
+
# rc = socket.getsockopt(ZMQ::HWM, array)
|
462
|
+
# hwm = array.first if ZMQ::Util.resultcode_ok?(rc)
|
463
|
+
#
|
464
|
+
def getsockopt name, array
|
465
|
+
rc = __getsockopt__ name, array
|
466
|
+
|
467
|
+
if Util.resultcode_ok?(rc) && (RCVMORE == name)
|
468
|
+
# convert to boolean
|
469
|
+
array[0] = 1 == array[0]
|
470
|
+
end
|
471
|
+
|
472
|
+
rc
|
473
|
+
end
|
474
|
+
|
475
|
+
# Convenience method for getting the value of the socket IDENTITY.
|
476
|
+
#
|
477
|
+
def identity
|
478
|
+
array = []
|
479
|
+
getsockopt IDENTITY, array
|
480
|
+
array.at(0)
|
481
|
+
end
|
482
|
+
|
483
|
+
# Convenience method for setting the value of the socket IDENTITY.
|
484
|
+
#
|
485
|
+
def identity=(value)
|
486
|
+
setsockopt IDENTITY, value.to_s
|
487
|
+
end
|
488
|
+
|
489
|
+
# Disconnect the socket from the given +endpoint+.
|
490
|
+
#
|
491
|
+
def disconnect(endpoint)
|
492
|
+
LibZMQ.zmq_disconnect(socket, endpoint)
|
493
|
+
end
|
494
|
+
|
495
|
+
# Unbind the socket from the given +endpoint+.
|
496
|
+
#
|
497
|
+
def unbind(endpoint)
|
498
|
+
LibZMQ.zmq_unbind(socket, endpoint)
|
499
|
+
end
|
500
|
+
|
429
501
|
|
430
502
|
private
|
431
|
-
|
503
|
+
|
432
504
|
def send_multiple(parts, flags, method_name)
|
433
505
|
if !parts || parts.empty?
|
434
506
|
-1
|
435
507
|
else
|
436
|
-
flags =
|
508
|
+
flags = DONTWAIT if dontwait?(flags)
|
437
509
|
rc = 0
|
438
|
-
|
510
|
+
|
439
511
|
parts[0..-2].each do |part|
|
440
512
|
rc = send(method_name, part, (flags | ZMQ::SNDMORE))
|
441
513
|
break unless Util.resultcode_ok?(rc)
|
442
514
|
end
|
443
|
-
|
515
|
+
|
444
516
|
Util.resultcode_ok?(rc) ? send(method_name, parts[-1], flags) : rc
|
445
517
|
end
|
446
|
-
|
447
518
|
end
|
448
519
|
|
449
520
|
def __getsockopt__ name, array
|
@@ -485,277 +556,57 @@ module ZMQ
|
|
485
556
|
alloc_pointer(255, 255)
|
486
557
|
|
487
558
|
else
|
488
|
-
# uh oh, someone passed in an unknown option;
|
559
|
+
# uh oh, someone passed in an unknown option; return nil
|
489
560
|
@int_cache ||= alloc_pointer(:int32, 4)
|
490
561
|
end
|
491
562
|
end
|
492
563
|
|
493
|
-
def populate_option_lookup
|
494
|
-
# integer options
|
495
|
-
[EVENTS, LINGER, RCVTIMEO, SNDTIMEO, RECONNECT_IVL, FD, TYPE, BACKLOG].each { |option| @option_lookup[option] = 0 }
|
496
|
-
|
497
|
-
# long long options
|
498
|
-
[RCVMORE, AFFINITY].each { |option| @option_lookup[option] = 1 }
|
499
|
-
|
500
|
-
# string options
|
501
|
-
[SUBSCRIBE, UNSUBSCRIBE].each { |option| @option_lookup[option] = 2 }
|
502
|
-
end
|
503
|
-
|
504
564
|
def release_cache
|
505
565
|
@longlong_cache = nil
|
506
566
|
@int_cache = nil
|
507
567
|
end
|
508
568
|
|
509
569
|
def dontwait?(flags)
|
510
|
-
(
|
570
|
+
(DONTWAIT & flags) == DONTWAIT
|
511
571
|
end
|
512
572
|
alias :noblock? :dontwait?
|
513
|
-
|
573
|
+
|
514
574
|
def alloc_pointer(kind, length)
|
515
575
|
pointer = FFI::MemoryPointer.new :size_t
|
516
576
|
pointer.write_int(length)
|
517
577
|
[FFI::MemoryPointer.new(kind), pointer]
|
518
578
|
end
|
519
|
-
end # module CommonSocketBehavior
|
520
579
|
|
521
|
-
|
522
|
-
|
523
|
-
|
524
|
-
# Convenience method for getting the value of the socket IDENTITY.
|
525
|
-
#
|
526
|
-
def identity
|
527
|
-
array = []
|
528
|
-
getsockopt IDENTITY, array
|
529
|
-
array.at(0)
|
580
|
+
def __sendmsg__(socket, address, flags)
|
581
|
+
LibZMQ.zmq_sendmsg(socket, address, flags)
|
530
582
|
end
|
531
583
|
|
532
|
-
|
533
|
-
|
534
|
-
def identity=(value)
|
535
|
-
setsockopt IDENTITY, value.to_s
|
584
|
+
def __recvmsg__(socket, address, flags)
|
585
|
+
LibZMQ.zmq_recvmsg(socket, address, flags)
|
536
586
|
end
|
537
587
|
|
538
|
-
|
539
|
-
private
|
540
|
-
|
541
588
|
def populate_option_lookup
|
542
|
-
|
543
|
-
|
544
|
-
# string options
|
545
|
-
[IDENTITY].each { |option| @option_lookup[option] = 2 }
|
546
|
-
end
|
547
|
-
|
548
|
-
end # module IdentitySupport
|
549
|
-
|
550
|
-
|
551
|
-
if LibZMQ.version2?
|
552
|
-
|
553
|
-
class Socket
|
554
|
-
# Inclusion order is *important* since later modules may have a call
|
555
|
-
# to #super. We want those calls to go up the chain in a particular
|
556
|
-
# order
|
557
|
-
include CommonSocketBehavior
|
558
|
-
include IdentitySupport
|
559
|
-
|
560
|
-
# Get the options set on this socket.
|
561
|
-
#
|
562
|
-
# +name+ determines the socket option to request
|
563
|
-
# +array+ should be an empty array; a result of the proper type
|
564
|
-
# (numeric, string, boolean) will be inserted into
|
565
|
-
# the first position.
|
566
|
-
#
|
567
|
-
# Valid +option_name+ values:
|
568
|
-
# ZMQ::RCVMORE - true or false
|
569
|
-
# ZMQ::HWM - integer
|
570
|
-
# ZMQ::SWAP - integer
|
571
|
-
# ZMQ::AFFINITY - bitmap in an integer
|
572
|
-
# ZMQ::IDENTITY - string
|
573
|
-
# ZMQ::RATE - integer
|
574
|
-
# ZMQ::RECOVERY_IVL - integer
|
575
|
-
# ZMQ::MCAST_LOOP - true or false
|
576
|
-
# ZMQ::SNDBUF - integer
|
577
|
-
# ZMQ::RCVBUF - integer
|
578
|
-
# ZMQ::FD - fd in an integer
|
579
|
-
# ZMQ::EVENTS - bitmap integer
|
580
|
-
# ZMQ::LINGER - integer measured in milliseconds
|
581
|
-
# ZMQ::RECONNECT_IVL - integer measured in milliseconds
|
582
|
-
# ZMQ::BACKLOG - integer
|
583
|
-
# ZMQ::RECOVER_IVL_MSEC - integer measured in milliseconds
|
584
|
-
#
|
585
|
-
# Returns 0 when the operation completed successfully.
|
586
|
-
# Returns -1 when this operation failed.
|
587
|
-
#
|
588
|
-
# With a -1 return code, the user must check ZMQ.errno to determine the
|
589
|
-
# cause.
|
590
|
-
#
|
591
|
-
# # retrieve high water mark
|
592
|
-
# array = []
|
593
|
-
# rc = socket.getsockopt(ZMQ::HWM, array)
|
594
|
-
# hwm = array.first if ZMQ::Util.resultcode_ok?(rc)
|
595
|
-
#
|
596
|
-
def getsockopt name, array
|
597
|
-
rc = __getsockopt__ name, array
|
598
|
-
|
599
|
-
if Util.resultcode_ok?(rc) && (RCVMORE == name || MCAST_LOOP == name)
|
600
|
-
# convert to boolean
|
601
|
-
array[0] = 1 == array[0]
|
602
|
-
end
|
603
|
-
|
604
|
-
rc
|
605
|
-
end
|
606
|
-
|
589
|
+
IntegerSocketOptions.each { |option| @option_lookup[option] = 0 }
|
607
590
|
|
608
|
-
|
609
|
-
|
610
|
-
def __sendmsg__(socket, address, flags)
|
611
|
-
LibZMQ.zmq_send(socket, address, flags)
|
612
|
-
end
|
613
|
-
|
614
|
-
def __recvmsg__(socket, address, flags)
|
615
|
-
LibZMQ.zmq_recv(socket, address, flags)
|
616
|
-
end
|
617
|
-
|
618
|
-
def populate_option_lookup
|
619
|
-
super()
|
620
|
-
|
621
|
-
# integer options
|
622
|
-
[RECONNECT_IVL_MAX].each { |option| @option_lookup[option] = 0 }
|
623
|
-
|
624
|
-
# long long options
|
625
|
-
[HWM, SWAP, RATE, RECOVERY_IVL, RECOVERY_IVL_MSEC, MCAST_LOOP, SNDBUF, RCVBUF].each { |option| @option_lookup[option] = 1 }
|
626
|
-
end
|
627
|
-
|
628
|
-
# these finalizer-related methods cannot live in the CommonSocketBehavior
|
629
|
-
# module; they *must* be in the class definition directly
|
630
|
-
|
631
|
-
def define_finalizer
|
632
|
-
ObjectSpace.define_finalizer(self, self.class.close(@socket, Process.pid))
|
633
|
-
end
|
634
|
-
|
635
|
-
def remove_finalizer
|
636
|
-
ObjectSpace.undefine_finalizer self
|
637
|
-
end
|
591
|
+
LongLongSocketOptions.each { |option| @option_lookup[option] = 1 }
|
638
592
|
|
639
|
-
|
640
|
-
|
641
|
-
LibZMQ.zmq_close(socket) if socket && !socket.nil? && Process.pid == pid
|
642
|
-
end
|
643
|
-
end
|
644
|
-
end # class Socket for version2
|
645
|
-
|
646
|
-
end # LibZMQ.version2?
|
647
|
-
|
648
|
-
|
649
|
-
if LibZMQ.version3?
|
650
|
-
class Socket
|
651
|
-
include CommonSocketBehavior
|
652
|
-
include IdentitySupport
|
653
|
-
|
654
|
-
# Get the options set on this socket.
|
655
|
-
#
|
656
|
-
# +name+ determines the socket option to request
|
657
|
-
# +array+ should be an empty array; a result of the proper type
|
658
|
-
# (numeric, string, boolean) will be inserted into
|
659
|
-
# the first position.
|
660
|
-
#
|
661
|
-
# Valid +option_name+ values:
|
662
|
-
# ZMQ::RCVMORE - true or false
|
663
|
-
# ZMQ::HWM - integer
|
664
|
-
# ZMQ::SWAP - integer
|
665
|
-
# ZMQ::AFFINITY - bitmap in an integer
|
666
|
-
# ZMQ::IDENTITY - string
|
667
|
-
# ZMQ::RATE - integer
|
668
|
-
# ZMQ::RECOVERY_IVL - integer
|
669
|
-
# ZMQ::SNDBUF - integer
|
670
|
-
# ZMQ::RCVBUF - integer
|
671
|
-
# ZMQ::FD - fd in an integer
|
672
|
-
# ZMQ::EVENTS - bitmap integer
|
673
|
-
# ZMQ::LINGER - integer measured in milliseconds
|
674
|
-
# ZMQ::RECONNECT_IVL - integer measured in milliseconds
|
675
|
-
# ZMQ::BACKLOG - integer
|
676
|
-
# ZMQ::RECOVER_IVL_MSEC - integer measured in milliseconds
|
677
|
-
# ZMQ::IPV4ONLY - integer
|
678
|
-
#
|
679
|
-
# Returns 0 when the operation completed successfully.
|
680
|
-
# Returns -1 when this operation failed.
|
681
|
-
#
|
682
|
-
# With a -1 return code, the user must check ZMQ.errno to determine the
|
683
|
-
# cause.
|
684
|
-
#
|
685
|
-
# # retrieve high water mark
|
686
|
-
# array = []
|
687
|
-
# rc = socket.getsockopt(ZMQ::HWM, array)
|
688
|
-
# hwm = array.first if ZMQ::Util.resultcode_ok?(rc)
|
689
|
-
#
|
690
|
-
def getsockopt name, array
|
691
|
-
rc = __getsockopt__ name, array
|
692
|
-
|
693
|
-
if Util.resultcode_ok?(rc) && (RCVMORE == name)
|
694
|
-
# convert to boolean
|
695
|
-
array[0] = 1 == array[0]
|
696
|
-
end
|
697
|
-
|
698
|
-
rc
|
699
|
-
end
|
700
|
-
|
701
|
-
# Version3 only
|
702
|
-
#
|
703
|
-
# Disconnect the socket from the given +endpoint+.
|
704
|
-
#
|
705
|
-
def disconnect(endpoint)
|
706
|
-
LibZMQ.zmq_disconnect(socket, endpoint)
|
707
|
-
end
|
708
|
-
|
709
|
-
# Version3 only
|
710
|
-
#
|
711
|
-
# Unbind the socket from the given +endpoint+.
|
712
|
-
#
|
713
|
-
def unbind(endpoint)
|
714
|
-
LibZMQ.zmq_unbind(socket, endpoint)
|
715
|
-
end
|
716
|
-
|
717
|
-
|
718
|
-
private
|
719
|
-
|
720
|
-
def __sendmsg__(socket, address, flags)
|
721
|
-
LibZMQ.zmq_sendmsg(socket, address, flags)
|
722
|
-
end
|
723
|
-
|
724
|
-
def __recvmsg__(socket, address, flags)
|
725
|
-
LibZMQ.zmq_recvmsg(socket, address, flags)
|
726
|
-
end
|
727
|
-
|
728
|
-
def populate_option_lookup
|
729
|
-
super()
|
730
|
-
|
731
|
-
# integer options
|
732
|
-
[RECONNECT_IVL_MAX, RCVHWM, SNDHWM, RATE, RECOVERY_IVL, SNDBUF, RCVBUF, IPV4ONLY,
|
733
|
-
ROUTER_BEHAVIOR, TCP_KEEPALIVE, TCP_KEEPALIVE_CNT,
|
734
|
-
TCP_KEEPALIVE_IDLE, TCP_KEEPALIVE_INTVL, TCP_ACCEPT_FILTER, MULTICAST_HOPS
|
735
|
-
].each { |option| @option_lookup[option] = 0 }
|
736
|
-
|
737
|
-
# long long options
|
738
|
-
[MAXMSGSIZE].each { |option| @option_lookup[option] = 1 }
|
739
|
-
|
740
|
-
# string options
|
741
|
-
[LAST_ENDPOINT].each { |option| @option_lookup[option] = 2 }
|
742
|
-
end
|
593
|
+
StringSocketOptions.each { |option| @option_lookup[option] = 2 }
|
594
|
+
end
|
743
595
|
|
744
|
-
|
745
|
-
|
596
|
+
# these finalizer-related methods cannot live in the CommonSocketBehavior
|
597
|
+
# module; they *must* be in the class definition directly
|
746
598
|
|
747
|
-
|
748
|
-
|
749
|
-
|
599
|
+
def define_finalizer
|
600
|
+
ObjectSpace.define_finalizer(self, self.class.close(@socket, Process.pid))
|
601
|
+
end
|
750
602
|
|
751
|
-
|
752
|
-
|
753
|
-
|
603
|
+
def remove_finalizer
|
604
|
+
ObjectSpace.undefine_finalizer self
|
605
|
+
end
|
754
606
|
|
755
|
-
|
756
|
-
|
757
|
-
|
758
|
-
|
759
|
-
end # LibZMQ.version3?
|
607
|
+
def self.close socket, pid
|
608
|
+
Proc.new { LibZMQ.zmq_close socket if Process.pid == pid }
|
609
|
+
end
|
610
|
+
end # Socket
|
760
611
|
|
761
612
|
end # module ZMQ
|