ffi-rzmq-core 1.0.3 → 1.0.7

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.
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.