ffi-rzmq 1.0.3 → 2.0.4
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 +45 -0
- data/README.rdoc +58 -28
- 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.rb +2 -3
- data/lib/ffi-rzmq/context.rb +25 -53
- 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/socket.rb +132 -282
- data/lib/ffi-rzmq/util.rb +28 -36
- data/lib/ffi-rzmq/version.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 +109 -196
- data/spec/spec_helper.rb +3 -11
- data/spec/util_spec.rb +29 -0
- metadata +80 -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
@@ -1,6 +1,5 @@
|
|
1
1
|
|
2
|
-
require File.join(File.dirname(__FILE__), '..', '
|
3
|
-
|
2
|
+
require File.join(File.dirname(__FILE__), '..', 'lib', 'ffi-rzmq')
|
4
3
|
|
5
4
|
def assert(rc)
|
6
5
|
raise "Last API call failed at #{caller(1)}" unless rc >= 0
|
@@ -38,7 +37,7 @@ until @done do
|
|
38
37
|
payload = "#{ '3' * 1024 }"
|
39
38
|
|
40
39
|
puts "sending payload nonblocking"
|
41
|
-
assert(s1.send_string(payload, ZMQ::
|
40
|
+
assert(s1.send_string(payload, ZMQ::DONTWAIT))
|
42
41
|
@unsent = false
|
43
42
|
end
|
44
43
|
|
@@ -46,7 +45,7 @@ until @done do
|
|
46
45
|
if Time.now - start_time > 1
|
47
46
|
poller.readables.each do |sock|
|
48
47
|
received_msg = ''
|
49
|
-
assert(sock.recv_string(received_msg, ZMQ::
|
48
|
+
assert(sock.recv_string(received_msg, ZMQ::DONTWAIT))
|
50
49
|
|
51
50
|
puts "message received [#{received_msg}]"
|
52
51
|
@done = true
|
@@ -1,11 +1,10 @@
|
|
1
1
|
|
2
|
-
require File.join(File.dirname(__FILE__), '..', '
|
2
|
+
require File.join(File.dirname(__FILE__), '..', 'lib', 'ffi-rzmq')
|
3
3
|
|
4
4
|
#if ARGV.length != 3
|
5
5
|
# puts "usage: ruby local_throughtput.rb <bind-to> <message-size> <message-count>"
|
6
6
|
# Process.exit
|
7
7
|
#end
|
8
|
-
p ZMQ::Util.version
|
9
8
|
|
10
9
|
def assert(rc)
|
11
10
|
raise "Last API call failed at #{caller(1)}" unless rc >= 0
|
@@ -1,6 +1,5 @@
|
|
1
1
|
|
2
|
-
require File.join(File.dirname(__FILE__), '..', '
|
3
|
-
|
2
|
+
require File.join(File.dirname(__FILE__), '..', 'lib', 'ffi-rzmq')
|
4
3
|
|
5
4
|
def assert(rc)
|
6
5
|
raise "Last API call failed at #{caller(1)}" unless rc >= 0
|
@@ -43,7 +42,7 @@ until @done do
|
|
43
42
|
|
44
43
|
5.times do |i|
|
45
44
|
payload = "#{ i.to_s * 40 }"
|
46
|
-
assert(s1.send_string(payload, ZMQ::
|
45
|
+
assert(s1.send_string(payload, ZMQ::DONTWAIT))
|
47
46
|
end
|
48
47
|
@unsent = false
|
49
48
|
end
|
@@ -54,12 +53,12 @@ until @done do
|
|
54
53
|
|
55
54
|
if sock.identity =~ /xrep/
|
56
55
|
routing_info = ''
|
57
|
-
assert(sock.recv_string(routing_info, ZMQ::
|
56
|
+
assert(sock.recv_string(routing_info, ZMQ::DONTWAIT))
|
58
57
|
puts "routing_info received [#{routing_info}] on socket.identity [#{sock.identity}]"
|
59
58
|
else
|
60
59
|
routing_info = nil
|
61
60
|
received_msg = ''
|
62
|
-
assert(sock.recv_string(received_msg, ZMQ::
|
61
|
+
assert(sock.recv_string(received_msg, ZMQ::DONTWAIT))
|
63
62
|
|
64
63
|
# skip to the next iteration if received_msg is nil; that means we got an EAGAIN
|
65
64
|
next unless received_msg
|
@@ -68,13 +67,13 @@ until @done do
|
|
68
67
|
|
69
68
|
while sock.more_parts? do
|
70
69
|
received_msg = ''
|
71
|
-
assert(sock.recv_string(received_msg, ZMQ::
|
70
|
+
assert(sock.recv_string(received_msg, ZMQ::DONTWAIT))
|
72
71
|
|
73
72
|
puts "message received [#{received_msg}]"
|
74
73
|
end
|
75
74
|
|
76
75
|
puts "kick back a reply"
|
77
|
-
assert(sock.send_string(routing_info, ZMQ::SNDMORE | ZMQ::
|
76
|
+
assert(sock.send_string(routing_info, ZMQ::SNDMORE | ZMQ::DONTWAIT)) if routing_info
|
78
77
|
time = Time.now.strftime "%Y-%m-%dT%H:%M:%S.#{Time.now.usec}"
|
79
78
|
reply = "reply " + sock.identity.upcase + " #{time}"
|
80
79
|
puts "sent reply [#{reply}], #{time}"
|
data/ffi-rzmq.gemspec
CHANGED
@@ -11,9 +11,9 @@ Gem::Specification.new do |s|
|
|
11
11
|
s.summary = %q{This gem wraps the ZeroMQ (0mq) networking library using Ruby FFI (foreign function interface).}
|
12
12
|
s.description = %q{This gem wraps the ZeroMQ networking library using the ruby FFI (foreign
|
13
13
|
function interface). It's a pure ruby wrapper so this gem can be loaded
|
14
|
-
and run by any ruby runtime that supports FFI. That's all of the major ones -
|
15
|
-
MRI, Rubinius and JRuby.}
|
14
|
+
and run by any ruby runtime that supports FFI. That's all of the major ones - MRI, Rubinius and JRuby.}
|
16
15
|
|
16
|
+
s.license = 'MIT'
|
17
17
|
s.rubyforge_project = "ffi-rzmq"
|
18
18
|
|
19
19
|
s.files = `git ls-files`.split("\n")
|
@@ -21,7 +21,7 @@ MRI, Rubinius and JRuby.}
|
|
21
21
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
22
22
|
s.require_paths = ["lib"]
|
23
23
|
|
24
|
-
s.add_runtime_dependency "ffi"
|
25
|
-
s.add_development_dependency "rspec", ["~> 2.
|
24
|
+
s.add_runtime_dependency "ffi-rzmq-core", [">= 1.0.1"]
|
25
|
+
s.add_development_dependency "rspec", ["~> 2.14"]
|
26
26
|
s.add_development_dependency "rake"
|
27
27
|
end
|
data/lib/ffi-rzmq.rb
CHANGED
@@ -63,10 +63,9 @@ end # module ZMQ
|
|
63
63
|
# some code is conditionalized based upon what ruby engine we are
|
64
64
|
# executing
|
65
65
|
|
66
|
-
require 'ffi'
|
66
|
+
require 'ffi-rzmq-core'
|
67
67
|
|
68
68
|
# the order of files is important
|
69
|
-
|
70
|
-
%w(libc libzmq constants util exceptions context message socket poll_items poll_item poll device).each do |file|
|
69
|
+
%w(util exceptions context message socket poll_items poll_item poll device version).each do |file|
|
71
70
|
require ZMQ.libpath(['ffi-rzmq', file])
|
72
71
|
end
|
data/lib/ffi-rzmq/context.rb
CHANGED
@@ -47,44 +47,29 @@ module ZMQ
|
|
47
47
|
|
48
48
|
# Use the factory method Context#create to make contexts.
|
49
49
|
#
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
end
|
54
|
-
|
55
|
-
def initialize io_threads = 1
|
56
|
-
@io_threads = io_threads
|
57
|
-
@context = LibZMQ.zmq_init io_threads
|
58
|
-
ZMQ::Util.error_check 'zmq_init', (@context.nil? || @context.null?) ? -1 : 0
|
59
|
-
|
60
|
-
define_finalizer
|
61
|
-
end
|
62
|
-
elsif LibZMQ.version3?
|
50
|
+
def self.create(opts = {})
|
51
|
+
new(opts) rescue nil
|
52
|
+
end
|
63
53
|
|
64
|
-
|
65
|
-
|
54
|
+
def initialize(opts = {})
|
55
|
+
if opts.respond_to?(:empty?)
|
56
|
+
@io_threads = opts[:io_threads] || IO_THREADS_DFLT
|
57
|
+
@max_sockets = opts[:max_sockets] || MAX_SOCKETS_DFLT
|
58
|
+
else
|
59
|
+
@io_threads = opts || 1
|
60
|
+
@max_sockets = MAX_SOCKETS_DFLT
|
66
61
|
end
|
67
62
|
|
68
|
-
|
69
|
-
|
70
|
-
@io_threads = opts[:io_threads] || IO_THREADS_DFLT
|
71
|
-
@max_sockets = opts[:max_sockets] || MAX_SOCKETS_DFLT
|
72
|
-
else
|
73
|
-
@io_threads = opts || 1
|
74
|
-
@max_sockets = MAX_SOCKETS_DFLT
|
75
|
-
end
|
76
|
-
|
77
|
-
@context = LibZMQ.zmq_ctx_new
|
78
|
-
ZMQ::Util.error_check 'zmq_ctx_new', (@context.nil? || @context.null?) ? -1 : 0
|
63
|
+
@context = LibZMQ.zmq_ctx_new
|
64
|
+
ZMQ::Util.error_check 'zmq_ctx_new', (@context.nil? || @context.null?) ? -1 : 0
|
79
65
|
|
80
|
-
|
81
|
-
|
66
|
+
rc = LibZMQ.zmq_ctx_set(@context, ZMQ::IO_THREADS, @io_threads)
|
67
|
+
ZMQ::Util.error_check 'zmq_ctx_set', rc
|
82
68
|
|
83
|
-
|
84
|
-
|
69
|
+
rc = LibZMQ.zmq_ctx_set(@context, ZMQ::MAX_SOCKETS, @max_sockets)
|
70
|
+
ZMQ::Util.error_check 'zmq_ctx_set', rc
|
85
71
|
|
86
|
-
|
87
|
-
end
|
72
|
+
define_finalizer
|
88
73
|
end
|
89
74
|
|
90
75
|
# Call to release the context and any remaining data associated
|
@@ -94,27 +79,14 @@ module ZMQ
|
|
94
79
|
#
|
95
80
|
# Returns 0 for success, -1 for failure.
|
96
81
|
#
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
0
|
106
|
-
end
|
107
|
-
end
|
108
|
-
elsif LibZMQ.version3?
|
109
|
-
def terminate
|
110
|
-
unless @context.nil? || @context.null?
|
111
|
-
remove_finalizer
|
112
|
-
rc = LibZMQ.zmq_ctx_destroy(@context)
|
113
|
-
@context = nil
|
114
|
-
rc
|
115
|
-
else
|
116
|
-
0
|
117
|
-
end
|
82
|
+
def terminate
|
83
|
+
unless @context.nil? || @context.null?
|
84
|
+
remove_finalizer
|
85
|
+
rc = LibZMQ.zmq_ctx_destroy(@context)
|
86
|
+
@context = nil
|
87
|
+
rc
|
88
|
+
else
|
89
|
+
0
|
118
90
|
end
|
119
91
|
end
|
120
92
|
|
data/lib/ffi-rzmq/device.rb
CHANGED
@@ -3,10 +3,10 @@ module ZMQ
|
|
3
3
|
class Device
|
4
4
|
attr_reader :device
|
5
5
|
|
6
|
-
def self.create(
|
6
|
+
def self.create(frontend, backend, capture=nil)
|
7
7
|
dev = nil
|
8
8
|
begin
|
9
|
-
dev = new(
|
9
|
+
dev = new(frontend, backend, capture)
|
10
10
|
rescue ArgumentError
|
11
11
|
dev = nil
|
12
12
|
end
|
@@ -14,15 +14,19 @@ module ZMQ
|
|
14
14
|
dev
|
15
15
|
end
|
16
16
|
|
17
|
-
def initialize(
|
17
|
+
def initialize(frontend, backend, capture=nil)
|
18
18
|
[["frontend", frontend], ["backend", backend]].each do |name, socket|
|
19
19
|
unless socket.is_a?(ZMQ::Socket)
|
20
20
|
raise ArgumentError, "Expected a ZMQ::Socket, not a #{socket.class} as the #{name}"
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
|
-
LibZMQ.
|
24
|
+
LibZMQ.zmq_proxy(frontend.socket, backend.socket, capture ? capture.socket : nil)
|
25
25
|
end
|
26
26
|
end
|
27
|
+
|
28
|
+
# Alias for Device
|
29
|
+
#
|
30
|
+
class Proxy < Device; end
|
27
31
|
|
28
32
|
end
|
data/lib/ffi-rzmq/exceptions.rb
CHANGED
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)
|
@@ -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
|