ffi-rzmq 1.0.3 → 2.0.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.travis.yml +5 -6
- data/AUTHORS.txt +7 -1
- data/History.txt +79 -0
- data/README.rdoc +67 -29
- data/Rakefile +15 -0
- 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/repreq_over_curve.rb +60 -0
- 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/context.rb +26 -54
- data/lib/ffi-rzmq/device.rb +8 -4
- data/lib/ffi-rzmq/exceptions.rb +3 -0
- data/lib/ffi-rzmq/message.rb +24 -30
- data/lib/ffi-rzmq/poll.rb +5 -16
- data/lib/ffi-rzmq/poll_item.rb +0 -1
- data/lib/ffi-rzmq/socket.rb +132 -282
- data/lib/ffi-rzmq/util.rb +28 -36
- data/lib/ffi-rzmq/version.rb +1 -1
- data/lib/ffi-rzmq.rb +3 -3
- data/lib/io_extensions.rb +1 -1
- data/spec/context_spec.rb +18 -23
- data/spec/device_spec.rb +13 -12
- data/spec/message_spec.rb +13 -13
- data/spec/multipart_spec.rb +11 -11
- data/spec/nonblocking_recv_spec.rb +22 -22
- data/spec/poll_spec.rb +49 -49
- data/spec/pushpull_spec.rb +12 -11
- data/spec/reqrep_spec.rb +11 -11
- data/spec/socket_spec.rb +110 -197
- data/spec/spec_helper.rb +3 -11
- data/spec/support/generate_keys_and_certs.rb +41 -0
- data/spec/support/test.crt +26 -13
- data/spec/support/test.key +49 -13
- data/spec/util_spec.rb +29 -0
- data/travis_build_script.sh +27 -0
- metadata +83 -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/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)
|
@@ -136,15 +135,14 @@ module ZMQ
|
|
136
135
|
pointer.write_int value
|
137
136
|
|
138
137
|
elsif 2 == @option_lookup[name]
|
138
|
+
# Strings are treated as pointers by FFI so we'll just pass it through
|
139
139
|
length ||= value.size
|
140
|
+
pointer = value
|
140
141
|
|
141
|
-
# note: not checking errno for failed memory allocations :(
|
142
|
-
pointer = LibC.malloc length
|
143
|
-
pointer.write_string value
|
144
142
|
end
|
145
143
|
|
146
144
|
rc = LibZMQ.zmq_setsockopt @socket, name, pointer, length
|
147
|
-
LibC.free(pointer) unless pointer.nil? || pointer.null?
|
145
|
+
LibC.free(pointer) unless pointer.is_a?(String) || pointer.nil? || pointer.null?
|
148
146
|
rc
|
149
147
|
end
|
150
148
|
|
@@ -193,7 +191,7 @@ module ZMQ
|
|
193
191
|
# depending upon the value of the socket option ZMQ::LINGER.
|
194
192
|
#
|
195
193
|
# 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.
|
194
|
+
# Returns -1 when the operation fails. Check ZMQ::Util.errno for the error code.
|
197
195
|
#
|
198
196
|
# rc = socket.close
|
199
197
|
# puts("Given socket was invalid!") unless 0 == rc
|
@@ -215,15 +213,15 @@ module ZMQ
|
|
215
213
|
#
|
216
214
|
# +flags+ may take two values:
|
217
215
|
# * 0 (default) - blocking operation
|
218
|
-
# * ZMQ::
|
216
|
+
# * ZMQ::DONTWAIT - non-blocking operation
|
219
217
|
# * ZMQ::SNDMORE - this message is part of a multi-part message
|
220
218
|
#
|
221
219
|
# Returns 0 when the message was successfully enqueued.
|
222
220
|
# Returns -1 under two conditions.
|
223
221
|
# 1. The message could not be enqueued
|
224
|
-
# 2. When +flags+ is set with ZMQ::
|
222
|
+
# 2. When +flags+ is set with ZMQ::DONTWAIT and the socket returned EAGAIN.
|
225
223
|
#
|
226
|
-
# With a -1 return code, the user must check ZMQ.errno to determine the
|
224
|
+
# With a -1 return code, the user must check ZMQ::Util.errno to determine the
|
227
225
|
# cause.
|
228
226
|
#
|
229
227
|
def sendmsg message, flags = 0
|
@@ -233,14 +231,14 @@ module ZMQ
|
|
233
231
|
# Helper method to make a new #Message instance out of the +string+ passed
|
234
232
|
# in for transmission.
|
235
233
|
#
|
236
|
-
# +flags+ may be ZMQ::
|
234
|
+
# +flags+ may be ZMQ::DONTWAIT and ZMQ::SNDMORE.
|
237
235
|
#
|
238
236
|
# Returns 0 when the message was successfully enqueued.
|
239
237
|
# Returns -1 under two conditions.
|
240
238
|
# 1. The message could not be enqueued
|
241
|
-
# 2. When +flags+ is set with ZMQ::
|
239
|
+
# 2. When +flags+ is set with ZMQ::DONTWAIT and the socket returned EAGAIN.
|
242
240
|
#
|
243
|
-
# With a -1 return code, the user must check ZMQ.errno to determine the
|
241
|
+
# With a -1 return code, the user must check ZMQ::Util.errno to determine the
|
244
242
|
# cause.
|
245
243
|
#
|
246
244
|
def send_string string, flags = 0
|
@@ -252,14 +250,14 @@ module ZMQ
|
|
252
250
|
# passed in for transmission. Every element of +parts+ should be
|
253
251
|
# a String.
|
254
252
|
#
|
255
|
-
# +flags+ may be ZMQ::
|
253
|
+
# +flags+ may be ZMQ::DONTWAIT.
|
256
254
|
#
|
257
255
|
# Returns 0 when the messages were successfully enqueued.
|
258
256
|
# Returns -1 under two conditions.
|
259
257
|
# 1. A message could not be enqueued
|
260
|
-
# 2. When +flags+ is set with ZMQ::
|
258
|
+
# 2. When +flags+ is set with ZMQ::DONTWAIT and the socket returned EAGAIN.
|
261
259
|
#
|
262
|
-
# With a -1 return code, the user must check ZMQ.errno to determine the
|
260
|
+
# With a -1 return code, the user must check ZMQ::Util.errno to determine the
|
263
261
|
# cause.
|
264
262
|
#
|
265
263
|
def send_strings parts, flags = 0
|
@@ -270,14 +268,14 @@ module ZMQ
|
|
270
268
|
# passed in for transmission. Every element of +parts+ should be
|
271
269
|
# a Message (or subclass).
|
272
270
|
#
|
273
|
-
# +flags+ may be ZMQ::
|
271
|
+
# +flags+ may be ZMQ::DONTWAIT.
|
274
272
|
#
|
275
273
|
# Returns 0 when the messages were successfully enqueued.
|
276
274
|
# Returns -1 under two conditions.
|
277
275
|
# 1. A message could not be enqueued
|
278
|
-
# 2. When +flags+ is set with ZMQ::
|
276
|
+
# 2. When +flags+ is set with ZMQ::DONTWAIT and the socket returned EAGAIN.
|
279
277
|
#
|
280
|
-
# With a -1 return code, the user must check ZMQ.errno to determine the
|
278
|
+
# With a -1 return code, the user must check ZMQ::Util.errno to determine the
|
281
279
|
# cause.
|
282
280
|
#
|
283
281
|
def sendmsgs parts, flags = 0
|
@@ -290,9 +288,9 @@ module ZMQ
|
|
290
288
|
# Returns 0 when the message was successfully enqueued.
|
291
289
|
# Returns -1 under two conditions.
|
292
290
|
# 1. The message could not be enqueued
|
293
|
-
# 2. When +flags+ is set with ZMQ::
|
291
|
+
# 2. When +flags+ is set with ZMQ::DONTWAIT and the socket returned EAGAIN.
|
294
292
|
#
|
295
|
-
# With a -1 return code, the user must check ZMQ.errno to determine the
|
293
|
+
# With a -1 return code, the user must check ZMQ::Util.errno to determine the
|
296
294
|
# cause.
|
297
295
|
#
|
298
296
|
def send_and_close message, flags = 0
|
@@ -305,14 +303,14 @@ module ZMQ
|
|
305
303
|
#
|
306
304
|
# +flags+ may take two values:
|
307
305
|
# 0 (default) - blocking operation
|
308
|
-
# ZMQ::
|
306
|
+
# ZMQ::DONTWAIT - non-blocking operation
|
309
307
|
#
|
310
308
|
# Returns 0 when the message was successfully dequeued.
|
311
309
|
# Returns -1 under two conditions.
|
312
310
|
# 1. The message could not be dequeued
|
313
|
-
# 2. When +flags+ is set with ZMQ::
|
311
|
+
# 2. When +flags+ is set with ZMQ::DONTWAIT and the socket returned EAGAIN.
|
314
312
|
#
|
315
|
-
# With a -1 return code, the user must check ZMQ.errno to determine the
|
313
|
+
# With a -1 return code, the user must check ZMQ::Util.errno to determine the
|
316
314
|
# cause.
|
317
315
|
#
|
318
316
|
# The application code is responsible for handling the +message+ object lifecycle
|
@@ -326,14 +324,14 @@ module ZMQ
|
|
326
324
|
# Helper method to make a new #Message instance and convert its payload
|
327
325
|
# to a string.
|
328
326
|
#
|
329
|
-
# +flags+ may be ZMQ::
|
327
|
+
# +flags+ may be ZMQ::DONTWAIT.
|
330
328
|
#
|
331
329
|
# Returns 0 when the message was successfully dequeued.
|
332
330
|
# Returns -1 under two conditions.
|
333
331
|
# 1. The message could not be dequeued
|
334
|
-
# 2. When +flags+ is set with ZMQ::
|
332
|
+
# 2. When +flags+ is set with ZMQ::DONTWAIT and the socket returned EAGAIN.
|
335
333
|
#
|
336
|
-
# With a -1 return code, the user must check ZMQ.errno to determine the
|
334
|
+
# With a -1 return code, the user must check ZMQ::Util.errno to determine the
|
337
335
|
# cause.
|
338
336
|
#
|
339
337
|
# The application code is responsible for handling the +message+ object lifecycle
|
@@ -349,7 +347,7 @@ module ZMQ
|
|
349
347
|
|
350
348
|
# Receive a multipart message as a list of strings.
|
351
349
|
#
|
352
|
-
# +flag+ may be ZMQ::
|
350
|
+
# +flag+ may be ZMQ::DONTWAIT. Any other flag will be
|
353
351
|
# removed.
|
354
352
|
#
|
355
353
|
def recv_strings list, flag = 0
|
@@ -369,11 +367,11 @@ module ZMQ
|
|
369
367
|
# Receive a multipart message as an array of objects
|
370
368
|
# (by default these are instances of Message).
|
371
369
|
#
|
372
|
-
# +flag+ may be ZMQ::
|
370
|
+
# +flag+ may be ZMQ::DONTWAIT. Any other flag will be
|
373
371
|
# removed.
|
374
372
|
#
|
375
373
|
def recvmsgs list, flag = 0
|
376
|
-
flag =
|
374
|
+
flag = DONTWAIT if dontwait?(flag)
|
377
375
|
|
378
376
|
message = @receiver_klass.new
|
379
377
|
rc = recvmsg message, flag
|
@@ -426,24 +424,96 @@ module ZMQ
|
|
426
424
|
rc
|
427
425
|
end
|
428
426
|
|
427
|
+
# Get the options set on this socket.
|
428
|
+
#
|
429
|
+
# +name+ determines the socket option to request
|
430
|
+
# +array+ should be an empty array; a result of the proper type
|
431
|
+
# (numeric, string, boolean) will be inserted into
|
432
|
+
# the first position.
|
433
|
+
#
|
434
|
+
# Valid +option_name+ values:
|
435
|
+
# ZMQ::RCVMORE - true or false
|
436
|
+
# ZMQ::HWM - integer
|
437
|
+
# ZMQ::SWAP - integer
|
438
|
+
# ZMQ::AFFINITY - bitmap in an integer
|
439
|
+
# ZMQ::IDENTITY - string
|
440
|
+
# ZMQ::RATE - integer
|
441
|
+
# ZMQ::RECOVERY_IVL - integer
|
442
|
+
# ZMQ::SNDBUF - integer
|
443
|
+
# ZMQ::RCVBUF - integer
|
444
|
+
# ZMQ::FD - fd in an integer
|
445
|
+
# ZMQ::EVENTS - bitmap integer
|
446
|
+
# ZMQ::LINGER - integer measured in milliseconds
|
447
|
+
# ZMQ::RECONNECT_IVL - integer measured in milliseconds
|
448
|
+
# ZMQ::BACKLOG - integer
|
449
|
+
# ZMQ::RECOVER_IVL_MSEC - integer measured in milliseconds
|
450
|
+
# ZMQ::IPV4ONLY - integer
|
451
|
+
#
|
452
|
+
# Returns 0 when the operation completed successfully.
|
453
|
+
# Returns -1 when this operation failed.
|
454
|
+
#
|
455
|
+
# With a -1 return code, the user must check ZMQ::Util.errno to determine the
|
456
|
+
# cause.
|
457
|
+
#
|
458
|
+
# # retrieve high water mark
|
459
|
+
# array = []
|
460
|
+
# rc = socket.getsockopt(ZMQ::HWM, array)
|
461
|
+
# hwm = array.first if ZMQ::Util.resultcode_ok?(rc)
|
462
|
+
#
|
463
|
+
def getsockopt name, array
|
464
|
+
rc = __getsockopt__ name, array
|
465
|
+
|
466
|
+
if Util.resultcode_ok?(rc) && (RCVMORE == name)
|
467
|
+
# convert to boolean
|
468
|
+
array[0] = 1 == array[0]
|
469
|
+
end
|
470
|
+
|
471
|
+
rc
|
472
|
+
end
|
473
|
+
|
474
|
+
# Convenience method for getting the value of the socket IDENTITY.
|
475
|
+
#
|
476
|
+
def identity
|
477
|
+
array = []
|
478
|
+
getsockopt IDENTITY, array
|
479
|
+
array.at(0)
|
480
|
+
end
|
481
|
+
|
482
|
+
# Convenience method for setting the value of the socket IDENTITY.
|
483
|
+
#
|
484
|
+
def identity=(value)
|
485
|
+
setsockopt IDENTITY, value.to_s
|
486
|
+
end
|
487
|
+
|
488
|
+
# Disconnect the socket from the given +endpoint+.
|
489
|
+
#
|
490
|
+
def disconnect(endpoint)
|
491
|
+
LibZMQ.zmq_disconnect(socket, endpoint)
|
492
|
+
end
|
493
|
+
|
494
|
+
# Unbind the socket from the given +endpoint+.
|
495
|
+
#
|
496
|
+
def unbind(endpoint)
|
497
|
+
LibZMQ.zmq_unbind(socket, endpoint)
|
498
|
+
end
|
499
|
+
|
429
500
|
|
430
501
|
private
|
431
|
-
|
502
|
+
|
432
503
|
def send_multiple(parts, flags, method_name)
|
433
504
|
if !parts || parts.empty?
|
434
505
|
-1
|
435
506
|
else
|
436
|
-
flags =
|
507
|
+
flags = DONTWAIT if dontwait?(flags)
|
437
508
|
rc = 0
|
438
|
-
|
509
|
+
|
439
510
|
parts[0..-2].each do |part|
|
440
511
|
rc = send(method_name, part, (flags | ZMQ::SNDMORE))
|
441
512
|
break unless Util.resultcode_ok?(rc)
|
442
513
|
end
|
443
|
-
|
514
|
+
|
444
515
|
Util.resultcode_ok?(rc) ? send(method_name, parts[-1], flags) : rc
|
445
516
|
end
|
446
|
-
|
447
517
|
end
|
448
518
|
|
449
519
|
def __getsockopt__ name, array
|
@@ -485,277 +555,57 @@ module ZMQ
|
|
485
555
|
alloc_pointer(255, 255)
|
486
556
|
|
487
557
|
else
|
488
|
-
# uh oh, someone passed in an unknown option;
|
558
|
+
# uh oh, someone passed in an unknown option; return nil
|
489
559
|
@int_cache ||= alloc_pointer(:int32, 4)
|
490
560
|
end
|
491
561
|
end
|
492
562
|
|
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
563
|
def release_cache
|
505
564
|
@longlong_cache = nil
|
506
565
|
@int_cache = nil
|
507
566
|
end
|
508
567
|
|
509
568
|
def dontwait?(flags)
|
510
|
-
(
|
569
|
+
(DONTWAIT & flags) == DONTWAIT
|
511
570
|
end
|
512
571
|
alias :noblock? :dontwait?
|
513
|
-
|
572
|
+
|
514
573
|
def alloc_pointer(kind, length)
|
515
574
|
pointer = FFI::MemoryPointer.new :size_t
|
516
575
|
pointer.write_int(length)
|
517
576
|
[FFI::MemoryPointer.new(kind), pointer]
|
518
577
|
end
|
519
|
-
end # module CommonSocketBehavior
|
520
578
|
|
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)
|
579
|
+
def __sendmsg__(socket, address, flags)
|
580
|
+
LibZMQ.zmq_sendmsg(socket, address, flags)
|
530
581
|
end
|
531
582
|
|
532
|
-
|
533
|
-
|
534
|
-
def identity=(value)
|
535
|
-
setsockopt IDENTITY, value.to_s
|
583
|
+
def __recvmsg__(socket, address, flags)
|
584
|
+
LibZMQ.zmq_recvmsg(socket, address, flags)
|
536
585
|
end
|
537
586
|
|
538
|
-
|
539
|
-
private
|
540
|
-
|
541
587
|
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
|
-
|
588
|
+
IntegerSocketOptions.each { |option| @option_lookup[option] = 0 }
|
607
589
|
|
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
|
590
|
+
LongLongSocketOptions.each { |option| @option_lookup[option] = 1 }
|
638
591
|
|
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
|
592
|
+
StringSocketOptions.each { |option| @option_lookup[option] = 2 }
|
593
|
+
end
|
743
594
|
|
744
|
-
|
745
|
-
|
595
|
+
# these finalizer-related methods cannot live in the CommonSocketBehavior
|
596
|
+
# module; they *must* be in the class definition directly
|
746
597
|
|
747
|
-
|
748
|
-
|
749
|
-
|
598
|
+
def define_finalizer
|
599
|
+
ObjectSpace.define_finalizer(self, self.class.close(@socket, Process.pid))
|
600
|
+
end
|
750
601
|
|
751
|
-
|
752
|
-
|
753
|
-
|
602
|
+
def remove_finalizer
|
603
|
+
ObjectSpace.undefine_finalizer self
|
604
|
+
end
|
754
605
|
|
755
|
-
|
756
|
-
|
757
|
-
|
758
|
-
|
759
|
-
end # LibZMQ.version3?
|
606
|
+
def self.close socket, pid
|
607
|
+
Proc.new { LibZMQ.zmq_close socket if Process.pid == pid }
|
608
|
+
end
|
609
|
+
end # Socket
|
760
610
|
|
761
611
|
end # module ZMQ
|