From a84783dc3d0c408d078f763c4c4259be0b8712ba Mon Sep 17 00:00:00 2001 From: Yorick Peterse Date: Sat, 26 Dec 2015 17:05:18 +0100 Subject: [PATCH] Moved autorelease methods to FFI::Pointer This allows code to alter the autorelease behaviour of regular Rubinius::FFI::Pointer instances. As an example, rubysl-socket returns a bunch of ifaddr pointers which are freed using freeifaddrs(). By default these pointers have auto-releasing enabled which results in Rubinius attempting to finalize/free already free'd pointers which in turn segfaults Rubinius. --- kernel/platform/pointer.rb | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/kernel/platform/pointer.rb b/kernel/platform/pointer.rb index 69cd1986e3..6dbf6c3bb7 100644 --- a/kernel/platform/pointer.rb +++ b/kernel/platform/pointer.rb @@ -253,6 +253,21 @@ def primitive_write_pointer(obj) raise PrimitiveFailure, "FFI::Pointer#primitive_write_pointer primitive failed" end + ## + # If +val+ is true, this Pointer object will call + # free() on it's address when it is garbage collected. + def autorelease=(val) + Rubinius.primitive :pointer_set_autorelease + raise PrimitiveFailure, "FFI::Pointer#autorelease= primitive failed" + end + + ## + # Returns true if autorelease is enabled, otherwise false. + def autorelease? + Rubinius.primitive :pointer_autorelease_p + raise PrimitiveFailure, "FFI::Pointer#pointer_autorelease_p primitive failed" + end + NULL = Pointer.new(0x0) end @@ -370,22 +385,6 @@ def free Rubinius.primitive :pointer_free raise PrimitiveFailure, "FFI::MemoryPointer#free primitive failed" end - - ## - # If +val+ is true, this MemoryPointer object will call - # free() on it's address when it is garbage collected. - def autorelease=(val) - Rubinius.primitive :pointer_set_autorelease - raise PrimitiveFailure, "FFI::MemoryPointer#autorelease= primitive failed" - end - - ## - # Returns true if autorelease is enabled, otherwise false. - def autorelease? - Rubinius.primitive :pointer_autorelease_p - raise PrimitiveFailure, "FFI::MemoryPointer#pointer_autorelease_p primitive failed" - end - end class DynamicLibrary::Symbol < Pointer