ffi-rzmq 1.0.3 → 2.0.1

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.
Files changed (55) hide show
  1. checksums.yaml +7 -0
  2. data/.travis.yml +1 -1
  3. data/AUTHORS.txt +5 -1
  4. data/History.txt +24 -0
  5. data/README.rdoc +2 -4
  6. data/examples/README.rdoc +1 -3
  7. data/examples/{v3api/latency_measurement.rb → latency_measurement.rb} +1 -2
  8. data/examples/{v3api/local_lat.rb → local_lat.rb} +1 -1
  9. data/examples/{v3api/local_lat_poll.rb → local_lat_poll.rb} +4 -4
  10. data/examples/{v3api/local_throughput.rb → local_throughput.rb} +1 -1
  11. data/examples/{v3api/pub.rb → pub.rb} +1 -1
  12. data/examples/{v2api/publish_subscribe.rb → publish_subscribe.rb} +2 -2
  13. data/examples/{v2api/remote_lat.rb → remote_lat.rb} +1 -1
  14. data/examples/{v3api/remote_throughput.rb → remote_throughput.rb} +4 -3
  15. data/examples/repreq_over_curve.rb +60 -0
  16. data/examples/{v2api/reqrep_poll.rb → reqrep_poll.rb} +3 -4
  17. data/examples/{v2api/request_response.rb → request_response.rb} +1 -2
  18. data/examples/{v3api/sub.rb → sub.rb} +1 -2
  19. data/examples/{v3api/throughput_measurement.rb → throughput_measurement.rb} +1 -1
  20. data/examples/{v3api/xreqxrep_poll.rb → xreqxrep_poll.rb} +6 -7
  21. data/ffi-rzmq.gemspec +4 -4
  22. data/lib/ffi-rzmq/context.rb +25 -53
  23. data/lib/ffi-rzmq/device.rb +8 -4
  24. data/lib/ffi-rzmq/exceptions.rb +3 -0
  25. data/lib/ffi-rzmq/message.rb +24 -30
  26. data/lib/ffi-rzmq/poll.rb +5 -16
  27. data/lib/ffi-rzmq/socket.rb +132 -282
  28. data/lib/ffi-rzmq/util.rb +28 -36
  29. data/lib/ffi-rzmq/version.rb +1 -1
  30. data/lib/ffi-rzmq.rb +2 -3
  31. data/spec/context_spec.rb +3 -8
  32. data/spec/device_spec.rb +10 -9
  33. data/spec/nonblocking_recv_spec.rb +7 -7
  34. data/spec/pushpull_spec.rb +8 -7
  35. data/spec/reqrep_spec.rb +6 -6
  36. data/spec/socket_spec.rb +43 -130
  37. data/spec/spec_helper.rb +3 -11
  38. data/spec/util_spec.rb +28 -0
  39. metadata +80 -104
  40. data/examples/v2api/latency_measurement.rb +0 -139
  41. data/examples/v2api/local_lat.rb +0 -58
  42. data/examples/v2api/local_lat_poll.rb +0 -66
  43. data/examples/v2api/local_throughput.rb +0 -58
  44. data/examples/v2api/pub.rb +0 -46
  45. data/examples/v2api/remote_throughput.rb +0 -39
  46. data/examples/v2api/sub.rb +0 -74
  47. data/examples/v2api/throughput_measurement.rb +0 -138
  48. data/examples/v2api/xreqxrep_poll.rb +0 -93
  49. data/examples/v3api/publish_subscribe.rb +0 -82
  50. data/examples/v3api/remote_lat.rb +0 -71
  51. data/examples/v3api/reqrep_poll.rb +0 -62
  52. data/examples/v3api/request_response.rb +0 -40
  53. data/lib/ffi-rzmq/constants.rb +0 -187
  54. data/lib/ffi-rzmq/libc.rb +0 -19
  55. data/lib/ffi-rzmq/libzmq.rb +0 -283
@@ -1,187 +0,0 @@
1
- module ZMQ
2
- # Set up all of the constants that are *common* to all API
3
- # versions
4
-
5
- # Socket types
6
- PAIR = 0
7
- PUB = 1
8
- SUB = 2
9
- REQ = 3
10
- REP = 4
11
- XREQ = 5
12
- XREP = 6
13
- PULL = 7
14
- PUSH = 8
15
-
16
- SocketTypeNameMap = {
17
- PAIR => "PAIR",
18
- PUB => "PUB",
19
- SUB => "SUB",
20
- REQ => "REQ",
21
- REP => "REP",
22
- PULL => "PULL",
23
- PUSH => "PUSH",
24
- XREQ => "XREQ",
25
- XREP => "XREP"
26
- }
27
-
28
- # Socket options
29
- AFFINITY = 4
30
- SUBSCRIBE = 6
31
- UNSUBSCRIBE = 7
32
- RATE = 8
33
- RECOVERY_IVL = 9
34
- SNDBUF = 11
35
- RCVBUF = 12
36
- RCVMORE = 13
37
- FD = 14
38
- EVENTS = 15
39
- TYPE = 16
40
- LINGER = 17
41
- RECONNECT_IVL = 18
42
- BACKLOG = 19
43
- RECONNECT_IVL_MAX = 21
44
- RCVTIMEO = 27
45
- SNDTIMEO = 28
46
-
47
- # Send/recv options
48
- SNDMORE = 2
49
-
50
- # I/O multiplexing
51
-
52
- POLL = 1
53
- POLLIN = 1
54
- POLLOUT = 2
55
- POLLERR = 4
56
-
57
- # Socket errors
58
- EAGAIN = Errno::EAGAIN::Errno
59
- EINVAL = Errno::EINVAL::Errno
60
- ENOMEM = Errno::ENOMEM::Errno
61
- ENODEV = Errno::ENODEV::Errno
62
- EFAULT = Errno::EFAULT::Errno
63
- EINTR = Errno::EINTR::Errno
64
-
65
- # ZMQ errors
66
- HAUSNUMERO = 156384712
67
- EFSM = (HAUSNUMERO + 51)
68
- ENOCOMPATPROTO = (HAUSNUMERO + 52)
69
- ETERM = (HAUSNUMERO + 53)
70
- EMTHREAD = (HAUSNUMERO + 54)
71
-
72
- # Rescue unknown constants and use the ZeroMQ defined values
73
- # Usually only happens on Windows though some don't resolve on
74
- # OSX too (ENOTSUP)
75
- ENOTSUP = Errno::ENOTSUP::Errno rescue (HAUSNUMERO + 1)
76
- EPROTONOSUPPORT = Errno::EPROTONOSUPPORT::Errno rescue (HAUSNUMERO + 2)
77
- ENOBUFS = Errno::ENOBUFS::Errno rescue (HAUSNUMERO + 3)
78
- ENETDOWN = Errno::ENETDOWN::Errno rescue (HAUSNUMERO + 4)
79
- EADDRINUSE = Errno::EADDRINUSE::Errno rescue (HAUSNUMERO + 5)
80
- EADDRNOTAVAIL = Errno::EADDRNOTAVAIL::Errno rescue (HAUSNUMERO + 6)
81
- ECONNREFUSED = Errno::ECONNREFUSED::Errno rescue (HAUSNUMERO + 7)
82
- EINPROGRESS = Errno::EINPROGRESS::Errno rescue (HAUSNUMERO + 8)
83
- ENOTSOCK = Errno::ENOTSOCK::Errno rescue (HAUSNUMERO + 9)
84
- EMSGSIZE = Errno::EMSGSIZE::Errno rescue (HAUSNUMERO + 10)
85
- EAFNOSUPPORT = Errno::EAFNOSUPPORT::Errno rescue (HAUSNUMERO + 11)
86
- ENETUNREACH = Errno::ENETUNREACH::Errno rescue (HAUSNUMERO + 12)
87
- ECONNABORTED = Errno::ECONNABORTED::Errno rescue (HAUSNUMERO + 13)
88
- ECONNRESET = Errno::ECONNRESET::Errno rescue (HAUSNUMERO + 14)
89
- ENOTCONN = Errno::ENOTCONN::Errno rescue (HAUSNUMERO + 15)
90
- ETIMEDOUT = Errno::ETIMEDOUT::Errno rescue (HAUSNUMERO + 16)
91
- EHOSTUNREACH = Errno::EHOSTUNREACH::Errno rescue (HAUSNUMERO + 17)
92
- ENETRESET = Errno::ENETRESET::Errno rescue (HAUSNUMERO + 18)
93
-
94
- # Device Types
95
- STREAMER = 1
96
- FORWARDER = 2
97
- QUEUE = 3
98
- end # module ZMQ
99
-
100
-
101
- if ZMQ::LibZMQ.version2?
102
- module ZMQ
103
- # Socket types
104
- UPSTREAM = PULL
105
- DOWNSTREAM = PUSH
106
- DEALER = XREQ
107
- ROUTER = XREP
108
-
109
- SocketTypeNameMap[ROUTER] = 'ROUTER'
110
- SocketTypeNameMap[DEALER] = 'DEALER'
111
-
112
- # Socket options
113
- HWM = 1
114
- IDENTITY = 5
115
- MCAST_LOOP = 10
116
- SWAP = 3
117
- RECOVERY_IVL_MSEC = 20
118
-
119
- # Send/recv options
120
- NOBLOCK = 1
121
- NonBlocking = NOBLOCK
122
- end
123
- end # version2?
124
-
125
-
126
- if ZMQ::LibZMQ.version3?
127
- module ZMQ
128
- # Socket types
129
- XPUB = 9
130
- XSUB = 10
131
- DEALER = XREQ
132
- ROUTER = XREP
133
-
134
- SocketTypeNameMap[ROUTER] = 'ROUTER'
135
- SocketTypeNameMap[DEALER] = 'DEALER'
136
- SocketTypeNameMap[XPUB] = 'XPUB'
137
- SocketTypeNameMap[XSUB] = 'XSUB'
138
-
139
- # Context options
140
- IO_THREADS = 1
141
- MAX_SOCKETS = 2
142
- IO_THREADS_DFLT = 1
143
- MAX_SOCKETS_DFLT = 1024
144
-
145
- # Socket options
146
- IDENTITY = 5
147
- MAXMSGSIZE = 22
148
- SNDHWM = 23
149
- RCVHWM = 24
150
- MULTICAST_HOPS = 25
151
- IPV4ONLY = 31
152
- LAST_ENDPOINT = 32
153
- ROUTER_BEHAVIOR = 33
154
- TCP_KEEPALIVE = 34
155
- TCP_KEEPALIVE_CNT = 35
156
- TCP_KEEPALIVE_IDLE = 36
157
- TCP_KEEPALIVE_INTVL = 37
158
- TCP_ACCEPT_FILTER = 38
159
-
160
- # Message options
161
- MORE = 1
162
-
163
- # Send/recv options
164
- DONTWAIT = 1
165
- SNDLABEL = 4
166
- NonBlocking = DONTWAIT
167
-
168
- # Socket events and monitoring
169
- EVENT_CONNECTED = 1
170
- EVENT_CONNECT_DELAYED = 2
171
- EVENT_CONNECT_RETRIED = 4
172
- EVENT_LISTENING = 8
173
- EVENT_BIND_FAILED = 16
174
- EVENT_ACCEPTED = 32
175
- EVENT_ACCEPT_FAILED = 64
176
- EVENT_CLOSED = 128
177
- EVENT_CLOSE_FAILED = 256
178
- EVENT_DISCONNECTED = 512
179
- EVENT_ALL = EVENT_CONNECTED | EVENT_CONNECT_DELAYED | EVENT_CONNECT_RETRIED |
180
- EVENT_LISTENING | EVENT_BIND_FAILED | EVENT_ACCEPTED |
181
- EVENT_ACCEPT_FAILED | EVENT_CLOSED | EVENT_CLOSE_FAILED |
182
- EVENT_DISCONNECTED
183
-
184
- # Socket & other errors
185
- EMFILE = Errno::EMFILE::Errno
186
- end
187
- end # version3?
data/lib/ffi-rzmq/libc.rb DELETED
@@ -1,19 +0,0 @@
1
-
2
- module LibC
3
- extend FFI::Library
4
- # figures out the correct libc for each platform including Windows
5
- library = ffi_lib(FFI::Library::LIBC).first
6
-
7
- # Size_t not working properly on Windows
8
- find_type(:size_t) rescue typedef(:ulong, :size_t)
9
-
10
- # memory allocators
11
- attach_function :malloc, [:size_t], :pointer
12
- attach_function :free, [:pointer], :void
13
-
14
- # get a pointer to the free function; used for ZMQ::Message deallocation
15
- Free = library.find_symbol('free')
16
-
17
- # memory movers
18
- attach_function :memcpy, [:pointer, :pointer, :size_t], :pointer
19
- end # module LibC
@@ -1,283 +0,0 @@
1
- module ZMQ
2
-
3
- # Wraps the libzmq library and attaches to the functions that are
4
- # common across the 2.x and 3.x APIs.
5
- #
6
- module LibZMQ
7
- extend FFI::Library
8
-
9
- begin
10
- # bias the library discovery to a path inside the gem first, then
11
- # to the usual system paths
12
- inside_gem = File.join(File.dirname(__FILE__), '..', '..', 'ext')
13
- local_path = FFI::Platform::IS_WINDOWS ? ENV['PATH'].split(';') : ENV['PATH'].split(':')
14
-
15
- # Search for libzmq in the following order...
16
- ZMQ_LIB_PATHS =([inside_gem] + local_path + [
17
- '/usr/local/lib', '/opt/local/lib', '/usr/local/homebrew/lib', '/usr/lib64'
18
- ]).map{|path| "#{path}/libzmq.#{FFI::Platform::LIBSUFFIX}"}
19
- ffi_lib(ZMQ_LIB_PATHS + %w{libzmq})
20
- rescue LoadError => e
21
- if ZMQ_LIB_PATHS.any? {|path| File.file?(path) }
22
- warn "Unable to load this gem. The libzmq library exists, but cannot be loaded."
23
- warn "If this is Windows:"
24
- warn "- Check that you have MSVC runtime installed or statically linked"
25
- warn "- Check that your DLL is compiled for #{FFI::Platform::ADDRESS_SIZE} bit"
26
- else
27
- warn "Unable to load this gem. The libzmq library (or DLL) could not be found."
28
- warn "If this is a Windows platform, make sure libzmq.dll is on the PATH."
29
- warn "If the DLL was built with mingw, make sure the other two dependent DLLs,"
30
- warn "libgcc_s_sjlj-1.dll and libstdc++6.dll, are also on the PATH."
31
- warn "For non-Windows platforms, make sure libzmq is located in this search path:"
32
- warn ZMQ_LIB_PATHS.inspect
33
- end
34
- raise LoadError, e.message
35
- end
36
- # Size_t not working properly on Windows
37
- find_type(:size_t) rescue typedef(:ulong, :size_t)
38
-
39
- # Context and misc api
40
- #
41
- # @blocking = true is a hint to FFI that the following (and only the following)
42
- # function may block, therefore it should release the GIL before calling it.
43
- # This can aid in situations where the function call will/may block and another
44
- # thread within the lib may try to call back into the ruby runtime. Failure to
45
- # release the GIL will result in a hang; the hint *may* allow things to run
46
- # smoothly for Ruby runtimes hampered by a GIL.
47
- #
48
- # This is really only honored by the MRI implementation but it *is* necessary
49
- # otherwise the runtime hangs (and requires a kill -9 to terminate)
50
- #
51
- @blocking = true
52
- attach_function :zmq_version, [:pointer, :pointer, :pointer], :void
53
- @blocking = true
54
- attach_function :zmq_errno, [], :int
55
- @blocking = true
56
- attach_function :zmq_strerror, [:int], :pointer
57
-
58
- def self.version
59
- if @version.nil?
60
- major = FFI::MemoryPointer.new :int
61
- minor = FFI::MemoryPointer.new :int
62
- patch = FFI::MemoryPointer.new :int
63
- LibZMQ.zmq_version major, minor, patch
64
- @version = {:major => major.read_int, :minor => minor.read_int, :patch => patch.read_int}
65
- end
66
-
67
- @version
68
- end
69
-
70
- def self.version2?() version[:major] == 2 && version[:minor] >= 1 end
71
-
72
- def self.version3?() version[:major] == 3 && version[:minor] >= 2 end
73
-
74
- # Context initialization and destruction
75
- @blocking = true
76
- attach_function :zmq_init, [:int], :pointer
77
- @blocking = true
78
- attach_function :zmq_term, [:pointer], :int
79
-
80
- # Message API
81
- @blocking = true
82
- attach_function :zmq_msg_init, [:pointer], :int
83
- @blocking = true
84
- attach_function :zmq_msg_init_size, [:pointer, :size_t], :int
85
- @blocking = true
86
- attach_function :zmq_msg_init_data, [:pointer, :pointer, :size_t, :pointer, :pointer], :int
87
- @blocking = true
88
- attach_function :zmq_msg_close, [:pointer], :int
89
- @blocking = true
90
- attach_function :zmq_msg_data, [:pointer], :pointer
91
- @blocking = true
92
- attach_function :zmq_msg_size, [:pointer], :size_t
93
- @blocking = true
94
- attach_function :zmq_msg_copy, [:pointer, :pointer], :int
95
- @blocking = true
96
- attach_function :zmq_msg_move, [:pointer, :pointer], :int
97
-
98
- # Used for casting pointers back to the struct
99
- #
100
- class Msg < FFI::Struct
101
- layout :content, :pointer,
102
- :flags, :uint8,
103
- :vsm_size, :uint8,
104
- :vsm_data, [:uint8, 30]
105
- end # class Msg
106
-
107
- # Socket API
108
- @blocking = true
109
- attach_function :zmq_socket, [:pointer, :int], :pointer
110
- @blocking = true
111
- attach_function :zmq_setsockopt, [:pointer, :int, :pointer, :int], :int
112
- @blocking = true
113
- attach_function :zmq_getsockopt, [:pointer, :int, :pointer, :pointer], :int
114
- @blocking = true
115
- attach_function :zmq_bind, [:pointer, :string], :int
116
- @blocking = true
117
- attach_function :zmq_connect, [:pointer, :string], :int
118
- @blocking = true
119
- attach_function :zmq_close, [:pointer], :int
120
-
121
- # Device API
122
- @blocking = true
123
- attach_function :zmq_device, [:int, :pointer, :pointer], :int
124
-
125
- # Poll API
126
- @blocking = true
127
- attach_function :zmq_poll, [:pointer, :int, :long], :int
128
-
129
- module PollItemLayout
130
- def self.included(base)
131
- if FFI::Platform::IS_WINDOWS && FFI::Platform::ADDRESS_SIZE==64
132
- # On Windows, zmq.h defines fd as a SOCKET, which is 64 bits on x64.
133
- fd_type=:uint64
134
- else
135
- fd_type=:int
136
- end
137
- base.class_eval do
138
- layout :socket, :pointer,
139
- :fd, fd_type,
140
- :events, :short,
141
- :revents, :short
142
- end
143
- end
144
- end # module PollItemLayout
145
-
146
- class PollItem < FFI::Struct
147
- include PollItemLayout
148
-
149
- def socket() self[:socket]; end
150
-
151
- def fd() self[:fd]; end
152
-
153
- def readable?
154
- (self[:revents] & ZMQ::POLLIN) > 0
155
- end
156
-
157
- def writable?
158
- (self[:revents] & ZMQ::POLLOUT) > 0
159
- end
160
-
161
- def both_accessible?
162
- readable? && writable?
163
- end
164
-
165
- def inspect
166
- "socket [#{socket}], fd [#{fd}], events [#{self[:events]}], revents [#{self[:revents]}]"
167
- end
168
-
169
- def to_s; inspect; end
170
- end # class PollItem
171
-
172
- end
173
-
174
-
175
- # Attaches to those functions specific to the 2.x API
176
- #
177
- if LibZMQ.version2?
178
-
179
- module LibZMQ
180
- # Socket api
181
- @blocking = true
182
- attach_function :zmq_recv, [:pointer, :pointer, :int], :int
183
- @blocking = true
184
- attach_function :zmq_send, [:pointer, :pointer, :int], :int
185
- end
186
- end
187
-
188
-
189
- # Attaches to those functions specific to the 3.x API
190
- #
191
- if LibZMQ.version3?
192
-
193
- module LibZMQ
194
- # New Context API
195
- @blocking = true
196
- attach_function :zmq_ctx_new, [], :pointer
197
- @blocking = true
198
- attach_function :zmq_ctx_destroy, [:pointer], :int
199
- @blocking = true
200
- attach_function :zmq_ctx_set, [:pointer, :int, :int], :int
201
- @blocking = true
202
- attach_function :zmq_ctx_get, [:pointer, :int], :int
203
-
204
- # Message API
205
- @blocking = true
206
- attach_function :zmq_msg_send, [:pointer, :pointer, :int], :int
207
- @blocking = true
208
- attach_function :zmq_msg_recv, [:pointer, :pointer, :int], :int
209
- @blocking = true
210
- attach_function :zmq_msg_more, [:pointer], :int
211
- @blocking = true
212
- attach_function :zmq_msg_get, [:pointer, :int], :int
213
- @blocking = true
214
- attach_function :zmq_msg_set, [:pointer, :int, :int], :int
215
-
216
- # Monitoring API
217
- # zmq_ctx_set_monitor is no longer supported as of version >= 3.2.1
218
- # replaced by zmq_socket_monitor
219
- if LibZMQ.version[:minor] > 2 || (LibZMQ.version[:minor] == 2 && LibZMQ.version[:patch] >= 1)
220
- @blocking = true
221
- attach_function :zmq_socket_monitor, [:pointer, :pointer, :int], :int
222
- else
223
- @blocking = true
224
- attach_function :zmq_ctx_set_monitor, [:pointer, :pointer], :int
225
- end
226
-
227
- # Socket API
228
- @blocking = true
229
- attach_function :zmq_unbind, [:pointer, :string], :int
230
- @blocking = true
231
- attach_function :zmq_disconnect, [:pointer, :string], :int
232
- @blocking = true
233
- attach_function :zmq_recvmsg, [:pointer, :pointer, :int], :int
234
- @blocking = true
235
- attach_function :zmq_recv, [:pointer, :pointer, :size_t, :int], :int
236
- @blocking = true
237
- attach_function :zmq_sendmsg, [:pointer, :pointer, :int], :int
238
- @blocking = true
239
- attach_function :zmq_send, [:pointer, :pointer, :size_t, :int], :int
240
-
241
- module EventDataLayout
242
- def self.included(base)
243
- base.class_eval do
244
- layout :event, :int,
245
- :addr, :string,
246
- :field2, :int
247
- end
248
- end
249
- end # module EventDataLayout
250
-
251
- class EventData < FFI::Struct
252
- include EventDataLayout
253
-
254
- def event() self[:event]; end
255
-
256
- def addr() self[:addr]; end
257
- alias :address :addr
258
-
259
- def fd() self[:field2]; end
260
- alias :err :fd
261
- alias :interval :fd
262
-
263
- def inspect
264
- "event [#{event}], addr [#{addr}], fd [#{fd}], field2 [#{fd}]"
265
- end
266
-
267
- def to_s; inspect; end
268
- end # class EventData
269
-
270
- end
271
- end
272
-
273
-
274
- # Sanity check; print an error and exit if we are trying to load an unsupported
275
- # version of libzmq.
276
- #
277
- unless LibZMQ.version2? || LibZMQ.version3?
278
- hash = LibZMQ.version
279
- version = "#{hash[:major]}.#{hash[:minor]}.#{hash[:patch]}"
280
- raise LoadError, "The libzmq version #{version} is incompatible with ffi-rzmq."
281
- end
282
-
283
- end # module ZMQ