ffi-rzmq 0.8.2 → 0.9.0

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 (56) hide show
  1. data/AUTHORS.txt +1 -0
  2. data/History.txt +35 -0
  3. data/README.rdoc +48 -15
  4. data/Rakefile +7 -2
  5. data/examples/README.rdoc +21 -76
  6. data/examples/{local_lat.rb → v2api/local_lat.rb} +27 -12
  7. data/examples/v2api/local_lat_poll.rb +66 -0
  8. data/examples/{local_throughput.rb → v2api/local_throughput.rb} +24 -9
  9. data/examples/v2api/publish_subscribe.rb +82 -0
  10. data/examples/{remote_lat.rb → v2api/remote_lat.rb} +26 -8
  11. data/examples/v2api/remote_throughput.rb +39 -0
  12. data/examples/v2api/reqrep_poll.rb +62 -0
  13. data/examples/v2api/request_response.rb +40 -0
  14. data/examples/v2api/throughput_measurement.rb +138 -0
  15. data/examples/v3api/local_lat.rb +59 -0
  16. data/examples/v3api/local_lat_poll.rb +66 -0
  17. data/examples/v3api/local_throughput.rb +65 -0
  18. data/examples/v3api/publish_subscribe.rb +82 -0
  19. data/examples/v3api/remote_lat.rb +71 -0
  20. data/examples/v3api/remote_throughput.rb +47 -0
  21. data/examples/v3api/reqrep_poll.rb +62 -0
  22. data/examples/v3api/request_response.rb +40 -0
  23. data/examples/v3api/throughput_measurement.rb +166 -0
  24. data/ext/README +5 -0
  25. data/ffi-rzmq.gemspec +4 -4
  26. data/lib/ffi-rzmq.rb +4 -1
  27. data/lib/ffi-rzmq/constants.rb +178 -0
  28. data/lib/ffi-rzmq/context.rb +61 -45
  29. data/lib/ffi-rzmq/device.rb +22 -9
  30. data/lib/ffi-rzmq/exceptions.rb +0 -98
  31. data/lib/ffi-rzmq/libc.rb +19 -0
  32. data/lib/ffi-rzmq/libzmq.rb +188 -0
  33. data/lib/ffi-rzmq/message.rb +33 -40
  34. data/lib/ffi-rzmq/poll.rb +49 -52
  35. data/lib/ffi-rzmq/socket.rb +902 -392
  36. data/lib/ffi-rzmq/util.rb +101 -0
  37. data/spec/context_spec.rb +47 -21
  38. data/spec/device_spec.rb +78 -58
  39. data/spec/message_spec.rb +90 -12
  40. data/spec/multipart_spec.rb +162 -0
  41. data/spec/nonblocking_recv_spec.rb +325 -0
  42. data/spec/pushpull_spec.rb +95 -34
  43. data/spec/reqrep_spec.rb +55 -20
  44. data/spec/socket_spec.rb +353 -204
  45. data/spec/spec_helper.rb +46 -3
  46. data/version.txt +1 -1
  47. metadata +91 -66
  48. data/examples/local_lat_poll.rb +0 -54
  49. data/examples/local_lat_zerocopy.rb +0 -24
  50. data/examples/publish_subscribe.rb +0 -52
  51. data/examples/remote_lat_zerocopy.rb +0 -35
  52. data/examples/remote_throughput.rb +0 -27
  53. data/examples/reqrep_poll.rb +0 -49
  54. data/examples/request_response.rb +0 -23
  55. data/lib/ffi-rzmq/wrapper.rb +0 -121
  56. data/lib/ffi-rzmq/zmq.rb +0 -198
@@ -7,11 +7,24 @@ File.join(File.dirname(__FILE__), %w[.. lib ffi-rzmq]))
7
7
 
8
8
  Thread.abort_on_exception = true
9
9
 
10
- SPEC_CTX = ZMQ::Context.new 1
11
- def spec_ctx
12
- SPEC_CTX
10
+ # define some version guards so we can turn on/off specs based upon
11
+ # the version of the 0mq library that is loaded
12
+ def version2?
13
+ LibZMQ.version2?
13
14
  end
14
15
 
16
+ def version3?
17
+ LibZMQ.version3?
18
+ end
19
+
20
+ def version4?
21
+ LibZMQ.version4?
22
+ end
23
+
24
+
25
+ NonBlockingFlag = (LibZMQ.version2? ? ZMQ::NOBLOCK : ZMQ::DONTWAIT) unless defined?(NonBlockingFlag)
26
+
27
+
15
28
  module APIHelper
16
29
  def stub_libzmq
17
30
  @err_str_mock = mock("error string")
@@ -27,4 +40,34 @@ module APIHelper
27
40
  def random_port
28
41
  rand(55534) + 10_000
29
42
  end
43
+
44
+ def bind_to_random_tcp_port socket, max_tries = 500
45
+ tries = 0
46
+ rc = -1
47
+
48
+ while !ZMQ::Util.resultcode_ok?(rc) && tries < max_tries
49
+ tries += 1
50
+ random = random_port
51
+ rc = socket.bind "tcp://127.0.0.1:#{random}"
52
+ end
53
+
54
+ random
55
+ end
56
+
57
+ def connect_to_random_tcp_port socket, max_tries = 500
58
+ tries = 0
59
+ rc = -1
60
+
61
+ while !ZMQ::Util.resultcode_ok?(rc) && tries < max_tries
62
+ tries += 1
63
+ random = random_port
64
+ rc = socket.connect "tcp://127.0.0.1:#{random}"
65
+ end
66
+
67
+ random
68
+ end
69
+
70
+ def assert_ok(rc)
71
+ raise "Failed with rc [#{rc}] and errno [#{ZMQ::Util.errno}], msg [#{ZMQ::Util.error_string}]! #{caller(0)}" unless rc >= 0
72
+ end
30
73
  end
@@ -1 +1 @@
1
- 0.8.2
1
+ 0.9.0
metadata CHANGED
@@ -1,29 +1,37 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ffi-rzmq
3
3
  version: !ruby/object:Gem::Version
4
- prerelease:
5
- version: 0.8.2
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 9
8
+ - 0
9
+ version: 0.9.0
6
10
  platform: ruby
7
11
  authors:
8
- - Chuck Remes
12
+ - Chuck Remes
9
13
  autorequire:
10
14
  bindir: bin
11
15
  cert_chain: []
12
16
 
13
- date: 2011-01-30 00:00:00 -06:00
17
+ date: 2011-09-14 00:00:00 -05:00
14
18
  default_executable:
15
19
  dependencies:
16
- - !ruby/object:Gem::Dependency
17
- name: bones
18
- prerelease: false
19
- requirement: &id001 !ruby/object:Gem::Requirement
20
- none: false
21
- requirements:
22
- - - ">="
23
- - !ruby/object:Gem::Version
24
- version: 3.5.4
25
- type: :development
26
- version_requirements: *id001
20
+ - !ruby/object:Gem::Dependency
21
+ name: bones
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ segments:
29
+ - 3
30
+ - 5
31
+ - 4
32
+ version: 3.5.4
33
+ type: :development
34
+ version_requirements: *id001
27
35
  description: |-
28
36
  This gem wraps the ZeroMQ networking library using the ruby FFI (foreign
29
37
  function interface). It's a pure ruby wrapper so this gem can be loaded
@@ -35,75 +43,92 @@ executables: []
35
43
  extensions: []
36
44
 
37
45
  extra_rdoc_files:
38
- - AUTHORS.txt
39
- - History.txt
40
- - README.rdoc
41
- - examples/README.rdoc
42
- - version.txt
46
+ - AUTHORS.txt
47
+ - History.txt
48
+ - README.rdoc
49
+ - examples/README.rdoc
50
+ - version.txt
43
51
  files:
44
- - .bnsignore
45
- - History.txt
46
- - README.rdoc
47
- - Rakefile
48
- - examples/README.rdoc
49
- - examples/local_lat.rb
50
- - examples/local_lat_poll.rb
51
- - examples/local_lat_zerocopy.rb
52
- - examples/local_throughput.rb
53
- - examples/publish_subscribe.rb
54
- - examples/remote_lat.rb
55
- - examples/remote_lat_zerocopy.rb
56
- - examples/remote_throughput.rb
57
- - examples/reqrep_poll.rb
58
- - examples/request_response.rb
59
- - ffi-rzmq.gemspec
60
- - lib/ffi-rzmq.rb
61
- - lib/ffi-rzmq/context.rb
62
- - lib/ffi-rzmq/device.rb
63
- - lib/ffi-rzmq/exceptions.rb
64
- - lib/ffi-rzmq/message.rb
65
- - lib/ffi-rzmq/poll.rb
66
- - lib/ffi-rzmq/poll_items.rb
67
- - lib/ffi-rzmq/socket.rb
68
- - lib/ffi-rzmq/wrapper.rb
69
- - lib/ffi-rzmq/zmq.rb
70
- - spec/context_spec.rb
71
- - spec/device_spec.rb
72
- - spec/message_spec.rb
73
- - spec/pushpull_spec.rb
74
- - spec/reqrep_spec.rb
75
- - spec/socket_spec.rb
76
- - spec/spec_helper.rb
77
- - version.txt
78
- - AUTHORS.txt
52
+ - .bnsignore
53
+ - History.txt
54
+ - README.rdoc
55
+ - Rakefile
56
+ - examples/README.rdoc
57
+ - examples/v2api/local_lat.rb
58
+ - examples/v2api/local_lat_poll.rb
59
+ - examples/v2api/local_throughput.rb
60
+ - examples/v2api/publish_subscribe.rb
61
+ - examples/v2api/remote_lat.rb
62
+ - examples/v2api/remote_throughput.rb
63
+ - examples/v2api/reqrep_poll.rb
64
+ - examples/v2api/request_response.rb
65
+ - examples/v2api/throughput_measurement.rb
66
+ - examples/v3api/local_lat.rb
67
+ - examples/v3api/local_lat_poll.rb
68
+ - examples/v3api/local_throughput.rb
69
+ - examples/v3api/publish_subscribe.rb
70
+ - examples/v3api/remote_lat.rb
71
+ - examples/v3api/remote_throughput.rb
72
+ - examples/v3api/reqrep_poll.rb
73
+ - examples/v3api/request_response.rb
74
+ - examples/v3api/throughput_measurement.rb
75
+ - ext/README
76
+ - ffi-rzmq.gemspec
77
+ - lib/ffi-rzmq.rb
78
+ - lib/ffi-rzmq/constants.rb
79
+ - lib/ffi-rzmq/context.rb
80
+ - lib/ffi-rzmq/device.rb
81
+ - lib/ffi-rzmq/exceptions.rb
82
+ - lib/ffi-rzmq/libc.rb
83
+ - lib/ffi-rzmq/libzmq.rb
84
+ - lib/ffi-rzmq/message.rb
85
+ - lib/ffi-rzmq/poll.rb
86
+ - lib/ffi-rzmq/poll_items.rb
87
+ - lib/ffi-rzmq/socket.rb
88
+ - lib/ffi-rzmq/util.rb
89
+ - spec/context_spec.rb
90
+ - spec/device_spec.rb
91
+ - spec/message_spec.rb
92
+ - spec/multipart_spec.rb
93
+ - spec/nonblocking_recv_spec.rb
94
+ - spec/pushpull_spec.rb
95
+ - spec/reqrep_spec.rb
96
+ - spec/socket_spec.rb
97
+ - spec/spec_helper.rb
98
+ - version.txt
99
+ - AUTHORS.txt
79
100
  has_rdoc: true
80
101
  homepage: http://github.com/chuckremes/ffi-rzmq
81
102
  licenses: []
82
103
 
83
104
  post_install_message:
84
105
  rdoc_options:
85
- - --main
86
- - README.rdoc
106
+ - --main
107
+ - README.rdoc
87
108
  require_paths:
88
- - lib
109
+ - lib
89
110
  required_ruby_version: !ruby/object:Gem::Requirement
90
111
  none: false
91
112
  requirements:
92
- - - ">="
93
- - !ruby/object:Gem::Version
94
- version: "0"
113
+ - - ">="
114
+ - !ruby/object:Gem::Version
115
+ segments:
116
+ - 0
117
+ version: "0"
95
118
  required_rubygems_version: !ruby/object:Gem::Requirement
96
119
  none: false
97
120
  requirements:
98
- - - ">="
99
- - !ruby/object:Gem::Version
100
- version: "0"
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ segments:
124
+ - 0
125
+ version: "0"
101
126
  requirements: []
102
127
 
103
128
  rubyforge_project: ffi-rzmq
104
- rubygems_version: 1.5.1
129
+ rubygems_version: 1.3.7
105
130
  signing_key:
106
131
  specification_version: 3
107
- summary: This gem wraps the ZeroMQ networking library using the ruby FFI (foreign function interface).
132
+ summary: This gem wraps the ZeroMQ (0mq) networking library using Ruby FFI (foreign function interface).
108
133
  test_files: []
109
134
 
@@ -1,54 +0,0 @@
1
- require 'rubygems'
2
- require 'ffi-rzmq'
3
-
4
- if ARGV.length < 3
5
- puts "usage: local_lat <connect-to> <message-size> <roundtrip-count>"
6
- exit
7
- end
8
-
9
- link = ARGV[0]
10
- message_size = ARGV[1].to_i
11
- roundtrip_count = ARGV[2].to_i
12
-
13
- #link = "tcp://127.0.0.1:5555"
14
-
15
- ctx = ZMQ::Context.new
16
- s1 = ctx.socket ZMQ::REQ
17
- s2 = ctx.socket ZMQ::REP
18
-
19
- s1.connect link
20
- s2.bind link
21
-
22
- poller = ZMQ::Poller.new
23
- poller.register_readable s2
24
- poller.register_readable s1
25
-
26
-
27
- start_time = Time.now
28
-
29
- # kick it off
30
- message = ZMQ::Message.new("a" * message_size)
31
- s1.send message, ZMQ::NOBLOCK
32
- i = roundtrip_count
33
-
34
- until i.zero?
35
- i -= 1
36
-
37
- begin
38
- poller.poll_nonblock
39
- rescue ZMQ::PollError => e
40
- puts "efault? [#{e.efault?}]"
41
- raise
42
- end
43
-
44
- poller.readables.each do |socket|
45
- received_message = socket.recv_string ZMQ::NOBLOCK
46
- socket.send ZMQ::Message.new(received_message), ZMQ::NOBLOCK
47
- end
48
- end
49
-
50
- elapsed_usecs = (Time.now.to_f - start_time.to_f) * 1_000_000
51
- latency = elapsed_usecs / roundtrip_count / 2
52
-
53
- puts "mean latency: %.3f [us]" % latency
54
- puts "received all messages in %.3f seconds" % (elapsed_usecs / 1_000_000)
@@ -1,24 +0,0 @@
1
- require 'rubygems'
2
- require 'ffi-rzmq'
3
-
4
- if ARGV.length < 3
5
- puts "usage: local_lat <connect-to> <message-size> <roundtrip-count>"
6
- exit
7
- end
8
-
9
- bind_to = ARGV[0]
10
- message_size = ARGV[1].to_i
11
- roundtrip_count = ARGV[2].to_i
12
-
13
- ctx = ZMQ::Context.new 1
14
- s = ZMQ::Socket.new ctx.context, ZMQ::REP
15
- s.setsockopt ZMQ::HWM, 100
16
- s.bind bind_to
17
-
18
- msg = ZMQ::Message.new
19
-
20
- roundtrip_count.times do
21
- result = s.recv msg, 0
22
- raise "Message size doesn't match, expected [#{message_size}] but received [#{msg.size}]" if message_size != msg.size
23
- s.send msg, 0
24
- end
@@ -1,52 +0,0 @@
1
- require 'rubygems'
2
- require 'ffi-rzmq'
3
-
4
-
5
- link = "tcp://127.0.0.1:5555"
6
-
7
- ctx = ZMQ::Context.new 1
8
- s1 = ctx.socket ZMQ::PUB
9
- s2 = ctx.socket ZMQ::SUB
10
- s3 = ctx.socket ZMQ::SUB
11
- s4 = ctx.socket ZMQ::SUB
12
- s5 = ctx.socket ZMQ::SUB
13
-
14
- s2.setsockopt ZMQ::SUBSCRIBE, '' # receive all
15
- s3.setsockopt ZMQ::SUBSCRIBE, 'animals' # receive any starting with this string
16
- s4.setsockopt ZMQ::SUBSCRIBE, 'animals.dog'
17
- s5.setsockopt ZMQ::SUBSCRIBE, 'animals.cat'
18
-
19
- s1.bind link
20
- s2.connect link
21
- s3.connect link
22
- s4.connect link
23
- s5.connect link
24
-
25
- sleep 1
26
-
27
- topic = "animals.dog"
28
- payload = "Animal crackers!"
29
-
30
- s1.identity = "publisher-A"
31
- puts "sending"
32
- # use the new multi-part messaging support to
33
- # automatically separate the topic from the body
34
- s1.send_string topic, ZMQ::SNDMORE
35
- s1.send_string payload, ZMQ::SNDMORE
36
- s1.send_string s1.identity
37
-
38
- topic = s2.recv_string
39
- body = s2.recv_string if s2.more_parts?
40
- identity = s2.recv_string if s2.more_parts?
41
- puts "s2 received topic [#{topic}], body [#{body}], identity [#{identity}]"
42
-
43
- topic = s3.recv_string
44
- body = s3.recv_string if s3.more_parts?
45
- puts "s3 received topic [#{topic}], body [#{body}]"
46
-
47
- topic = s4.recv_string
48
- body = s4.recv_string if s4.more_parts?
49
- puts "s4 received topic [#{topic}], body [#{body}]"
50
-
51
- s5_string = s5.recv_string ZMQ::NOBLOCK
52
- puts(s5_string.nil? ? "s5 received no messages" : "s5 FAILED")
@@ -1,35 +0,0 @@
1
- require 'rubygems'
2
- require 'ffi-rzmq'
3
-
4
- if ARGV.length < 3
5
- puts "usage: remote_lat <connect-to> <message-size> <roundtrip-count>"
6
- exit
7
- end
8
-
9
- connect_to = ARGV[0]
10
- message_size = ARGV[1].to_i
11
- roundtrip_count = ARGV[2].to_i
12
-
13
- ctx = ZMQ::Context.new 1
14
- s = ctx.socket ZMQ::REQ
15
- s.connect connect_to
16
-
17
- msg = ZMQ::Message.new "#{'3'*message_size}"
18
-
19
- start_time = Time.now
20
-
21
- roundtrip_count.times do
22
- s.send msg, 0
23
- result = s.recv msg, 0
24
- raise "Message size doesn't match, expected [#{message_size}] but received [#{msg.size}]" if message_size != msg.size
25
- end
26
-
27
- end_time = Time.now
28
- elapsed_secs = (end_time.to_f - start_time.to_f)
29
- elapsed_usecs = elapsed_secs * 1000000
30
- latency = elapsed_usecs / roundtrip_count / 2
31
-
32
- puts "message size: %i [B]" % message_size
33
- puts "roundtrip count: %i" % roundtrip_count
34
- puts "throughput (msgs/s): %i" % (roundtrip_count / elapsed_secs)
35
- puts "mean latency: %.3f [us]" % latency
@@ -1,27 +0,0 @@
1
- require 'rubygems'
2
- require 'ffi-rzmq'
3
-
4
- if ARGV.length != 3
5
- puts "usage: remote_thr <connect-to> <message-size> <message-count>"
6
- Process.exit
7
- end
8
-
9
- connect_to = ARGV[0]
10
- message_size = ARGV[1].to_i
11
- message_count = ARGV[2].to_i
12
-
13
- ctx = ZMQ::Context.new
14
- s = ZMQ::Socket.new ctx.pointer, ZMQ::PUB
15
-
16
- s.connect connect_to
17
-
18
- contents = "#{'0'*message_size}"
19
-
20
- i = 0
21
- while i < message_count
22
- msg = ZMQ::Message.new contents
23
- s.send msg
24
- i += 1
25
- end
26
-
27
- sleep 10