about summary refs log tree commit homepage
path: root/ext/mwrap/mwrap.c
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2022-08-23 09:00:30 +0000
committerEric Wong <e@80x24.org>2022-08-23 09:13:34 +0000
commit867b36082111f564f6e55f63cd21fa0c94df2d20 (patch)
tree2622ca94eb6bb0630183233f07ff0c968d8252cb /ext/mwrap/mwrap.c
parente3d506de0aa3e8a574db0724bcc540f4e08f3838 (diff)
downloadmwrap-867b36082111f564f6e55f63cd21fa0c94df2d20.tar.gz
Most GNU/Linux distros build Ruby with --enable-shared, so
it makes sense to support it properly even if it's not the
default favored by ruby-core.

__attribute__((weak)) on a local function is not weak enough
for the shared library, so we add the extra check for the
function's existence to have_ec_p(), instead.

Tested with ruby 2.7.4p191 (2021-07-07 revision a21a3b7d23) [x86_64-linux-gnu]
on Debian 11 (bullseye) as well as default builds w/o
--enable-shared.

Note: FreeBSD 12.3 appears broken with mwrap and I no longer
have older FreeBSD systems handy.
Diffstat (limited to 'ext/mwrap/mwrap.c')
-rw-r--r--ext/mwrap/mwrap.c11
1 files changed, 3 insertions, 8 deletions
diff --git a/ext/mwrap/mwrap.c b/ext/mwrap/mwrap.c
index 85b847b..9d90298 100644
--- a/ext/mwrap/mwrap.c
+++ b/ext/mwrap/mwrap.c
@@ -32,7 +32,6 @@
 
 static ID id_uminus;
 const char *rb_source_location_cstr(int *line); /* requires 2.6.0dev */
-extern int __attribute__((weak)) ruby_thread_has_gvl_p(void);
 
 #ifdef HAVE_RUBY_RACTOR_H /* Ruby 3.0+ */
 extern MWRAP_TSD void * __attribute__((weak)) ruby_current_ec;
@@ -45,6 +44,7 @@ extern size_t __attribute__((weak)) rb_gc_count(void);
 extern VALUE __attribute__((weak)) rb_cObject;
 extern VALUE __attribute__((weak)) rb_eTypeError;
 extern VALUE __attribute__((weak)) rb_yield(VALUE);
+int __attribute__((weak)) ruby_thread_has_gvl_p(void);
 
 static size_t total_bytes_inc, total_bytes_dec;
 
@@ -64,11 +64,6 @@ enum {
 
 #define IS_HEAP_PAGE_BODY ((struct src_loc *)-1)
 
-int __attribute__((weak)) ruby_thread_has_gvl_p(void)
-{
-        return 0;
-}
-
 #ifdef __FreeBSD__
 void *__malloc(size_t);
 void __free(void *);
@@ -238,8 +233,8 @@ static char *int2str(int num, char *dst, size_t * size)
  */
 static int has_ec_p(void)
 {
-        return (ruby_thread_has_gvl_p() && ruby_current_vm_ptr &&
-                ruby_current_ec);
+        return ruby_thread_has_gvl_p && ruby_thread_has_gvl_p() &&
+                ruby_current_vm_ptr && ruby_current_ec;
 }
 
 struct acc {