ffi-rzmq-core 1.0.3 → 1.0.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: aaef58251b0eb71a09de2e6614a728051abc6c01
4
- data.tar.gz: 7b77162ec56a6df2f7c0211d5473e2b1b437206f
2
+ SHA256:
3
+ metadata.gz: dfb36c8fd3ba8ea7889a686282a1eea04fd42b6b418fb627a59136ebca5e9c60
4
+ data.tar.gz: 6351eccd6e2ca3e0c91a49e02672bbec65d4d33abd728e368a98abf3d975c9ca
5
5
  SHA512:
6
- metadata.gz: b87258245ef93fd6d2d90391f42422aaea73dcae7712e24d06fb8042fe8b019fffa0db24c98d3335e59617c649cc2eaae3a913cd9c741d271f858cc8b09c0334
7
- data.tar.gz: 6ee10101e4de2928aeb5804bb1a407537bf36fa0443446494d3786a3ee817adbfff716f512829f51cf5b489b520d77fd26a00984ece6f5bf573d3aa8ab510f56
6
+ metadata.gz: 61f7bd2e38fe8025d8dd37e81e9872770c8ae367ec03305a5b155c4397503996f696af1f33987329ad2019041ddf17a4a1979df2cb0cb64e5c8bbb3852b8255c
7
+ data.tar.gz: 48c45585ef08d5a03cf76b3eb0e47cace36aacb686626bee1e2a55173b52c56ae858d5356736253d45b70b0702f69dd18e643dd5fb637e190121e78dbe652b1d
data/.travis.yml CHANGED
@@ -2,12 +2,10 @@ before_install: sudo apt-get install libzmq3-dev
2
2
  script: bundle exec rspec
3
3
  language: ruby
4
4
  rvm:
5
- - 1.9.3
6
- - 2.0.0
5
+ - 2.6.0
7
6
  - ruby-head
8
- - jruby-19mode
9
7
  - jruby-head
10
- - rbx-2.1.1
8
+ - rbx
11
9
 
12
10
  matrix:
13
11
  allow_failures:
data/History.txt ADDED
@@ -0,0 +1,8 @@
1
+ == 1.0.7
2
+ * Provide a wrapper function for calling context termination. Zeromq 3.x
3
+ uses zmq_ctx_destroy to terminate a context. While this function exists
4
+ in Zeromq 4.x, it is deprecated. For 4.x, we prefer to use zmq_ctx_term.
5
+ When loading the library, we define a `terminate_context` method on the
6
+ module which defaults to using the 3.x function call. If the 4.x support
7
+ loads, then this method is overwritten to use the 4.x function call.
8
+
data/README.md CHANGED
@@ -10,6 +10,9 @@ hoping this encourages other library writers to create their own. Rather than du
10
10
  wrapping code, they can just pull in this gem and build a more idiomatic library around the
11
11
  basic definitions.
12
12
 
13
+ As of zeromq 4.2.x, this library does not yet support the `zmq_atomic_counter_*` functions or many
14
+ of the other newly exposed functions. Pull requests encouraged!
15
+
13
16
  See [ffi-rzmq]
14
17
 
15
18
  ### Development
@@ -19,7 +19,7 @@ Gem::Specification.new do |s|
19
19
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
20
  s.require_paths = ["lib"]
21
21
 
22
- s.add_runtime_dependency "ffi", ["~> 1.9"]
23
- s.add_development_dependency "rspec", ["~> 2.14"]
22
+ s.add_runtime_dependency "ffi"
23
+ s.add_development_dependency "rspec"
24
24
  s.add_development_dependency "rake"
25
25
  end
@@ -37,54 +37,72 @@ module ZMQ
37
37
  }
38
38
 
39
39
  # Socket options
40
- AFFINITY = 4
41
- IDENTITY = 5
42
- SUBSCRIBE = 6
43
- UNSUBSCRIBE = 7
44
- RATE = 8
45
- RECOVERY_IVL = 9
46
- SNDBUF = 11
47
- RCVBUF = 12
48
- RCVMORE = 13
49
- FD = 14
50
- EVENTS = 15
51
- TYPE = 16
52
- LINGER = 17
53
- RECONNECT_IVL = 18
54
- BACKLOG = 19
55
- RECONNECT_IVL_MAX = 21
56
- MAXMSGSIZE = 22
57
- SNDHWM = 23
58
- RCVHWM = 24
59
- MULTICAST_HOPS = 25
60
- RCVTIMEO = 27
61
- SNDTIMEO = 28
62
- IPV4ONLY = 31
63
- LAST_ENDPOINT = 32
64
- ROUTER_MANDATORY = 33
65
- TCP_KEEPALIVE = 34
66
- TCP_KEEPALIVE_CNT = 35
67
- TCP_KEEPALIVE_IDLE = 36
68
- TCP_KEEPALIVE_INTVL = 37
69
- TCP_ACCEPT_FILTER = 38
70
- DELAY_ATTACH_ON_CONNECT = 39
71
- XPUB_VERBOSE = 40
72
- ROUTER_RAW = 41
73
- IPV6 = 42
74
- MECHANISM = 43
75
- PLAIN_SERVER = 44
76
- PLAIN_USERNAME = 45
77
- PLAIN_PASSWORD = 46
78
- CURVE_SERVER = 47
79
- CURVE_PUBLICKEY = 48
80
- CURVE_SECRETKEY = 49
81
- CURVE_SERVERKEY = 50
82
- PROBE_ROUTER = 51
83
- REQ_CORRELATE = 52
84
- REQ_RELAXED = 53
85
- CONFLATE = 54
86
- ZAP_DOMAIN = 55
87
- ROUTER_HANDOVER = 56
40
+ AFFINITY = 4
41
+ IDENTITY = 5
42
+ SUBSCRIBE = 6
43
+ UNSUBSCRIBE = 7
44
+ RATE = 8
45
+ RECOVERY_IVL = 9
46
+ SNDBUF = 11
47
+ RCVBUF = 12
48
+ RCVMORE = 13
49
+ FD = 14
50
+ EVENTS = 15
51
+ TYPE = 16
52
+ LINGER = 17
53
+ RECONNECT_IVL = 18
54
+ BACKLOG = 19
55
+ RECONNECT_IVL_MAX = 21
56
+ MAXMSGSIZE = 22
57
+ SNDHWM = 23
58
+ RCVHWM = 24
59
+ MULTICAST_HOPS = 25
60
+ RCVTIMEO = 27
61
+ SNDTIMEO = 28
62
+ IPV4ONLY = 31
63
+ LAST_ENDPOINT = 32
64
+ ROUTER_MANDATORY = 33
65
+ TCP_KEEPALIVE = 34
66
+ TCP_KEEPALIVE_CNT = 35
67
+ TCP_KEEPALIVE_IDLE = 36
68
+ TCP_KEEPALIVE_INTVL = 37
69
+ TCP_ACCEPT_FILTER = 38
70
+ DELAY_ATTACH_ON_CONNECT = 39
71
+ XPUB_VERBOSE = 40
72
+ ROUTER_RAW = 41
73
+ IPV6 = 42
74
+ MECHANISM = 43
75
+ PLAIN_SERVER = 44
76
+ PLAIN_USERNAME = 45
77
+ PLAIN_PASSWORD = 46
78
+ CURVE_SERVER = 47
79
+ CURVE_PUBLICKEY = 48
80
+ CURVE_SECRETKEY = 49
81
+ CURVE_SERVERKEY = 50
82
+ PROBE_ROUTER = 51
83
+ REQ_CORRELATE = 52
84
+ REQ_RELAXED = 53
85
+ CONFLATE = 54
86
+ ZAP_DOMAIN = 55
87
+ ROUTER_HANDOVER = 56
88
+ TOS = 57
89
+ CONNECT_RID = 61
90
+ GSSAPI_SERVER = 62
91
+ GSSAPI_PRINCIPAL = 63
92
+ GSSAPI_SERVICE_PRINCIPAL = 64
93
+ GSSAPI_PLAINTEXT = 65
94
+ HANDSHAKE_IVL = 66
95
+ SOCKS_PROXY = 68
96
+ XPUB_NODROP = 69
97
+ BLOCKY = 70
98
+ XPUB_MANUAL = 71
99
+ XPUB_WELCOME_MSG = 72
100
+ STREAM_NOTIFY = 73
101
+ INVERT_MATCHING = 74
102
+ HEARTBEAT_IVL = 75
103
+ HEARTBEAT_TTL = 76
104
+ HEARTBEAT_TIMEOUT = 77
105
+ XPUB_VERBOSE_UNSUBSCRIBE = 78
88
106
 
89
107
  IMMEDIATE = DELAY_ATTACH_ON_CONNECT
90
108
  FAIL_UNROUTABLE = ROUTER_MANDATORY
@@ -1,4 +1,5 @@
1
1
  require 'open3'
2
+ require 'rbconfig'
2
3
 
3
4
  # Wraps the libzmq library and attaches to the functions that are
4
5
  # common across the 3.2.x+ and 4.x APIs.
@@ -11,6 +12,8 @@ module LibZMQ
11
12
  # to the usual system paths
12
13
  inside_gem = File.join(File.dirname(__FILE__), '..', '..', 'ext')
13
14
  local_path = FFI::Platform::IS_WINDOWS ? ENV['PATH'].split(';') : ENV['PATH'].split(':')
15
+ env_path = [ ENV['ZMQ_LIB_PATH'] ].compact
16
+ rbconfig_path = RbConfig::CONFIG["libdir"]
14
17
  homebrew_path = nil
15
18
 
16
19
  # RUBYOPT set by RVM breaks 'brew' so we need to unset it.
@@ -31,18 +34,28 @@ module LibZMQ
31
34
  ENV['RUBYOPT'] = rubyopt
32
35
 
33
36
  # Search for libzmq in the following order...
34
- ZMQ_LIB_PATHS = ([inside_gem] + local_path + [
37
+ ZMQ_LIB_PATHS = ([inside_gem] + env_path + local_path + [rbconfig_path] + [
35
38
  '/usr/local/lib', '/opt/local/lib', homebrew_path, '/usr/lib64'
36
39
  ]).compact.map{|path| "#{path}/libzmq.#{FFI::Platform::LIBSUFFIX}"}
40
+
41
+ # Recent versions of libzmq do not put all symbols into the global namespace so
42
+ # lazy linking can fail at runtime. Force all symbols to global namespace.
43
+ ffi_lib_flags :now, :global
37
44
  ffi_lib(ZMQ_LIB_PATHS + %w{libzmq})
38
45
 
39
46
  rescue LoadError
40
- if ZMQ_LIB_PATHS.any? {|path|
41
- File.file? File.join(path, "libzmq.#{FFI::Platform::LIBSUFFIX}")}
47
+ # Failed to load the zmq library
48
+
49
+ found_libs = ZMQ_LIB_PATHS.find_all {|path| File.file? path }
50
+ if found_libs.any?
42
51
  warn "Unable to load this gem. The libzmq library exists, but cannot be loaded."
43
- warn "If this is Windows:"
44
- warn "- Check that you have MSVC runtime installed or statically linked"
45
- warn "- Check that your DLL is compiled for #{FFI::Platform::ADDRESS_SIZE} bit"
52
+ warn "libzmq library was found at:"
53
+ warn found_libs.inspect
54
+ if FFI::Platform::IS_WINDOWS
55
+ warn "On Windows:"
56
+ warn "- Check that you have MSVC runtime installed or statically linked"
57
+ warn "- Check that your DLL is compiled for #{FFI::Platform::ADDRESS_SIZE} bit"
58
+ end
46
59
  else
47
60
  warn "Unable to load this gem. The libzmq library (or DLL) could not be found."
48
61
  warn "If this is a Windows platform, make sure libzmq.dll is on the PATH."
@@ -116,4 +129,8 @@ module LibZMQ
116
129
  # Monitoring API
117
130
  attach_function :zmq_socket_monitor, [:pointer, :pointer, :int], :int, :blocking => true
118
131
 
132
+ # Wrapper function for context termination
133
+ def self.terminate_context(context)
134
+ zmq_ctx_destroy(context)
135
+ end
119
136
  end
@@ -14,4 +14,9 @@ module LibZMQ
14
14
  # Will return -1 with errno set to ENOSUP otherwise
15
15
  attach_function :zmq_curve_keypair, [:pointer, :pointer], :int, :blocking => true
16
16
 
17
+ # Wrapper function for context termination
18
+ def self.terminate_context(context)
19
+ zmq_ctx_term(context)
20
+ end
21
+
17
22
  end
@@ -1,14 +1,51 @@
1
1
  module LibZMQ
2
2
 
3
- # Used for casting pointers back to the msg_t struct
4
- #
5
- class Message < FFI::Struct
6
- layout :content, :pointer,
7
- :flags, :uint8,
8
- :vsm_size, :uint8,
9
- :vsm_data, [:uint8, 30]
3
+ def self.version_number
4
+ 10000 * version[:major] + 100 * version[:minor] + version[:patch]
5
+ end
6
+
7
+ def self.version_string
8
+ "%d.%d.%d" % version.values_at(:major, :minor, :patch)
10
9
  end
11
10
 
11
+ raise "zmq library version not supported: #{version_string}" if version_number < 030200
12
+
13
+ # here are the typedefs for zmsg_msg_t for all known releases of libzmq
14
+ # grep 'typedef struct zmq_msg_t' */include/zmq.h
15
+ # zeromq-3.2.2/include/zmq.h:typedef struct zmq_msg_t {unsigned char _ [32];} zmq_msg_t;
16
+ # zeromq-3.2.3/include/zmq.h:typedef struct zmq_msg_t {unsigned char _ [32];} zmq_msg_t;
17
+ # zeromq-3.2.4/include/zmq.h:typedef struct zmq_msg_t {unsigned char _ [32];} zmq_msg_t;
18
+ # zeromq-3.2.5/include/zmq.h:typedef struct zmq_msg_t {unsigned char _ [32];} zmq_msg_t;
19
+ # zeromq-4.0.0/include/zmq.h:typedef struct zmq_msg_t {unsigned char _ [32];} zmq_msg_t;
20
+ # zeromq-4.0.1/include/zmq.h:typedef struct zmq_msg_t {unsigned char _ [32];} zmq_msg_t;
21
+ # zeromq-4.0.2/include/zmq.h:typedef struct zmq_msg_t {unsigned char _ [32];} zmq_msg_t;
22
+ # zeromq-4.0.3/include/zmq.h:typedef struct zmq_msg_t {unsigned char _ [32];} zmq_msg_t;
23
+ # zeromq-4.0.4/include/zmq.h:typedef struct zmq_msg_t {unsigned char _ [32];} zmq_msg_t;
24
+ # zeromq-4.0.5/include/zmq.h:typedef struct zmq_msg_t {unsigned char _ [32];} zmq_msg_t;
25
+ # zeromq-4.0.6/include/zmq.h:typedef struct zmq_msg_t {unsigned char _ [32];} zmq_msg_t;
26
+ # zeromq-4.0.7/include/zmq.h:typedef struct zmq_msg_t {unsigned char _ [32];} zmq_msg_t;
27
+ # zeromq-4.1.0/include/zmq.h:typedef struct zmq_msg_t {unsigned char _ [48];} zmq_msg_t;
28
+ # zeromq-4.1.1/include/zmq.h:typedef struct zmq_msg_t {unsigned char _ [64];} zmq_msg_t;
29
+ # zeromq-4.1.2/include/zmq.h:typedef struct zmq_msg_t {unsigned char _ [64];} zmq_msg_t;
30
+ # zeromq-4.1.3/include/zmq.h:typedef struct zmq_msg_t {unsigned char _ [64];} zmq_msg_t;
31
+ # zeromq-4.1.4/include/zmq.h:typedef struct zmq_msg_t {unsigned char _ [64];} zmq_msg_t;
32
+ # libzmq/include/zmq.h: typedef union zmq_msg_t {unsigned char _ [64]; void *p; } zmq_msg_t;
33
+
34
+ def self.size_of_zmq_msg_t
35
+ if version_number < 040100
36
+ 32
37
+ elsif version_number < 040101
38
+ 48
39
+ else
40
+ 64
41
+ end
42
+ end
43
+
44
+ # Declare Message with correct size and alignment
45
+ class Message < FFI::Union
46
+ layout :'_', [:uint8, LibZMQ.size_of_zmq_msg_t],
47
+ :p, :pointer
48
+ end
12
49
 
13
50
  # Create the basic mapping for the poll_item_t structure so we can
14
51
  # access those fields via Ruby.
@@ -1,3 +1,3 @@
1
1
  module LibZMQ
2
- VERSION = "1.0.3"
2
+ VERSION = "1.0.7"
3
3
  end
data/lib/ffi-rzmq-core.rb CHANGED
@@ -1,8 +1,8 @@
1
1
  require 'ffi'
2
2
  require 'ffi-rzmq-core/libc'
3
3
  require 'ffi-rzmq-core/libzmq'
4
- require 'ffi-rzmq-core/structures'
5
4
  require 'ffi-rzmq-core/utilities'
5
+ require 'ffi-rzmq-core/structures'
6
6
  require 'ffi-rzmq-core/constants'
7
7
 
8
8
  if LibZMQ.version4?
data/spec/libzmq_spec.rb CHANGED
@@ -45,4 +45,27 @@ describe LibZMQ do
45
45
  expect(LibZMQ).to respond_to(:zmq_socket_monitor)
46
46
  end
47
47
 
48
+ if LibZMQ.version3?
49
+
50
+ describe '.terminate_context' do
51
+ it 'calls the 3.x zmq_ctx_destroy function' do
52
+ context_dbl = double('context')
53
+
54
+ expect(LibZMQ).to receive(:zmq_ctx_destroy).with(context_dbl)
55
+ LibZMQ.terminate_context(context_dbl)
56
+ end
57
+ end
58
+
59
+ elsif LibZMQ.version4?
60
+
61
+ describe '.terminate_context' do
62
+ it 'calls the 4.x zmq_ctx_destroy function' do
63
+ context_dbl = double('context')
64
+
65
+ expect(LibZMQ).to receive(:zmq_ctx_term).with(context_dbl)
66
+ LibZMQ.terminate_context(context_dbl)
67
+ end
68
+ end
69
+
70
+ end
48
71
  end
data/spec/spec_helper.rb CHANGED
@@ -2,7 +2,6 @@ require File.expand_path(
2
2
  File.join(File.dirname(__FILE__), %w[.. lib ffi-rzmq-core]))
3
3
 
4
4
  require 'rspec'
5
- require 'rspec/autorun'
6
5
 
7
6
  Dir[File.join(File.dirname(__FILE__), "support", "*.rb")].each do |support|
8
7
  require support
@@ -2,13 +2,24 @@ require 'spec_helper'
2
2
 
3
3
  describe LibZMQ do
4
4
 
5
- it "wraps the msg_t struct as Message" do
6
- message = LibZMQ::Message.new
5
+ if LibZMQ.version_number >= 040101
6
+
7
+ it "the msg_t struct wrapped in Message is 64 bytes" do
8
+ LibZMQ::Message.size == 64
9
+ end
10
+
11
+ elsif LibZMQ.version_number < 040100
12
+
13
+ it "the msg_t struct wrapped in Message is 32 bytes" do
14
+ LibZMQ::Message.size == 32
15
+ end
16
+
17
+ elsif LibZMQ.version_number == 040100
18
+
19
+ it "the msg_t struct wrapped in Message is 48 bytes" do
20
+ LibZMQ::Message.size == 32
21
+ end
7
22
 
8
- expect(message[:content]).to_not be_nil
9
- expect(message[:flags]).to_not be_nil
10
- expect(message[:vsm_size]).to_not be_nil
11
- expect(message[:vsm_data]).to_not be_nil
12
23
  end
13
24
 
14
25
  it "wraps poll_item_t in a PollItem" do
metadata CHANGED
@@ -1,43 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ffi-rzmq-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 1.0.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chuck Remes
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-03-12 00:00:00.000000000 Z
11
+ date: 2019-01-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ffi
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '1.9'
19
+ version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '1.9'
26
+ version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rspec
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '2.14'
33
+ version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '2.14'
40
+ version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -64,6 +64,7 @@ files:
64
64
  - ".gitignore"
65
65
  - ".travis.yml"
66
66
  - Gemfile
67
+ - History.txt
67
68
  - LICENSE
68
69
  - README.md
69
70
  - Rakefile
@@ -102,7 +103,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
102
103
  version: '0'
103
104
  requirements: []
104
105
  rubyforge_project:
105
- rubygems_version: 2.2.0
106
+ rubygems_version: 2.7.3
106
107
  signing_key:
107
108
  specification_version: 4
108
109
  summary: This gem provides only the FFI wrapper for the ZeroMQ (0mq) networking library.