From be21a056d229652ae5cf6926e96c1517aa43453f Mon Sep 17 00:00:00 2001 From: Samuel Williams Date: Fri, 8 Sep 2023 20:44:46 +1200 Subject: [PATCH] Try default `gcc` 9.4.0 to see if it exhibits the same compiler bugs. (#8394) * Revert "Extract `do_mutex_lock_check_interrupts` to try and fix `ppc64le`. (#8393)" This reverts commit 5184b40dd4dc446660cd35c3e53896324e95b317. * .travis.yml: Try default gcc 9.4.0 instead of gcc-10 in ppc64le and s390x. Use gcc 9.4.0 instead of gcc-10 to avoid the current failures by a possible GCC 10 compiler bug in the Travis ppc64le and s390x cases. And it also aligns with RubyCI Ubuntu ppc64le and s390x where the default gcc is used. --------- Co-authored-by: Jun Aruga --- .travis.yml | 4 ++-- thread_sync.c | 32 +++++++++----------------------- 2 files changed, 11 insertions(+), 25 deletions(-) diff --git a/.travis.yml b/.travis.yml index c6054ae672..11ae8a9b45 100644 --- a/.travis.yml +++ b/.travis.yml @@ -82,12 +82,12 @@ env: - &ppc64le-linux name: ppc64le-linux arch: ppc64le - <<: *gcc-10 + compiler: gcc - &s390x-linux name: s390x-linux arch: s390x - <<: *gcc-10 + compiler: gcc - &arm32-linux name: arm32-linux diff --git a/thread_sync.c b/thread_sync.c index 63f0228d9d..85ebec4d8c 100644 --- a/thread_sync.c +++ b/thread_sync.c @@ -290,28 +290,6 @@ delete_from_waitq(VALUE value) return Qnil; } -static void -do_mutex_lock_check_interrupts(int interruptible_p, rb_fiber_t *fiber, rb_mutex_t *mutex, rb_thread_t *thread) -{ - // We extracted this function because we suspect there can be a codegen bug - // on ppc64le and moving this code to a separate function seems to fix the - // problem, at least in my tests. - if (interruptible_p) { - /* release mutex before checking for interrupts...as interrupt checking - * code might call rb_raise() */ - if (mutex->fiber == fiber) { - mutex->fiber = 0; - } - - RUBY_VM_CHECK_INTS_BLOCKING(thread->ec); /* may release mutex */ - - if (!mutex->fiber) { - mutex->fiber = fiber; - } - } -} - - static VALUE do_mutex_lock(VALUE self, int interruptible_p) { @@ -400,7 +378,15 @@ do_mutex_lock(VALUE self, int interruptible_p) rb_ractor_sleeper_threads_dec(th->ractor); } - do_mutex_lock_check_interrupts(interruptible_p, fiber, mutex, th); + if (interruptible_p) { + /* release mutex before checking for interrupts...as interrupt checking + * code might call rb_raise() */ + if (mutex->fiber == fiber) mutex->fiber = 0; + RUBY_VM_CHECK_INTS_BLOCKING(th->ec); /* may release mutex */ + if (!mutex->fiber) { + mutex->fiber = fiber; + } + } } if (mutex->fiber == fiber) mutex_locked(th, self);