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