Class: Hakuban::FFI::FFIFutureReturningPointer

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

Constant Summary collapse

@@callbacks =
Callbacks.new

Class Method Summary collapse

Class Method Details

.create_and_await(owner) ⇒ Object



138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
# File 'lib/hakuban/ffi.rb', line 138

def self.create_and_await(owner)
	Thread.handle_interrupt(Object => :never) {
		begin
			queue = queue_id = drop_locked = pointer = nil
			Thread.handle_interrupt(Object => :immediate) {
				queue = Queue.new
				queue_id = @@callbacks.register_queue(queue)
				drop_locked = owner.drop_lock(queue)
				return nil  if !pointer = owner.with_pointer { |pointer| yield pointer }
				loop {
					result = owner.with_pointer { Hakuban::FFI::hakuban_future_returning_pointer_poll(pointer[:pointer],@@callbacks.waker,::FFI::Pointer.new(queue_id)) }
					return result  if not result.is_Pending?
					raise Hakuban::FFIObject::PointerAlreadyDropped  if queue.pop == :dropping
				}
			}
		ensure
			Hakuban::FFI::hakuban_future_returning_pointer_drop(pointer[:pointer])  if pointer
			owner.drop_release(queue)  if drop_locked
			@@callbacks.unregister_queue(queue_id)
		end
	}
end