wires 0.5.7 → 0.5.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/wires/base/channel.rb +25 -17
  3. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e9f2487653b2bc09e49a835f4945890973744d1a
4
- data.tar.gz: 273bf1a229f890c1a1bae0e7002cfa8c99c56e2d
3
+ metadata.gz: 5b26a6c6020e7909d89cd9a3f87da0e721ffe9ea
4
+ data.tar.gz: 021904136183e2874fb7cc9e054642cf1a8dd04b
5
5
  SHA512:
6
- metadata.gz: a087b9a5bc3c6cc604d1272401e24d0e428b9868b6c3a615384bd35af3862b5ef896832bbb6d6c671b683871f8993ca6630ad37b53eff1f1ce418cb075ca888b
7
- data.tar.gz: f6fd9105f3d1cbc90489e2e933065214657463a261e94de1fe85faac8f2c609689b303b6384bd6f50e388ccfd0b5689418c7caf6533406324700baf22ee89c62
6
+ metadata.gz: 46a6c48fe72d56da690f27811eac4087560c1b7eb24e53c1e066543eb3036add3965706092a19ba6dfd6a7275f7a6a7a74c8cda5318426b3fff3b747ac00f081
7
+ data.tar.gz: f2d03f3ff04f99d04158b6170f02b44f661b1bc171c1f275a0898e95bbeda923a5f080a011ee6b1b87545b03321f2d81fd2e298b9d7d20a96731f0ce202e7b12
@@ -101,7 +101,7 @@ module Wires.current_network::Namespace
101
101
  # then the handler is executed, and yielded the event object and the {#name}
102
102
  # of the channel upon which {#fire} was called as arguments.
103
103
  #
104
- # @param *events [<Symbol, Event>] the event pattern(s)
104
+ # @param events [<Symbol, Event>] the event pattern(s)
105
105
  # to listen for. If the pattern is a symbol or event with a type and no
106
106
  # other arguments, any event with that type will be heard. If the
107
107
  # pattern is an event that has other arguments, each of the arguments
@@ -109,7 +109,7 @@ module Wires.current_network::Namespace
109
109
  # fired event for it to be heard by the handler, but the fired event may
110
110
  # also include other arguments that were not declared in the pattern
111
111
  # and still be heard by the handler (see {Event#=~}).
112
- # @param &callable [Proc] the executable code to register as a handler
112
+ # @param callable [Proc] the executable code to register as a handler
113
113
  # on this channel for the given pattern.
114
114
  #
115
115
  # @return [Proc] the +&callable+ given, which has been extended with an
@@ -167,7 +167,7 @@ module Wires.current_network::Namespace
167
167
  # the +#unregister+ method that was injected into the +&callable+
168
168
  # (refer to the return value of {#register})
169
169
  #
170
- # @param &callable [Proc] the same callable object that was given to
170
+ # @param callable [Proc] the same callable object that was given to
171
171
  # (and returned by) {#register}.
172
172
  #
173
173
  # @return [Boolean] +true+ if the callable was previously {#register}ed
@@ -208,9 +208,9 @@ module Wires.current_network::Namespace
208
208
  # @param [Event, Symbol] event the event to be fired, as an Event or Symbol.
209
209
  # In this context, a Symbol is treated as an 'empty' Event of that type
210
210
  # (see to {Symbol#[]}).
211
- # @param [Boolean] :blocking when true, the method will wait to return
211
+ # @param [Boolean] blocking when true, the method will wait to return
212
212
  # until all handlers have finished their execution.
213
- # @param [Boolean] :parallel when true, the handlers will be executed in
213
+ # @param [Boolean] parallel when true, the handlers will be executed in
214
214
  # parallel, if there are more than one; otherwise, they will be executed
215
215
  # serially (in an undefined order). Unless otherwise specified, this
216
216
  # parameter will be set to the opposite of the value of the +:blocking+
@@ -292,9 +292,9 @@ module Wires.current_network::Namespace
292
292
  end
293
293
 
294
294
  # Synchronize execution of this thread to an incoming event.
295
- # The user block will be executed, and will not return until a matching
296
- # incoming event has been fired
297
- # (see the {SyncHelper})
295
+ # The user block will be executed, and will not return until a matching
296
+ # incoming event has been fired
297
+ # (see the {SyncHelper})
298
298
  #
299
299
  # @note In order to use this method correctly, the "action" that causes the
300
300
  # incoming event to be fired should happen within the user block. If
@@ -303,26 +303,27 @@ module Wires.current_network::Namespace
303
303
  # As long as the feedback event happens after execution of the user block
304
304
  # has begun, the event is guaranteed to be caught and processed.
305
305
  #
306
- # @param *events [<Symbol, Event>] the event pattern(s) filter
306
+ # @param events [<Symbol, Event>] the event pattern(s) filter
307
307
  # to listen with. (see {#register}).
308
308
  # @param timeout [Fixnum] the timeout, in seconds.
309
309
  # (see {SyncHelper#wait}).
310
- # @param &block [Proc] the user block. This block will be executed inline
310
+ # @param block [Proc] the user block. This block will be executed inline
311
311
  # and passed an instance of {SyncHelper}. Within this block, the helper
312
312
  # should be configured using its methods. Optionally, {SyncHelper#wait}
313
313
  # can be called to wait in a specific location in the block. Otherwise,
314
314
  # it will be called implicitly at the end of the block.
315
315
  #
316
+ # @!method sync_on(*events, timeout:nil, &block)
316
317
  def sync_on(*events, timeout:nil, &block)
317
318
  SyncHelper.new(events, self, timeout:timeout, &block)
318
319
  nil
319
320
  end
320
321
 
321
- # Helper class passed to user block in {Channel#sync} method.
322
+ # Helper class passed to user block in {Channel#sync_on} method.
322
323
  # Read here for how to use the helper, but never instantiate it yourself.
323
324
  class SyncHelper
324
325
 
325
- # Don't instantiate this class directly, use {Channel#sync}
326
+ # Don't instantiate this class directly, use {Channel#sync_on}
326
327
  # @api private
327
328
  def initialize(events, channel, timeout:nil)
328
329
  @timeout = timeout
@@ -330,9 +331,16 @@ module Wires.current_network::Namespace
330
331
  @conditions = []
331
332
  @executions = []
332
333
  @received = []
334
+ @thread = Thread.current
333
335
 
334
336
  # Create the temporary event handler to capture incoming matches
335
- proc = Proc.new { |e,c| @lock.synchronize { snag e,c } }
337
+ proc = Proc.new do |e,c|
338
+ if Thread.current==@thread
339
+ snag e,c
340
+ else
341
+ @lock.synchronize { snag e,c }
342
+ end
343
+ end
336
344
 
337
345
  # Run the user block within the lock and wait afterward if they didn't
338
346
  @lock.synchronize {
@@ -345,7 +353,7 @@ module Wires.current_network::Namespace
345
353
 
346
354
  # Add a condition which must be fulfilled for {#wait} to find a match.
347
355
  #
348
- # @param &block [Proc] the block specifiying the condition to be met.
356
+ # @param block [Proc] the block specifiying the condition to be met.
349
357
  # It will be passed the event and channel, and the truthiness of its
350
358
  # return value will be evaluated to determine if the condition is met.
351
359
  # It will only be executed if the +[event,channel]+ pair fits the
@@ -358,7 +366,7 @@ module Wires.current_network::Namespace
358
366
 
359
367
  # Add a execution to run on the matching event for each {#wait}.
360
368
  #
361
- # @param &block [Proc] the block to be executed.
369
+ # @param block [Proc] the block to be executed.
362
370
  # It will only be executed if the +[event,channel]+ pair fits the
363
371
  # filter and met all of the conditions to fulfill the {#wait}.
364
372
  # The block will not be run if the {#wait} times out.
@@ -368,7 +376,7 @@ module Wires.current_network::Namespace
368
376
  nil
369
377
  end
370
378
 
371
- # Wait for exactly one matching event meeting all {#conditions} to come.
379
+ # Wait for exactly one matching event meeting all {#condition}s to come.
372
380
  #
373
381
  # @note This will be called once implicitly at the end of the user block
374
382
  # unless it gets called explicitly somewhere within the user block.
@@ -388,7 +396,7 @@ module Wires.current_network::Namespace
388
396
  # Loop through each result, making sure it matches the conditions,
389
397
  # returning nil if the wait timed out and didn't push into @received
390
398
  loop do
391
- @cond.wait @lock, timeout
399
+ @cond.wait @lock, timeout if @received.empty?
392
400
  result = @received.pop
393
401
  return nil unless result
394
402
  break if !@conditions.detect { |blk| !blk.call *result }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wires
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.7
4
+ version: 0.5.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joe McIlvain
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-02 00:00:00.000000000 Z
11
+ date: 2014-02-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: threadlock