From 8ca77858331376be74f3ce553544e44c8623c4cd Mon Sep 17 00:00:00 2001 From: Keenan Brock Date: Thu, 19 Sep 2024 12:28:24 -0400 Subject: [PATCH 2/2] Don't check GVL before calling into with_gvl_callback --- ext/fiddle/closure.c | 4 ---- gc.c | 18 ++++++------------ gc/default.c | 20 +++++++++----------- 3 files changed, 15 insertions(+), 27 deletions(-) diff --git a/ext/fiddle/closure.c b/ext/fiddle/closure.c index 7aa9407619..b3ce58114d 100644 --- a/ext/fiddle/closure.c +++ b/ext/fiddle/closure.c @@ -226,11 +226,7 @@ callback(ffi_cif *cif, void *resp, void **args, void *ctx) x.args = args; x.ctx = ctx; - if (ruby_thread_has_gvl_p()) { - (void)with_gvl_callback(&x); - } else { (void)rb_thread_call_with_gvl(with_gvl_callback, &x); - } } static VALUE diff --git a/gc.c b/gc.c index ee8b7bc376..c7883dcea9 100644 --- a/gc.c +++ b/gc.c @@ -4041,11 +4041,7 @@ gc_raise(VALUE exc, const char *fmt, ...) exc, fmt, &ap, }; - if (ruby_thread_has_gvl_p()) { - gc_vraise(&argv); - UNREACHABLE; - } - else if (ruby_native_thread_p()) { + if (ruby_native_thread_p()) { rb_thread_call_with_gvl(gc_vraise, &argv); UNREACHABLE; } @@ -4081,14 +4077,12 @@ ruby_memerror(void) if (ruby_thread_has_gvl_p()) { rb_memerror(); } + else if (ruby_native_thread_p()) { + rb_thread_call_with_gvl(ruby_memerror_body, 0); + } else { - if (ruby_native_thread_p()) { - rb_thread_call_with_gvl(ruby_memerror_body, 0); - } - else { - /* no ruby thread */ - fprintf(stderr, "[FATAL] failed to allocate memory\n"); - } + /* no ruby thread */ + fprintf(stderr, "[FATAL] failed to allocate memory\n"); } exit(EXIT_FAILURE); } diff --git a/gc/default.c b/gc/default.c index 0c66dca8b4..6837f360fa 100644 --- a/gc/default.c +++ b/gc/default.c @@ -6791,18 +6791,16 @@ garbage_collect_with_gvl(rb_objspace_t *objspace, unsigned int reason) if (ruby_thread_has_gvl_p()) { return garbage_collect(objspace, reason); } + else if(ruby_native_thread_p()) { + struct objspace_and_reason oar; + oar.objspace = objspace; + oar.reason = reason; + return (int)(VALUE)rb_thread_call_with_gvl(gc_with_gvl, (void *)&oar); + } else { - if (ruby_native_thread_p()) { - struct objspace_and_reason oar; - oar.objspace = objspace; - oar.reason = reason; - return (int)(VALUE)rb_thread_call_with_gvl(gc_with_gvl, (void *)&oar); - } - else { - /* no ruby thread */ - fprintf(stderr, "[FATAL] failed to allocate memory\n"); - exit(EXIT_FAILURE); - } + /* no ruby thread */ + fprintf(stderr, "[FATAL] failed to allocate memory\n"); + exit(EXIT_FAILURE); } } -- 2.46.0