em-zeromq 0.2.2 → 0.2.3
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.
- data/README.md +35 -6
- data/em-zeromq.gemspec +4 -4
- data/example/simple.rb +2 -2
- data/lib/em-zeromq/connection.rb +22 -5
- data/lib/em-zeromq/context.rb +6 -2
- data/lib/em-zeromq/rzmq_compat.rb +1 -27
- data/lib/em-zeromq/version.rb +1 -1
- data/spec/router_dealer_spec.rb +9 -7
- metadata +30 -18
data/README.md
CHANGED
@@ -1,19 +1,48 @@
|
|
1
1
|
# em-zeromq #
|
2
2
|
|
3
|
+
## Current maintainer ##
|
4
|
+
|
5
|
+
This gem is currently maintained by schmurfy, it will stay here for now
|
6
|
+
but may be moved to my account later.
|
7
|
+
|
3
8
|
## Description: ##
|
4
9
|
|
5
10
|
EventMachine support for ZeroMQ
|
6
11
|
|
7
12
|
## Usage: ##
|
8
13
|
|
9
|
-
|
14
|
+
Supported on:
|
15
|
+
- MRI 1.9+
|
16
|
+
- Rubinius
|
17
|
+
- JRuby
|
10
18
|
|
11
|
-
|
12
|
-
|
13
|
-
MRI 1.8.7 does not work with libzmq.
|
19
|
+
While the gem should work on Rubinius and JRuby I mainly use it with MRI 1.9+ so
|
20
|
+
there may be some glitchs.
|
14
21
|
|
15
22
|
Want to help out? Ask!
|
16
23
|
|
24
|
+
## Usage Warning ##
|
25
|
+
|
26
|
+
To ensure your zeromq context won't be reclaimed by the garbage collector you need
|
27
|
+
to keep a reference to it in scope, this is what you don't want to do (that's how the example used to be written):
|
28
|
+
|
29
|
+
```ruby
|
30
|
+
EM.run do
|
31
|
+
context = EM::ZeroMQ::Context.new(1)
|
32
|
+
dealer_socket = context.connect(...)
|
33
|
+
dealer_socket.send_msg('', "ping")
|
34
|
+
end
|
35
|
+
```
|
36
|
+
|
37
|
+
If you do this everything will appear to work fine at first but as soon as the garbage collector
|
38
|
+
is triggered your context will get destroyed and your application will hang.
|
39
|
+
|
40
|
+
The same may be true for references to socket but I have no evidence of that.
|
41
|
+
It should not be a major problem anyway since code like above is only written for examples/tests
|
42
|
+
but I just pulled my hair trying to figure out why my test code was not working so now you
|
43
|
+
have been warned !
|
44
|
+
|
45
|
+
|
17
46
|
## Example ##
|
18
47
|
```ruby
|
19
48
|
require 'rubygems'
|
@@ -30,9 +59,9 @@ class EMTestPullHandler
|
|
30
59
|
end
|
31
60
|
end
|
32
61
|
|
62
|
+
|
63
|
+
ctx = EM::ZeroMQ::Context.new(1)
|
33
64
|
EM.run do
|
34
|
-
ctx = EM::ZeroMQ::Context.new(1)
|
35
|
-
|
36
65
|
# setup push sockets
|
37
66
|
push_socket1 = ctx.bind( ZMQ::PUSH, 'tcp://127.0.0.1:2091')
|
38
67
|
push_socket2 = ctx.bind( ZMQ::PUSH, 'ipc:///tmp/a')
|
data/em-zeromq.gemspec
CHANGED
@@ -6,8 +6,8 @@ Gem::Specification.new do |s|
|
|
6
6
|
s.name = "em-zeromq"
|
7
7
|
s.version = EmZeromq::VERSION
|
8
8
|
s.platform = Gem::Platform::RUBY
|
9
|
-
s.authors = ["Andrew Cholakian"]
|
10
|
-
s.email = ["
|
9
|
+
s.authors = ["Andrew Cholakian", "Julien Ammous"]
|
10
|
+
s.email = ["schmurfy@gmail.com"]
|
11
11
|
s.homepage = "https://github.com/andrewvc/em-zeromq"
|
12
12
|
s.summary = %q{Low level event machine support for ZeroMQ}
|
13
13
|
s.description = %q{Low level event machine support for ZeroMQ}
|
@@ -15,9 +15,9 @@ Gem::Specification.new do |s|
|
|
15
15
|
|
16
16
|
s.rubyforge_project = "em-zeromq"
|
17
17
|
|
18
|
-
s.add_dependency 'eventmachine', '
|
18
|
+
s.add_dependency 'eventmachine', '1.0.0.beta.4'
|
19
19
|
s.add_dependency 'ffi', '>= 1.0.0'
|
20
|
-
s.add_dependency 'ffi-rzmq', '
|
20
|
+
s.add_dependency 'ffi-rzmq', '0.9.3'
|
21
21
|
|
22
22
|
s.add_development_dependency 'rspec', '>= 2.5.0'
|
23
23
|
s.add_development_dependency 'rake'
|
data/example/simple.rb
CHANGED
@@ -19,9 +19,9 @@ end
|
|
19
19
|
|
20
20
|
puts "Started (with zmq #{ZMQ::Util.version.join('.')})."
|
21
21
|
|
22
|
+
|
23
|
+
ctx = EM::ZeroMQ::Context.new(1)
|
22
24
|
EM.run do
|
23
|
-
ctx = EM::ZeroMQ::Context.new(1)
|
24
|
-
|
25
25
|
# setup push sockets
|
26
26
|
push_socket1 = ctx.bind( ZMQ::PUSH, 'tcp://127.0.0.1:2091')
|
27
27
|
push_socket2 = ctx.bind( ZMQ::PUSH, 'ipc:///tmp/a')
|
data/lib/em-zeromq/connection.rb
CHANGED
@@ -12,7 +12,7 @@ module EventMachine
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def self.map_sockopt(opt, name)
|
15
|
-
define_method(name){
|
15
|
+
define_method(name){ getsockopt(opt) }
|
16
16
|
define_method("#{name}="){|val| @socket.setsockopt(opt, val) }
|
17
17
|
end
|
18
18
|
|
@@ -68,13 +68,30 @@ module EventMachine
|
|
68
68
|
if sent
|
69
69
|
# all the previous parts were queued, send
|
70
70
|
# the last one
|
71
|
-
@socket.send_string(parts[-1], ZMQ::NOBLOCK)
|
71
|
+
ret = @socket.send_string(parts[-1], ZMQ::NOBLOCK)
|
72
|
+
if ret < 0
|
73
|
+
raise "Unable to send message: #{ZMQ::Util.error_string}"
|
74
|
+
end
|
72
75
|
else
|
73
76
|
# error while sending the previous parts
|
74
77
|
# register the socket for writability
|
75
78
|
self.notify_writable = true
|
76
|
-
false
|
79
|
+
sent = false
|
77
80
|
end
|
81
|
+
|
82
|
+
notify_readable()
|
83
|
+
|
84
|
+
sent
|
85
|
+
end
|
86
|
+
|
87
|
+
def getsockopt(opt)
|
88
|
+
ret = []
|
89
|
+
rc = @socket.getsockopt(opt, ret)
|
90
|
+
unless ZMQ::Util.resultcode_ok?(rc)
|
91
|
+
raise ZMQOperationFailed, "getsockopt: #{ZMQ::Util.error_string}"
|
92
|
+
end
|
93
|
+
|
94
|
+
(ret.size == 1) ? ret[0] : ret
|
78
95
|
end
|
79
96
|
|
80
97
|
def setsockopt(opt, value)
|
@@ -143,13 +160,13 @@ module EventMachine
|
|
143
160
|
end
|
144
161
|
end
|
145
162
|
def readable?
|
146
|
-
(
|
163
|
+
(getsockopt(ZMQ::EVENTS) & ZMQ::POLLIN) == ZMQ::POLLIN
|
147
164
|
end
|
148
165
|
|
149
166
|
def writable?
|
150
167
|
return true
|
151
168
|
# ZMQ::EVENTS has issues in ZMQ HEAD, we'll ignore this till they're fixed
|
152
|
-
# (
|
169
|
+
# (getsockopt(ZMQ::EVENTS) & ZMQ::POLLOUT) == ZMQ::POLLOUT
|
153
170
|
end
|
154
171
|
|
155
172
|
private
|
data/lib/em-zeromq/context.rb
CHANGED
@@ -45,8 +45,12 @@ module EventMachine
|
|
45
45
|
socket.connect(address)
|
46
46
|
end
|
47
47
|
|
48
|
-
fd =
|
49
|
-
|
48
|
+
fd = []
|
49
|
+
if socket.getsockopt(ZMQ::FD, fd) < 0
|
50
|
+
raise "Unable to get socket FD: #{ZMQ::Util.error_string}"
|
51
|
+
end
|
52
|
+
|
53
|
+
conn = EM.watch(fd[0], EventMachine::ZeroMQ::Connection, socket, socket_type, address, handler)
|
50
54
|
|
51
55
|
if READABLES.include?(socket_type)
|
52
56
|
conn.register_readable
|
@@ -4,39 +4,13 @@ module RZMQCompat
|
|
4
4
|
|
5
5
|
def self.included(klass)
|
6
6
|
klass.instance_eval do
|
7
|
-
%w(
|
7
|
+
%w(recv).each do |m|
|
8
8
|
alias_method :"#{m}_without_raise", m.to_sym
|
9
9
|
alias_method m.to_sym, :"#{m}_with_raise"
|
10
10
|
end
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
|
-
def getsockopt_with_raise(opt, *args)
|
15
|
-
arity = method(:getsockopt_without_raise).arity
|
16
|
-
if args.empty?
|
17
|
-
case arity
|
18
|
-
when 1
|
19
|
-
getsockopt_without_raise(opt)
|
20
|
-
|
21
|
-
when 2
|
22
|
-
ret = []
|
23
|
-
rc = getsockopt_without_raise(opt, ret)
|
24
|
-
unless ZMQ::Util.resultcode_ok?(rc)
|
25
|
-
raise ZMQOperationFailed, "getsockopt: #{ZMQ.errno}"
|
26
|
-
end
|
27
|
-
|
28
|
-
(ret.size == 1) ? ret[0] : ret
|
29
|
-
|
30
|
-
else
|
31
|
-
raise "Unsupported version of ffi-rzmq, getsockopt takes #{arity} arguments"
|
32
|
-
end
|
33
|
-
|
34
|
-
else
|
35
|
-
# just pass the call to the original method
|
36
|
-
getsockopt_without_raise(opt, *args)
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
14
|
def recv_with_raise(msg, flags = 0)
|
41
15
|
ret = recv_without_raise(msg, flags)
|
42
16
|
if (ret == true) || (ret == 0)
|
data/lib/em-zeromq/version.rb
CHANGED
data/spec/router_dealer_spec.rb
CHANGED
@@ -23,11 +23,10 @@ describe EventMachine::ZeroMQ do
|
|
23
23
|
@on_writable_callback.call(socket) if @on_writable_callback
|
24
24
|
end
|
25
25
|
def on_readable(socket, messages)
|
26
|
-
|
27
|
-
|
28
|
-
@received += [ident, delim, message].map {|s| ZMQ::Message.new(s)}
|
26
|
+
_, message = messages.map(&:copy_out_string)
|
27
|
+
@received += [message].map {|s| ZMQ::Message.new(s)}
|
29
28
|
|
30
|
-
socket.send_msg(
|
29
|
+
socket.send_msg('', "re:#{message}")
|
31
30
|
end
|
32
31
|
end
|
33
32
|
|
@@ -44,16 +43,19 @@ describe EventMachine::ZeroMQ do
|
|
44
43
|
results = {}
|
45
44
|
@test_message = test_message = "M#{rand(999)}"
|
46
45
|
|
47
|
-
run_reactor(
|
46
|
+
run_reactor(2) do
|
48
47
|
results[:dealer_hndlr] = dealer_hndlr = EMTestDealerHandler.new
|
49
48
|
results[:router_hndlr] = router_hndlr = EMTestRouterHandler.new
|
50
49
|
|
51
50
|
addr = rand_addr
|
52
51
|
dealer_conn = SPEC_CTX.bind(ZMQ::DEALER, addr, dealer_hndlr, :identity => "dealer1")
|
53
52
|
router_conn = SPEC_CTX.connect(ZMQ::ROUTER, addr, router_hndlr, :identity => "router1")
|
54
|
-
|
53
|
+
|
54
|
+
EM::add_timer(0.1) do
|
55
|
+
router_conn.send_msg('dealer1','', test_message)
|
56
|
+
end
|
55
57
|
|
56
|
-
EM::Timer.new(0.
|
58
|
+
EM::Timer.new(0.2) do
|
57
59
|
results[:specs_ran] = true
|
58
60
|
end
|
59
61
|
end
|
metadata
CHANGED
@@ -1,30 +1,31 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: em-zeromq
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Andrew Cholakian
|
9
|
+
- Julien Ammous
|
9
10
|
autorequire:
|
10
11
|
bindir: bin
|
11
12
|
cert_chain: []
|
12
|
-
date:
|
13
|
+
date: 2012-02-23 00:00:00.000000000 Z
|
13
14
|
dependencies:
|
14
15
|
- !ruby/object:Gem::Dependency
|
15
16
|
name: eventmachine
|
16
|
-
requirement: &
|
17
|
+
requirement: &70154900691620 !ruby/object:Gem::Requirement
|
17
18
|
none: false
|
18
19
|
requirements:
|
19
|
-
- -
|
20
|
+
- - =
|
20
21
|
- !ruby/object:Gem::Version
|
21
22
|
version: 1.0.0.beta.4
|
22
23
|
type: :runtime
|
23
24
|
prerelease: false
|
24
|
-
version_requirements: *
|
25
|
+
version_requirements: *70154900691620
|
25
26
|
- !ruby/object:Gem::Dependency
|
26
27
|
name: ffi
|
27
|
-
requirement: &
|
28
|
+
requirement: &70154900707520 !ruby/object:Gem::Requirement
|
28
29
|
none: false
|
29
30
|
requirements:
|
30
31
|
- - ! '>='
|
@@ -32,21 +33,21 @@ dependencies:
|
|
32
33
|
version: 1.0.0
|
33
34
|
type: :runtime
|
34
35
|
prerelease: false
|
35
|
-
version_requirements: *
|
36
|
+
version_requirements: *70154900707520
|
36
37
|
- !ruby/object:Gem::Dependency
|
37
38
|
name: ffi-rzmq
|
38
|
-
requirement: &
|
39
|
+
requirement: &70154900707060 !ruby/object:Gem::Requirement
|
39
40
|
none: false
|
40
41
|
requirements:
|
41
|
-
- -
|
42
|
+
- - =
|
42
43
|
- !ruby/object:Gem::Version
|
43
|
-
version: 0.9.
|
44
|
+
version: 0.9.3
|
44
45
|
type: :runtime
|
45
46
|
prerelease: false
|
46
|
-
version_requirements: *
|
47
|
+
version_requirements: *70154900707060
|
47
48
|
- !ruby/object:Gem::Dependency
|
48
49
|
name: rspec
|
49
|
-
requirement: &
|
50
|
+
requirement: &70154900706600 !ruby/object:Gem::Requirement
|
50
51
|
none: false
|
51
52
|
requirements:
|
52
53
|
- - ! '>='
|
@@ -54,10 +55,10 @@ dependencies:
|
|
54
55
|
version: 2.5.0
|
55
56
|
type: :development
|
56
57
|
prerelease: false
|
57
|
-
version_requirements: *
|
58
|
+
version_requirements: *70154900706600
|
58
59
|
- !ruby/object:Gem::Dependency
|
59
60
|
name: rake
|
60
|
-
requirement: &
|
61
|
+
requirement: &70154900706220 !ruby/object:Gem::Requirement
|
61
62
|
none: false
|
62
63
|
requirements:
|
63
64
|
- - ! '>='
|
@@ -65,10 +66,10 @@ dependencies:
|
|
65
66
|
version: '0'
|
66
67
|
type: :development
|
67
68
|
prerelease: false
|
68
|
-
version_requirements: *
|
69
|
+
version_requirements: *70154900706220
|
69
70
|
description: Low level event machine support for ZeroMQ
|
70
71
|
email:
|
71
|
-
-
|
72
|
+
- schmurfy@gmail.com
|
72
73
|
executables: []
|
73
74
|
extensions: []
|
74
75
|
extra_rdoc_files: []
|
@@ -105,16 +106,27 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
105
106
|
- - ! '>='
|
106
107
|
- !ruby/object:Gem::Version
|
107
108
|
version: '0'
|
109
|
+
segments:
|
110
|
+
- 0
|
111
|
+
hash: -3798582032913593030
|
108
112
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
109
113
|
none: false
|
110
114
|
requirements:
|
111
115
|
- - ! '>='
|
112
116
|
- !ruby/object:Gem::Version
|
113
117
|
version: '0'
|
118
|
+
segments:
|
119
|
+
- 0
|
120
|
+
hash: -3798582032913593030
|
114
121
|
requirements: []
|
115
122
|
rubyforge_project: em-zeromq
|
116
|
-
rubygems_version: 1.8.
|
123
|
+
rubygems_version: 1.8.15
|
117
124
|
signing_key:
|
118
125
|
specification_version: 3
|
119
126
|
summary: Low level event machine support for ZeroMQ
|
120
|
-
test_files:
|
127
|
+
test_files:
|
128
|
+
- spec/context_spec.rb
|
129
|
+
- spec/pub_sub_spec.rb
|
130
|
+
- spec/push_pull_spec.rb
|
131
|
+
- spec/router_dealer_spec.rb
|
132
|
+
- spec/spec_helper.rb
|