cztop-reactor 0.3.0 → 0.4.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.
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