Object
Celluloid::Future objects allow methods and blocks to run in the background, their values requested later
# File lib/celluloid/future.rb, line 7 def self.new(*args, &block) return super unless block future = new Celluloid.internal_pool.get do Thread.current.role = :future begin call = SyncCall.new(future, :call, args) call.dispatch(block) rescue # Exceptions in blocks will get raised when the value is retrieved end end future end
Check if this future has a value yet
# File lib/celluloid/future.rb, line 34 def ready? @ready end
Signal this future with the given result value
# File lib/celluloid/future.rb, line 77 def signal(value) result = Result.new(value, self) @mutex.synchronize do raise "the future has already happened!" if @ready if @forwards @forwards.is_a?(Array) ? @forwards.each { |f| f << result } : @forwards << result end @result = result @ready = true end end
Obtain the value for this Future
# File lib/celluloid/future.rb, line 39 def value(timeout = nil) ready = result = nil begin @mutex.lock if @ready ready = true result = @result else case @forwards when Array @forwards << Celluloid.mailbox when NilClass @forwards = Celluloid.mailbox else @forwards = [@forwards, Celluloid.mailbox] end end ensure @mutex.unlock end unless ready result = Celluloid.receive(timeout) do |msg| msg.is_a?(Future::Result) && msg.future == self end end if result result.value else raise TimeoutError, "Timed out" end end
Generated with the Darkfish Rdoc Generator 2.