zmqmachine 0.3.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,14 @@
1
+ html
2
+ pkg
3
+ doc
4
+ *.gem
5
+ *.rbc
6
+ *.tmproj
7
+ nbproject
8
+ *.bundle
9
+ *.o
10
+ .DS_Store
11
+ examples/work
12
+ benchmark
13
+ *~
14
+ *#*
data/History.txt CHANGED
@@ -1,3 +1,10 @@
1
+ == 0.3.1 / 2010-08-16
2
+ * Forgot to load the xreq/xrep files during startup
3
+ * Added support for resetting a timer's firing schedule. Useful for when
4
+ the time source has been overridden; let's existing timers
5
+ reschedule themselves using the new time source.
6
+ * Fixed a logic bug with delivery of multi-part messages
7
+
1
8
  == 0.3.0 / 2010-08-15
2
9
  * Added XREQ/XREP socket types
3
10
  * Moved the time functions for ZM::Timers into a pair of
data/examples/fake_ftp.rb CHANGED
@@ -81,6 +81,10 @@ class FTPControlClient
81
81
  def on_attach socket
82
82
  @socket = socket
83
83
  rc = socket.connect @address
84
+
85
+ # REQ sockets do not register for read events by default, so we need
86
+ # to turn that on here
87
+ @context.register_readable socket
84
88
  end
85
89
 
86
90
  def on_readable socket, messages
@@ -28,18 +28,25 @@ class PingPongHandler
28
28
  rc = socket.bind address
29
29
  when :request
30
30
  rc = socket.connect address
31
- rc = socket.send_message_string "#{'a' * 2048}"
32
- @sent_count += 1
31
+ @context.register_readable socket
33
32
  end
34
33
  end
35
34
 
35
+ def on_writable socket
36
+ rc = socket.send_message_string "#{'a' * 2048}"
37
+ @sent_count += 1
38
+
39
+ # after sending the first message, deregister for future write events
40
+ @context.deregister_writable socket
41
+ end
42
+
36
43
  def on_readable socket, messages
37
44
  @received_count += 1
38
45
 
39
- case socket.kind
40
- when :reply
41
- socket.send_message messages.first
42
- when :request
46
+ if :reply == socket.kind
47
+ #socket.send_message messages.first
48
+ rc = socket.send_message_string messages.first.copy_out_string
49
+ else
43
50
  socket.send_message messages.first
44
51
  end
45
52
 
data/lib/zm/reactor.rb CHANGED
@@ -3,14 +3,14 @@
3
3
  # Author:: Chuck Remes
4
4
  # Homepage:: http://github.com/chuckremes/zmqmachine
5
5
  # Date:: 20100602
6
- #
6
+ #
7
7
  #----------------------------------------------------------------------------
8
8
  #
9
9
  # Copyright (C) 2010 by Chuck Remes. All Rights Reserved.
10
10
  # Email: cremes at mac dot com
11
- #
11
+ #
12
12
  # (The MIT License)
13
- #
13
+ #
14
14
  # Permission is hereby granted, free of charge, to any person obtaining
15
15
  # a copy of this software and associated documentation files (the
16
16
  # 'Software'), to deal in the Software without restriction, including
@@ -18,10 +18,10 @@
18
18
  # distribute, sublicense, and/or sell copies of the Software, and to
19
19
  # permit persons to whom the Software is furnished to do so, subject to
20
20
  # the following conditions:
21
- #
21
+ #
22
22
  # The above copyright notice and this permission notice shall be
23
23
  # included in all copies or substantial portions of the Software.
24
- #
24
+ #
25
25
  # THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
26
26
  # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
27
27
  # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
@@ -32,13 +32,13 @@
32
32
  #
33
33
  #---------------------------------------------------------------------------
34
34
  #
35
- #
35
+ #
36
36
 
37
37
  module ZMQMachine
38
38
 
39
39
  class Reactor
40
40
  attr_reader :name
41
-
41
+
42
42
  # +poll_interval+ is the number of milliseconds to block while
43
43
  # waiting for new 0mq socket events; default is 0
44
44
  #
@@ -61,7 +61,7 @@ module ZMQMachine
61
61
  end
62
62
 
63
63
  # Returns true when the reactor is running OR while it is in the
64
- # midst of a shutdown request.
64
+ # midst of a shutdown request.
65
65
  #
66
66
  # Returns false when the reactor thread does not exist.
67
67
  #
@@ -124,12 +124,12 @@ module ZMQMachine
124
124
  end
125
125
  end
126
126
  end
127
-
127
+
128
128
  # Kills the running reactor instance by terminating its thread.
129
129
  #
130
130
  # After the thread exits, the reactor attempts to clean up after itself
131
131
  # and kill any pending I/O.
132
- #
132
+ #
133
133
  def kill
134
134
  @stopping = true
135
135
  @thread.kill
@@ -273,7 +273,7 @@ module ZMQMachine
273
273
  save_socket sock
274
274
  sock
275
275
  end
276
-
276
+
277
277
  # Registers the +sock+ for POLLOUT events that will cause the
278
278
  # reactor to call the handler's on_writable method.
279
279
  #
@@ -332,6 +332,15 @@ module ZMQMachine
332
332
  def cancel_timer timer
333
333
  @timers.cancel timer
334
334
  end
335
+
336
+ # Asks all timers to reschedule themselves starting from Timers.now.
337
+ # Typically called when the underlying time source for the ZM::Timers
338
+ # class has been replaced; existing timers may not fire as expected, so
339
+ # we ask them to reset themselves.
340
+ #
341
+ def reschedule_timers
342
+ @timers.reschedule
343
+ end
335
344
 
336
345
 
337
346
  private
@@ -113,8 +113,8 @@ module ZMQMachine
113
113
  #
114
114
  # May raise a ZMQ::SocketError.
115
115
  #
116
- def send_message_string message
117
- queued = @raw_socket.send_string message, ZMQ::NOBLOCK
116
+ def send_message_string message, multipart = false
117
+ queued = @raw_socket.send_string message, ZMQ::NOBLOCK | (multipart ? ZMQ::SNDMORE : 0)
118
118
  queued
119
119
  end
120
120
 
@@ -159,15 +159,19 @@ module ZMQMachine
159
159
  def resume_read
160
160
  messages = []
161
161
  rc = read_message_part messages
162
+ #puts "resume_read: rc1 [#{rc}], more_parts? [#{@raw_socket.more_parts?}]"
162
163
 
163
164
  while 0 == rc && @raw_socket.more_parts?
165
+ #puts "get next part"
164
166
  rc = read_message_part messages
167
+ #puts "resume_read: rc2 [#{rc}]"
165
168
  end
169
+ #puts "no more parts, ready to deliver"
166
170
 
167
171
  # only deliver the messages when rc is 0; otherwise, we
168
172
  # may have gotten EAGAIN and no message was read;
169
173
  # don't deliver empty messages
170
- deliver messages, rc unless 0 == rc
174
+ deliver messages, rc if 0 == rc
171
175
  end
172
176
 
173
177
  # Used by the reactor. Never called by user code.
@@ -201,6 +205,7 @@ module ZMQMachine
201
205
  end
202
206
 
203
207
  def deliver messages, rc
208
+ #puts "deliver: rc [#{rc}], messages #{messages.inspect}"
204
209
  if 0 == rc
205
210
  @state = :ready
206
211
  @handler.on_readable self, messages
data/lib/zm/sockets.rb CHANGED
@@ -1,4 +1,4 @@
1
1
 
2
- %w( base req rep pair pub sub ).each do |rb_file|
2
+ %w( base req rep pair pub sub xreq xrep ).each do |rb_file|
3
3
  require File.join(File.dirname(__FILE__), 'sockets', rb_file)
4
4
  end
data/lib/zm/timers.rb CHANGED
@@ -122,6 +122,19 @@ module ZMQMachine
122
122
  save.each { |timer| @timers.add timer }
123
123
  end
124
124
 
125
+ # Runs through all timers and asks each one to reschedule itself
126
+ # from Timers.now + whatever delay was originally recorded.
127
+ #
128
+ def reschedule
129
+ timers = @timers.dup
130
+ @timers.clear
131
+
132
+ timers.each do |timer|
133
+ timer.reschedule
134
+ @timers.add timer
135
+ end
136
+ end
137
+
125
138
  # Returns the current time using the following algo:
126
139
  #
127
140
  # (Time.now.to_f * 1000).to_i
@@ -158,6 +171,7 @@ module ZMQMachine
158
171
  attr_reader :fire_time
159
172
 
160
173
  # +time+ is in milliseconds
174
+ #
161
175
  def initialize timers, delay, periodical, timer_proc = nil, &blk
162
176
  @timers = timers
163
177
  @delay = delay.to_i
@@ -178,6 +192,8 @@ module ZMQMachine
178
192
  schedule_firing_time if @periodical
179
193
  end
180
194
 
195
+ # Cancels this timer from firing.
196
+ #
181
197
  def cancel
182
198
  @timers.cancel self
183
199
  end
@@ -186,14 +202,22 @@ module ZMQMachine
186
202
  self.fire_time <=> other.fire_time
187
203
  end
188
204
 
205
+ # True when the timer should be fired; false otherwise.
206
+ #
189
207
  def expired? time
190
208
  time ||= now
191
209
  time > @fire_time
192
210
  end
193
211
 
212
+ # True when this is a periodical timer; false otherwise.
213
+ #
194
214
  def periodical?
195
215
  @periodical
196
216
  end
217
+
218
+ def reschedule
219
+ schedule_firing_time
220
+ end
197
221
 
198
222
 
199
223
  private
@@ -209,12 +233,11 @@ module ZMQMachine
209
233
  # next timer to fire at, 17 + delay 5 = 22
210
234
  # had it not been late, it would fire at 20
211
235
  def schedule_firing_time
212
- @fire_time = now + @delay
236
+ @initiated = Timers.now
237
+
238
+ @fire_time = @initiated + @delay
213
239
  end
214
240
 
215
- def now
216
- Timers.now
217
- end
218
241
  end # class Timer
219
242
 
220
243
  end # module ZMQMachine
data/version.txt CHANGED
@@ -1 +1 @@
1
- 0.3.0
1
+ 0.3.1
data/zmqmachine.gemspec CHANGED
@@ -2,11 +2,11 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{zmqmachine}
5
- s.version = "0.3.0"
5
+ s.version = "0.3.1"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Chuck Remes"]
9
- s.date = %q{2010-08-15}
9
+ s.date = %q{2010-08-16}
10
10
  s.description = %q{ZMQMachine is another Ruby implementation of the reactor pattern but this
11
11
  time using 0mq sockets rather than POSIX sockets.
12
12
 
@@ -22,7 +22,7 @@ It is possible to extend the 0mq library to "poll" normal file
22
22
  descriptors. This isn't on my roadmap but patches are accepted.}
23
23
  s.email = %q{cremes@mac.com}
24
24
  s.extra_rdoc_files = ["History.txt", "README.rdoc", "version.txt"]
25
- s.files = [".bnsignore", "History.txt", "README.rdoc", "Rakefile", "examples/fake_ftp.rb", "examples/one_handed_ping_pong.rb", "examples/ping_pong.rb", "examples/pub_sub.rb", "examples/throttled_ping_pong.rb", "lib/zm/address.rb", "lib/zm/deferrable.rb", "lib/zm/exceptions.rb", "lib/zm/message.rb", "lib/zm/reactor.rb", "lib/zm/sockets.rb", "lib/zm/sockets/base.rb", "lib/zm/sockets/pair.rb", "lib/zm/sockets/pub.rb", "lib/zm/sockets/rep.rb", "lib/zm/sockets/req.rb", "lib/zm/sockets/sub.rb", "lib/zm/sockets/xrep.rb", "lib/zm/sockets/xreq.rb", "lib/zm/timers.rb", "lib/zmqmachine.rb", "spec/spec_helper.rb", "spec/zmqmachine_spec.rb", "version.txt", "zmqmachine.gemspec"]
25
+ s.files = [".bnsignore", ".gitignore", "History.txt", "README.rdoc", "Rakefile", "examples/fake_ftp.rb", "examples/one_handed_ping_pong.rb", "examples/ping_pong.rb", "examples/pub_sub.rb", "examples/throttled_ping_pong.rb", "lib/zm/address.rb", "lib/zm/deferrable.rb", "lib/zm/exceptions.rb", "lib/zm/message.rb", "lib/zm/reactor.rb", "lib/zm/sockets.rb", "lib/zm/sockets/base.rb", "lib/zm/sockets/pair.rb", "lib/zm/sockets/pub.rb", "lib/zm/sockets/rep.rb", "lib/zm/sockets/req.rb", "lib/zm/sockets/sub.rb", "lib/zm/sockets/xrep.rb", "lib/zm/sockets/xreq.rb", "lib/zm/timers.rb", "lib/zmqmachine.rb", "spec/spec_helper.rb", "spec/zmqmachine_spec.rb", "version.txt", "zmqmachine.gemspec"]
26
26
  s.homepage = %q{http://github.com/chuckremes/zmqmachine}
27
27
  s.rdoc_options = ["--main", "README.rdoc"]
28
28
  s.require_paths = ["lib"]
@@ -36,13 +36,13 @@ descriptors. This isn't on my roadmap but patches are accepted.}
36
36
 
37
37
  if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
38
38
  s.add_runtime_dependency(%q<ffi-rzmq>, [">= 0.5.0"])
39
- s.add_development_dependency(%q<bones>, [">= 3.4.3"])
39
+ s.add_development_dependency(%q<bones>, [">= 3.4.7"])
40
40
  else
41
41
  s.add_dependency(%q<ffi-rzmq>, [">= 0.5.0"])
42
- s.add_dependency(%q<bones>, [">= 3.4.3"])
42
+ s.add_dependency(%q<bones>, [">= 3.4.7"])
43
43
  end
44
44
  else
45
45
  s.add_dependency(%q<ffi-rzmq>, [">= 0.5.0"])
46
- s.add_dependency(%q<bones>, [">= 3.4.3"])
46
+ s.add_dependency(%q<bones>, [">= 3.4.7"])
47
47
  end
48
48
  end
metadata CHANGED
@@ -3,48 +3,48 @@ name: zmqmachine
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
- - 0
7
- - 3
8
- - 0
9
- version: 0.3.0
6
+ - 0
7
+ - 3
8
+ - 1
9
+ version: 0.3.1
10
10
  platform: ruby
11
11
  authors:
12
- - Chuck Remes
12
+ - Chuck Remes
13
13
  autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-08-15 00:00:00 -05:00
17
+ date: 2010-08-16 00:00:00 -05:00
18
18
  default_executable:
19
19
  dependencies:
20
- - !ruby/object:Gem::Dependency
21
- name: ffi-rzmq
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
24
- requirements:
25
- - - ">="
26
- - !ruby/object:Gem::Version
27
- segments:
28
- - 0
29
- - 5
30
- - 0
31
- version: 0.5.0
32
- type: :runtime
33
- version_requirements: *id001
34
- - !ruby/object:Gem::Dependency
35
- name: bones
36
- prerelease: false
37
- requirement: &id002 !ruby/object:Gem::Requirement
38
- requirements:
39
- - - ">="
40
- - !ruby/object:Gem::Version
41
- segments:
42
- - 3
43
- - 4
44
- - 3
45
- version: 3.4.3
46
- type: :development
47
- version_requirements: *id002
20
+ - !ruby/object:Gem::Dependency
21
+ name: ffi-rzmq
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ segments:
28
+ - 0
29
+ - 5
30
+ - 0
31
+ version: 0.5.0
32
+ type: :runtime
33
+ version_requirements: *id001
34
+ - !ruby/object:Gem::Dependency
35
+ name: bones
36
+ prerelease: false
37
+ requirement: &id002 !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ segments:
42
+ - 3
43
+ - 4
44
+ - 7
45
+ version: 3.4.7
46
+ type: :development
47
+ version_requirements: *id002
48
48
  description: |-
49
49
  ZMQMachine is another Ruby implementation of the reactor pattern but this
50
50
  time using 0mq sockets rather than POSIX sockets.
@@ -65,63 +65,64 @@ executables: []
65
65
  extensions: []
66
66
 
67
67
  extra_rdoc_files:
68
- - History.txt
69
- - README.rdoc
70
- - version.txt
68
+ - History.txt
69
+ - README.rdoc
70
+ - version.txt
71
71
  files:
72
- - .bnsignore
73
- - History.txt
74
- - README.rdoc
75
- - Rakefile
76
- - examples/fake_ftp.rb
77
- - examples/one_handed_ping_pong.rb
78
- - examples/ping_pong.rb
79
- - examples/pub_sub.rb
80
- - examples/throttled_ping_pong.rb
81
- - lib/zm/address.rb
82
- - lib/zm/deferrable.rb
83
- - lib/zm/exceptions.rb
84
- - lib/zm/message.rb
85
- - lib/zm/reactor.rb
86
- - lib/zm/sockets.rb
87
- - lib/zm/sockets/base.rb
88
- - lib/zm/sockets/pair.rb
89
- - lib/zm/sockets/pub.rb
90
- - lib/zm/sockets/rep.rb
91
- - lib/zm/sockets/req.rb
92
- - lib/zm/sockets/sub.rb
93
- - lib/zm/sockets/xrep.rb
94
- - lib/zm/sockets/xreq.rb
95
- - lib/zm/timers.rb
96
- - lib/zmqmachine.rb
97
- - spec/spec_helper.rb
98
- - spec/zmqmachine_spec.rb
99
- - version.txt
100
- - zmqmachine.gemspec
72
+ - .bnsignore
73
+ - .gitignore
74
+ - History.txt
75
+ - README.rdoc
76
+ - Rakefile
77
+ - examples/fake_ftp.rb
78
+ - examples/one_handed_ping_pong.rb
79
+ - examples/ping_pong.rb
80
+ - examples/pub_sub.rb
81
+ - examples/throttled_ping_pong.rb
82
+ - lib/zm/address.rb
83
+ - lib/zm/deferrable.rb
84
+ - lib/zm/exceptions.rb
85
+ - lib/zm/message.rb
86
+ - lib/zm/reactor.rb
87
+ - lib/zm/sockets.rb
88
+ - lib/zm/sockets/base.rb
89
+ - lib/zm/sockets/pair.rb
90
+ - lib/zm/sockets/pub.rb
91
+ - lib/zm/sockets/rep.rb
92
+ - lib/zm/sockets/req.rb
93
+ - lib/zm/sockets/sub.rb
94
+ - lib/zm/sockets/xrep.rb
95
+ - lib/zm/sockets/xreq.rb
96
+ - lib/zm/timers.rb
97
+ - lib/zmqmachine.rb
98
+ - spec/spec_helper.rb
99
+ - spec/zmqmachine_spec.rb
100
+ - version.txt
101
+ - zmqmachine.gemspec
101
102
  has_rdoc: true
102
103
  homepage: http://github.com/chuckremes/zmqmachine
103
104
  licenses: []
104
105
 
105
106
  post_install_message:
106
107
  rdoc_options:
107
- - --main
108
- - README.rdoc
108
+ - --main
109
+ - README.rdoc
109
110
  require_paths:
110
- - lib
111
+ - lib
111
112
  required_ruby_version: !ruby/object:Gem::Requirement
112
113
  requirements:
113
- - - ">="
114
- - !ruby/object:Gem::Version
115
- segments:
116
- - 0
117
- version: "0"
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ segments:
117
+ - 0
118
+ version: "0"
118
119
  required_rubygems_version: !ruby/object:Gem::Requirement
119
120
  requirements:
120
- - - ">="
121
- - !ruby/object:Gem::Version
122
- segments:
123
- - 0
124
- version: "0"
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ segments:
124
+ - 0
125
+ version: "0"
125
126
  requirements: []
126
127
 
127
128
  rubyforge_project: zmqmachine