Class: Hakuban::FFI::FFIFuture

Inherits:
Object
  • Object
show all
Defined in:
lib/hakuban/ffi.rb

Class Method Summary collapse

Class Method Details

.await(future_pointer) ⇒ Object

This HAS to be called with interrupts disabled. If both, internal exception, and an interrupt fire, pay attention not to drop one of them.



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/hakuban/ffi.rb', line 56

def self.await(future_pointer)
  error = result_thread = result = nil
  future_pointer_for_blocking_await = Hakuban::FFI::hakuban_future_clone(future_pointer)
  begin
    # ThreadError gets raised here on process shutdown
    result_thread = Thread.new { Hakuban::FFI::hakuban_future_await(future_pointer_for_blocking_await) }
    Thread.handle_interrupt(Object => :immediate) { result_thread.join }
  rescue Object => e
    error = e
  end
  Hakuban::FFI::hakuban_future_drop(future_pointer)
  if result_thread
    result = result_thread.join_with_warning
  else 
    Hakuban::FFI::hakuban_future_drop(future_pointer_for_blocking_await)
  end
  return [result, error]
end