Class: Hakuban::TagExposeContract

Inherits:
Contract show all
Includes:
Stream
Defined in:
lib/hakuban/contract.rb

Instance Attribute Summary

Attributes inherited from Contract

#descriptor

Instance Method Summary collapse

Methods included from Stream

#each

Methods inherited from Contract

#inspect

Methods inherited from FFIObject

#do_and_drop, #do_and_drop_or_return, #drop, #drop_lock, #drop_release, #dropped?, generate_finalizer, #initialize_copy, #inspect, #with_pointer, with_pointers

Constructor Details

#initialize(local_exchange, descriptor) ⇒ TagExposeContract

Returns a new instance of TagExposeContract.



149
150
151
152
153
154
155
156
# File 'lib/hakuban/contract.rb', line 149

def initialize(local_exchange, descriptor)
	@local_exchange, @descriptor = local_exchange, descriptor
	@local_exchange.with_pointer { |local_exchange_pointer|
		@descriptor.with_pointer { |descriptor_pointer|
			initialize_pointer(FFI::hakuban_tag_expose_contract_new(local_exchange_pointer, descriptor_pointer),:hakuban_tag_expose_contract_drop,nil)
		}
	}
end

Instance Method Details

#next(&block) ⇒ Object



162
163
164
165
166
# File 'lib/hakuban/contract.rb', line 162

def next(&block)
	return nil  if ! pointer = FFI::FFIFutureReturningPointer.create_and_await(self) { |pointer| FFI::hakuban_tag_expose_contract_next(pointer) }.unwrap
	ObjectStateSink.send(:new, pointer).do_and_drop_or_return(&block)
rescue FFIObject::PointerAlreadyDropped
end

#ready(&block) ⇒ Object



168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
# File 'lib/hakuban/contract.rb', line 168

def ready(&block)
	object_state_sinks_array = with_pointer { |pointer| FFI::hakuban_tag_expose_contract_ready(pointer) }
	object_state_sinks = object_state_sinks_array[:pointer].read_array_of_pointer(object_state_sinks_array[:length]).map { |object_state_sinks_pointer|  
		ObjectStateSink.send(:new, object_state_sinks_pointer)
	}
	FFI::hakuban_array_drop(object_state_sinks_array)
	if block
		Thread.handle_interrupt(Object => :never) {
			begin
				Thread.handle_interrupt(Object => :immediate) {
					block.call(object_state_sinks)
				}
			ensure
				object_state_sinks.each(&:drop)
			end
		}
	else
		object_state_sinks
	end
rescue FFIObject::PointerAlreadyDropped
end

#terminateObject



190
191
192
193
# File 'lib/hakuban/contract.rb', line 190

def terminate
	with_pointer { |pointer| FFI::hakuban_tag_expose_contract_terminate(pointer) }
rescue FFIObject::PointerAlreadyDropped
end