summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authornaruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-04-10 21:15:37 +0000
committernaruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-04-10 21:15:37 +0000
commita0f7f2921518443a60c807d272f0345aed61dc21 (patch)
treea1538a3ce800a4673b88087e2d330279a53533ec /ext
parentc607493e48c9f3dbf957a4bb5f0be2e8aa288442 (diff)
* ext/fiddle/extconf.rb: define RUBY_LIBFFI_MODVERSION macro.
* ext/fiddle/closure.c (USE_FFI_CLOSURE_ALLOC): define 0 or 1 with platform and libffi's version. [Bug #3371] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@40219 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext')
-rw-r--r--ext/fiddle/closure.c16
-rw-r--r--ext/fiddle/extconf.rb4
2 files changed, 15 insertions, 5 deletions
diff --git a/ext/fiddle/closure.c b/ext/fiddle/closure.c
index d064f11991..1aab631aad 100644
--- a/ext/fiddle/closure.c
+++ b/ext/fiddle/closure.c
@@ -10,15 +10,21 @@ typedef struct {
ffi_type **argv;
} fiddle_closure;
-#if defined(MACOSX) || defined(__linux__) || defined(__OpenBSD__)
-#define DONT_USE_FFI_CLOSURE_ALLOC
+#if defined(USE_FFI_CLOSURE_ALLOC)
+#elif defined(__OpenBSD__)
+# define USE_FFI_CLOSURE_ALLOC 0
+#elif RUBY_LIBFFI_MODVERSION < 3000005 && \
+ (defined(__i386__) || defined(__x86_64__) || defined(_M_IX86) || defined(_M_AMD64))
+# define USE_FFI_CLOSURE_ALLOC 0
+#else
+# define USE_FFI_CLOSURE_ALLOC 1
#endif
static void
dealloc(void * ptr)
{
fiddle_closure * cls = (fiddle_closure *)ptr;
-#ifndef DONT_USE_FFI_CLOSURE_ALLOC
+#if USE_FFI_CLOSURE_ALLOC
ffi_closure_free(cls->pcl);
#else
munmap(cls->pcl, sizeof(cls->pcl));
@@ -170,7 +176,7 @@ allocate(VALUE klass)
VALUE i = TypedData_Make_Struct(klass, fiddle_closure,
&closure_data_type, closure);
-#ifndef DONT_USE_FFI_CLOSURE_ALLOC
+#if USE_FFI_CLOSURE_ALLOC
closure->pcl = ffi_closure_alloc(sizeof(ffi_closure), &closure->code);
#else
closure->pcl = mmap(NULL, sizeof(ffi_closure), PROT_READ | PROT_WRITE,
@@ -222,7 +228,7 @@ initialize(int rbargc, VALUE argv[], VALUE self)
if (FFI_OK != result)
rb_raise(rb_eRuntimeError, "error prepping CIF %d", result);
-#ifndef DONT_USE_FFI_CLOSURE_ALLOC
+#if USE_FFI_CLOSURE_ALLOC
result = ffi_prep_closure_loc(pcl, cif, callback,
(void *)self, cl->code);
#else
diff --git a/ext/fiddle/extconf.rb b/ext/fiddle/extconf.rb
index 2cb9ae0ace..9c7991ec44 100644
--- a/ext/fiddle/extconf.rb
+++ b/ext/fiddle/extconf.rb
@@ -5,6 +5,10 @@ require 'mkmf'
dir_config 'libffi'
pkg_config("libffi")
+if ver = pkg_config("libffi", "modversion")
+ $defs.push(%{-DRUBY_LIBFFI_MODVERSION=#{ '%d%03d%03d' % ver.split('.') }})
+end
+
unless have_header('ffi.h')
if have_header('ffi/ffi.h')
$defs.push(format('-DUSE_HEADER_HACKS'))