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
|