cztop-reactor 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 7040196abcd091e72df775bcb4c4dc6ebca8781c
4
- data.tar.gz: 3da1c1b5f4ef14d63d2ef16d502c10de3cf8a0e7
2
+ SHA256:
3
+ metadata.gz: ebc72ede3239718ff03c2c29509a494c993d2d115bf07b4c3d5d748ea4f20ae6
4
+ data.tar.gz: 77596ee72fc148492039318ee36ba075152b96a963421d458c88df884b0d267f
5
5
  SHA512:
6
- metadata.gz: 2b7ccd0a2736e3cfc0af5408c1ee804ac1163c5f2ea730f9f21a3a6a5c17c71aa46784585d133cc510d3d85e07ad764b397f440bfb98c1f79c55abea6ec5dbf9
7
- data.tar.gz: '0845fbba1711499f0bee3caf9c09a893c9e0d4395cdb24f943bcded4113d8dade8c9cdd153ff979a7b4b19fb8ef709d8eef42f03e3320b10deb1c6399196afab'
6
+ metadata.gz: 0b2bf31a6cf841f39395dc04aa25ca80a0dbbbeddc267393410f77e072671c817c4e4d82dd0429e9869c1bf67c7f7f0dc91ab121cc2f66d5614727c6c56645fc
7
+ data.tar.gz: 470fca566a0285487be7ad4dbe6b3bdb40a8c61cb64c01b11d28b86e70bed17da5052efad30185216c9273a7fcc0afcaed4cfeb62aba99c67c164cbfcdb4cc6b
Binary file
data.tar.gz.sig CHANGED
Binary file
data/ChangeLog CHANGED
@@ -1,9 +1,23 @@
1
+ 2017-05-16 Michael Granger <ged@FaerieMUD.org>
2
+
3
+ * .hgtags:
4
+ Added tag v0.3.0 for changeset 93726ed1d11c
5
+ [4a5ff1ab5370] [tip]
6
+
7
+ * .hgsigs:
8
+ Added signature for changeset b27d8748d922
9
+ [93726ed1d11c] [v0.3.0]
10
+
11
+ * History.md, lib/cztop/reactor.rb:
12
+ Bumped the minor version, updated history.
13
+ [b27d8748d922]
14
+
1
15
  2017-05-15 Michael Granger <ged@FaerieMUD.org>
2
16
 
3
17
  * .hgignore, Manifest.txt, lib/cztop/reactor/signal_handling.rb,
4
18
  spec/cztop/reactor/signal_handling_spec.rb:
5
19
  Add a mixin for signal handling.
6
- [970a2eb110fb] [tip]
20
+ [970a2eb110fb]
7
21
 
8
22
  2017-04-30 Michael Granger <ged@FaerieMUD.org>
9
23
 
data/History.md CHANGED
@@ -1,3 +1,11 @@
1
+ ## v0.4.0 [2018-06-27] Michael Granger <ged@FaerieMUD.org>
2
+
3
+ Enhancements:
4
+
5
+ - Make the reactor threadsafe
6
+ - Guard against events with no sockets
7
+
8
+
1
9
  ## v0.3.0 [2017-05-15] Michael Granger <ged@FaerieMUD.org>
2
10
 
3
11
  Enhancements:
data/Rakefile CHANGED
@@ -54,6 +54,7 @@ task 'hg:precheckin' => [ :check_history, :check_manifest, :gemspec, :spec ]
54
54
  task :test => :spec
55
55
 
56
56
  # Rebuild the ChangeLog immediately before release
57
+ file 'ChangeLog'
57
58
  task :prerelease => 'ChangeLog'
58
59
  CLOBBER.include( 'ChangeLog' )
59
60
 
@@ -81,8 +82,10 @@ if File.directory?( '.hg' )
81
82
  end
82
83
  end
83
84
 
85
+ file 'Manifest.txt'
86
+
84
87
  task :gemspec => GEMSPEC
85
- file GEMSPEC => __FILE__
88
+ file GEMSPEC => [ 'Manifest.txt', 'ChangeLog', __FILE__ ]
86
89
  task GEMSPEC do |task|
87
90
  spec = $hoespec.spec
88
91
  spec.files.delete( '.gemtest' )
@@ -4,6 +4,7 @@
4
4
  require 'loggability'
5
5
  require 'timers'
6
6
  require 'ffi'
7
+ require 'monitor'
7
8
 
8
9
  require 'cztop'
9
10
  require 'cztop/poller'
@@ -20,9 +21,10 @@ require 'cztop/has_ffi_delegate'
20
21
  #
21
22
  class CZTop::Reactor
22
23
  extend Loggability
24
+ include MonitorMixin
23
25
 
24
26
  # The version of this library
25
- VERSION = '0.3.0'
27
+ VERSION = '0.4.0'
26
28
 
27
29
  # The maximum number of seconds to wait for events when there are no timers
28
30
  # registered.
@@ -63,6 +65,8 @@ class CZTop::Reactor
63
65
  CZTop::Poller::ZMQ.poller_destroy( ptr_ptr )
64
66
  })
65
67
  @event_ptr = ::FFI::MemoryPointer.new( CZTop::Poller::ZMQ::PollerEvent )
68
+
69
+ super
66
70
  end
67
71
 
68
72
 
@@ -107,18 +111,20 @@ class CZTop::Reactor
107
111
 
108
112
  raise LocalJumpError, "no block or handler given" unless handler
109
113
 
110
- self.unregister( socket )
114
+ self.synchronize do
115
+ self.unregister( socket )
111
116
 
112
- ptr = self.ptr_for_socket( socket )
113
- rc = CZTop::Poller::ZMQ.poller_add( @poller_ptr, ptr, nil, 0 )
114
- self.log.debug "poller_add: rc = %p" % [ rc ]
115
- CZTop::HasFFIDelegate.raise_zmq_err if rc == -1
117
+ ptr = self.ptr_for_socket( socket )
118
+ rc = CZTop::Poller::ZMQ.poller_add( @poller_ptr, ptr, nil, 0 )
119
+ self.log.debug "poller_add: rc = %p" % [ rc ]
120
+ CZTop::HasFFIDelegate.raise_zmq_err if rc == -1
116
121
 
117
- self.log.info "Registered: %p with handler: %p" % [ socket, handler ]
118
- self.sockets[ socket ][ :handler ] = handler
119
- self.enable_events( socket, *events )
122
+ self.log.info "Registered: %p with handler: %p" % [ socket, handler ]
123
+ self.sockets[ socket ][ :handler ] = handler
124
+ self.enable_events( socket, *events )
120
125
 
121
- @socket_pointers[ ptr.to_i ] = socket
126
+ @socket_pointers[ ptr.to_i ] = socket
127
+ end
122
128
  end
123
129
  alias_method :add, :register
124
130
  alias_method :register_socket, :register
@@ -128,15 +134,17 @@ class CZTop::Reactor
128
134
  ### handles, if present. Returns the handle if it was registered, or
129
135
  ### <tt>nil</tt> if it was not.
130
136
  def unregister( socket )
131
- if self.sockets.delete( socket )
132
- self.log.info "Unregistering: %p" % [ socket ]
133
- ptr = self.ptr_for_socket( socket )
134
- rc = CZTop::Poller::ZMQ.poller_remove( @poller_ptr, ptr )
135
- self.log.debug "poller_remove: rc = %p" % [ rc ]
136
- CZTop::HasFFIDelegate.raise_zmq_err if rc == -1
137
- end
137
+ self.synchronize do
138
+ if self.sockets.delete( socket )
139
+ self.log.info "Unregistering: %p" % [ socket ]
140
+ ptr = self.ptr_for_socket( socket )
141
+ rc = CZTop::Poller::ZMQ.poller_remove( @poller_ptr, ptr )
142
+ self.log.debug "poller_remove: rc = %p" % [ rc ]
143
+ CZTop::HasFFIDelegate.raise_zmq_err if rc == -1
144
+ end
138
145
 
139
- @socket_pointers.delete( ptr.to_i )
146
+ @socket_pointers.delete( ptr.to_i )
147
+ end
140
148
  end
141
149
  alias_method :remove, :unregister
142
150
  alias_method :unregister_socket, :unregister
@@ -156,12 +164,14 @@ class CZTop::Reactor
156
164
  raise ArgumentError, "invalid events: %p" % [ invalid ]
157
165
  end
158
166
 
159
- socket = self.socket_for_ptr( socket ) if socket.is_a?( FFI::Pointer )
160
- raise ArgumentError, "%p is not registered yet" % [ socket ] unless
161
- self.registered?( socket )
167
+ self.synchronize do
168
+ socket = self.socket_for_ptr( socket ) if socket.is_a?( FFI::Pointer )
169
+ raise ArgumentError, "%p is not registered yet" % [ socket ] unless
170
+ self.registered?( socket )
162
171
 
163
- self.sockets[ socket ][ :events ] |= events
164
- self.update_poller_for( socket )
172
+ self.sockets[ socket ][ :events ] |= events
173
+ self.update_poller_for( socket )
174
+ end
165
175
  end
166
176
  alias_method :enable_event, :enable_events
167
177
  alias_method :enable_socket_events, :enable_events
@@ -171,9 +181,11 @@ class CZTop::Reactor
171
181
  ### Remove the specified +events+ from the list that will be polled for on
172
182
  ### the given +socket+ handle.
173
183
  def disable_events( socket, *events )
174
- socket = self.socket_for_ptr( socket ) if socket.is_a?( FFI::Pointer )
175
- self.sockets[ socket ][:events] -= events
176
- self.update_poller_for( socket )
184
+ self.synchronize do
185
+ socket = self.socket_for_ptr( socket ) if socket.is_a?( FFI::Pointer )
186
+ self.sockets[ socket ][:events] -= events
187
+ self.update_poller_for( socket )
188
+ end
177
189
  end
178
190
  alias_method :disable_socket_events, :disable_events
179
191
 
@@ -197,9 +209,11 @@ class CZTop::Reactor
197
209
 
198
210
  ### Clear all registered sockets and returns the sockets that were cleared.
199
211
  def clear
200
- sockets = self.sockets.keys
201
- sockets.each {|sock| self.unregister(sock) }
202
- return sockets
212
+ self.synchronize do
213
+ sockets = self.sockets.keys
214
+ sockets.each {|sock| self.unregister(sock) }
215
+ return sockets
216
+ end
203
217
  end
204
218
 
205
219
 
@@ -348,11 +362,13 @@ class CZTop::Reactor
348
362
  ### Modify the underlying poller's event mask with the events +socket+ is
349
363
  ### interested in.
350
364
  def update_poller_for( socket )
351
- event_mask = self.mask_for( socket )
365
+ self.synchronize do
366
+ event_mask = self.mask_for( socket )
352
367
 
353
- ptr = self.ptr_for_socket( socket )
354
- rc = CZTop::Poller::ZMQ.poller_modify( @poller_ptr, ptr, event_mask )
355
- CZTop::HasFFIDelegate.raise_zmq_err if rc == -1
368
+ ptr = self.ptr_for_socket( socket )
369
+ rc = CZTop::Poller::ZMQ.poller_modify( @poller_ptr, ptr, event_mask )
370
+ CZTop::HasFFIDelegate.raise_zmq_err if rc == -1
371
+ end
356
372
  end
357
373
 
358
374
 
@@ -14,7 +14,7 @@ require 'cztop/reactor' unless defined?( CZTop::Reactor )
14
14
  # require 'cztop/reactor/signal_handling'
15
15
  #
16
16
  # class MyDaemon
17
- # include 'cztop/reactor/signal_handling'
17
+ # include CZTop::Reactor::SignalHandling
18
18
  #
19
19
  # def start
20
20
  # @reactor = CZTop::Reactor.new
@@ -133,7 +133,7 @@ module CZTop::Reactor::SignalHandling
133
133
 
134
134
  ### Set up signal traps for the specified +signals+.
135
135
  def set_signal_traps( *signals )
136
- self.log.debug "Setting up deferred signal handlers."
136
+ self.log.debug "Setting up deferred signal handlers for signals: %p." % [ signals ]
137
137
  signals.each do |sig|
138
138
  Signal.trap( sig ) do
139
139
  Thread.main[ SIGNAL_QUEUE_KEY ] << sig
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cztop-reactor
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Granger
@@ -10,9 +10,9 @@ bindir: bin
10
10
  cert_chain:
11
11
  - |
12
12
  -----BEGIN CERTIFICATE-----
13
- MIIEbDCCAtSgAwIBAgIBATANBgkqhkiG9w0BAQsFADA+MQwwCgYDVQQDDANnZWQx
13
+ MIIEbDCCAtSgAwIBAgIBATANBgkqhkiG9w0BAQUFADA+MQwwCgYDVQQDDANnZWQx
14
14
  GTAXBgoJkiaJk/IsZAEZFglGYWVyaWVNVUQxEzARBgoJkiaJk/IsZAEZFgNvcmcw
15
- HhcNMTYwODIwMTgxNzQyWhcNMTcwODIwMTgxNzQyWjA+MQwwCgYDVQQDDANnZWQx
15
+ HhcNMTcwOTI3MDAzMDQ0WhcNMTgwOTI3MDAzMDQ0WjA+MQwwCgYDVQQDDANnZWQx
16
16
  GTAXBgoJkiaJk/IsZAEZFglGYWVyaWVNVUQxEzARBgoJkiaJk/IsZAEZFgNvcmcw
17
17
  ggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQC/JWGRHO+USzR97vXjkFgt
18
18
  83qeNf2KHkcvrRTSnR64i6um/ziin0I0oX23H7VYrDJC9A/uoUa5nGRJS5Zw/+wW
@@ -25,17 +25,17 @@ cert_chain:
25
25
  /D+K9JW9DDs3Yjgv9k4h7YMhW5gftosd+NkNC/+Y2CkCAwEAAaN1MHMwCQYDVR0T
26
26
  BAIwADALBgNVHQ8EBAMCBLAwHQYDVR0OBBYEFHKN/nkRusdqCJEuq3lgB3fJvyTg
27
27
  MBwGA1UdEQQVMBOBEWdlZEBGYWVyaWVNVUQub3JnMBwGA1UdEgQVMBOBEWdlZEBG
28
- YWVyaWVNVUQub3JnMA0GCSqGSIb3DQEBCwUAA4IBgQAPJzKiT0zBU7kpqe0aS2qb
29
- FI0PJ4y5I8buU4IZGUD5NEt/N7pZNfOyBxkrZkXhS44Fp+xwBH5ebLbq/WY78Bqd
30
- db0z6ZgW4LMYMpWFfbXsRbd9TU2f52L8oMAhxOvF7Of5qJMVWuFQ8FPagk2iHrdH
31
- inYLQagqAF6goWTXgAJCdPd6SNeeSNqA6vlY7CV1Jh5kfNJJ6xu/CVij1GzCLu/5
32
- DMOr26DBv+qLJRRC/2h34uX71q5QgeOyxvMg+7V3u/Q06DXyQ2VgeeqiwDFFpEH0
33
- PFkdPO6ZqbTRcLfNH7mFgCBJjsfSjJrn0sPBlYyOXgCoByfZnZyrIMH/UY+lgQqS
34
- 6Von1VDsfQm0eJh5zYZD64ZF86phSR7mUX3mXItwH04HrZwkWpvgd871DZVR3i1n
35
- w8aNA5re5+Rt/Vvjxj5AcEnZnZiz5x959NaddQocX32Z1unHw44pzRNUur1GInfW
36
- p4vpx2kUSFSAGjtCbDGTNV2AH8w9OU4xEmNz8c5lyoA=
28
+ YWVyaWVNVUQub3JnMA0GCSqGSIb3DQEBBQUAA4IBgQB/qyi5pCjK8ceoKalfVAjS
29
+ vG64FEnLnD1bm39T5UaFIRmo+abZtfpg2QhwKvPbPjOicau2+m+MDQ2Cc3tgyaC3
30
+ dZxcP6w8APFg4AId09uWAZKf0xajvBMS2aOz8Bbmag6fwqRRkTMqsNYnmqcF7aRT
31
+ DuEzbEMfaOUYjU9RuB48vr4q8yRft0ww+3jq5iwNkrX1buL2pwBbyvgms6D/BV41
32
+ MaTVMjsHqJUwU2xVfhGtxGAWAer5S1HGYHkbio6mGVtiie0uWjmnzi7ppIlMr48a
33
+ 7BNTsoZ+/JRk3iQWmmNsyFT7xfqBKye7cH11BX8V8P4MeGB5YWlMI+Myj5DZY3fQ
34
+ st2AGD4rb1l0ia7PfubcBThSIdz61eCb8gRi/RiZZwb3/7+eyEncLJzt2Ob9fGSF
35
+ X0qdrKi+2aZZ0NGuFj9AItBsVmAvkBGIpX4TEKQp5haEbPpmaqO5nIIhV26PXmyT
36
+ OMKv6pWsoS81vw5KAGBmfX8nht/Py90DQrbRvakATGI=
37
37
  -----END CERTIFICATE-----
38
- date: 2017-05-16 00:00:00.000000000 Z
38
+ date: 2018-06-27 00:00:00.000000000 Z
39
39
  dependencies:
40
40
  - !ruby/object:Gem::Dependency
41
41
  name: loggability
@@ -99,14 +99,14 @@ dependencies:
99
99
  requirements:
100
100
  - - "~>"
101
101
  - !ruby/object:Gem::Version
102
- version: '0.8'
102
+ version: '0.9'
103
103
  type: :development
104
104
  prerelease: false
105
105
  version_requirements: !ruby/object:Gem::Requirement
106
106
  requirements:
107
107
  - - "~>"
108
108
  - !ruby/object:Gem::Version
109
- version: '0.8'
109
+ version: '0.9'
110
110
  - !ruby/object:Gem::Dependency
111
111
  name: hoe-highline
112
112
  requirement: !ruby/object:Gem::Requirement
@@ -169,14 +169,14 @@ dependencies:
169
169
  requirements:
170
170
  - - "~>"
171
171
  - !ruby/object:Gem::Version
172
- version: '3.15'
172
+ version: '3.16'
173
173
  type: :development
174
174
  prerelease: false
175
175
  version_requirements: !ruby/object:Gem::Requirement
176
176
  requirements:
177
177
  - - "~>"
178
178
  - !ruby/object:Gem::Version
179
- version: '3.15'
179
+ version: '3.16'
180
180
  description: |-
181
181
  This is an implementation of the Reactor pattern described in [Pattern-Oriented
182
182
  Software Architecture (Volume 2)][POSA2]. It allows an asynchronous application
@@ -244,7 +244,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
244
244
  version: '0'
245
245
  requirements: []
246
246
  rubyforge_project:
247
- rubygems_version: 2.6.8
247
+ rubygems_version: 2.7.6
248
248
  signing_key:
249
249
  specification_version: 4
250
250
  summary: This is an implementation of the Reactor pattern described in [Pattern-Oriented
metadata.gz.sig CHANGED
Binary file