Method: Await::ThreadExtension#defer
- Defined in:
- lib/await.rb
#defer(&block) ⇒ Object
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
# File 'lib/await.rb', line 48 def defer(&block) deferred = @deferred trigger = lambda do |*args| if (deferred[:fiber] == Fiber.current) # Within the same fiber, remove this from the pending list deferred.delete(trigger) block.call(*args) else # If this is executing in a different fiber, transfer control back # to the original fiber for reasons of continuity. deferred[:fiber].transfer([ Fiber.current, trigger, block, args ]) end end deferred[trigger] = true trigger end |