ffi-rzmq 0.8.2 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
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