class Bones::RPC::Synchronous::Future

Public Class Methods

new() click to toggle source
# File lib/bones/rpc/synchronous/future.rb, line 9
def initialize
  @start = Time.now
  @mutex = Mutex.new
  @ready = false
  @result = nil
  @forwards = nil
end

Public Instance Methods

<<(value)
Alias for: signal
call(timeout = nil)
Alias for: value
ready?() click to toggle source

Check if this future has a value yet

# File lib/bones/rpc/synchronous/future.rb, line 18
def ready?
  @ready
end
runtime() click to toggle source
# File lib/bones/rpc/synchronous/future.rb, line 68
def runtime
  if @stop
    @stop - @start
  else
    Time.now - @start
  end
end
signal(value) click to toggle source

Signal this future with the given result value

# File lib/bones/rpc/synchronous/future.rb, line 52
def signal(value)
  @stop = Time.now
  result = Result.new(value, self)

  @mutex.synchronize do
    raise "the future has already happened!" if @ready

    @result = result
    @ready = true
  end
end
Also aliased as: <<
value(timeout = nil) click to toggle source

Obtain the value for this Future

# File lib/bones/rpc/synchronous/future.rb, line 23
def value(timeout = nil)
  ready = result = nil

  begin
    @mutex.lock

    if @ready
      ready = true
      result = @result
    end
  ensure
    @mutex.unlock
  end

  unless ready
    if timeout
      raise TimeoutError, "Timeout not supported by Bones::RPC::Synchronous backend"
    end
  end

  if result
    result.value
  else
    raise TimeoutError, "Timeout not supported by Bones::RPC::Synchronous backend"
  end
end
Also aliased as: call