class FFI::AutoPointer
def autorelease=(autorelease)
def autorelease=(autorelease) @releaser.autorelease=(autorelease) end
def free
def free @releaser.free end
def initialize(ptr, proc=nil, &block)
release(), which by default does nothing.
going to be useful if you subclass AutoPointer, and override
The last calling idiom (only one parameter) is generally only
The above code will cause PointerHelper#release to be invoked at GC time.
p = AutoPointer.new(other_pointer, PointerHelper.method(:release))
end
end
...
def self.release(pointer)
class PointerHelper
idiom is to pass a Method as the second parameter. Example usage:
Please note that the safest, and therefore preferred, calling
WARNING: passing a block will cause your pointer to never be GC'd. This is bad.
WARNING: passing a proc _may_ cause your pointer to never be GC'd, unless you're careful to avoid trapping a reference to the pointer in the proc. See the test specs for examples.
AutoPointer.new(pointer) => the pointer's release() class method will be invoked at GC time
AutoPointer.new(pointer) { |p| ... } => the passed block will be invoked at GC time (SEE WARNING BELOW!)
AutoPointer.new(pointer, proc) => the passed Proc will be invoked at GC time (SEE WARNING BELOW!)
AutoPointer.new(pointer, method) => the passed Method will be invoked at GC time
call-seq:
def initialize(ptr, proc=nil, &block) raise TypeError, "Invalid pointer" if ptr.nil? || !ptr.kind_of?(Pointer) \ || ptr.kind_of?(MemoryPointer) || ptr.kind_of?(AutoPointer) @releaser = if proc raise RuntimeError.new("proc must be callable") unless proc.respond_to?(:call) CallableReleaser.new(ptr, proc) else raise RuntimeError.new("no release method defined") unless self.class.respond_to?(:release) DefaultReleaser.new(ptr, self.class) end self.parent = ptr ObjectSpace.define_finalizer(self, @releaser) self end