From 9cb804a2bd6eb43b67a716ccef6db400e47f29cf Mon Sep 17 00:00:00 2001 From: Takashi Kokubun Date: Tue, 28 May 2024 17:46:47 -0700 Subject: [PATCH] merge revision(s) 04729fe68dceddab045be7324e26c2bb15aa62c7: [Backport #20288] Fix exception handling in `rb_fiber_scheduler_set`. (#10042) --- scheduler.c | 18 +++++++++++++++++- version.h | 2 +- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/scheduler.c b/scheduler.c index 022e8401e0..3159635dba 100644 --- a/scheduler.c +++ b/scheduler.c @@ -161,6 +161,21 @@ verify_interface(VALUE scheduler) } } +static VALUE +fiber_scheduler_close(VALUE scheduler) +{ + return rb_fiber_scheduler_close(scheduler); +} + +static VALUE +fiber_scheduler_close_ensure(VALUE _thread) +{ + rb_thread_t *thread = (rb_thread_t*)_thread; + thread->scheduler = Qnil; + + return Qnil; +} + VALUE rb_fiber_scheduler_set(VALUE scheduler) { @@ -178,7 +193,8 @@ rb_fiber_scheduler_set(VALUE scheduler) // That way, we do not need to consider interactions, e.g., of a Fiber from // the previous scheduler with the new scheduler. if (thread->scheduler != Qnil) { - rb_fiber_scheduler_close(thread->scheduler); + // rb_fiber_scheduler_close(thread->scheduler); + rb_ensure(fiber_scheduler_close, thread->scheduler, fiber_scheduler_close_ensure, (VALUE)thread); } thread->scheduler = scheduler; diff --git a/version.h b/version.h index e4b6c44f68..dfe1ad757c 100644 --- a/version.h +++ b/version.h @@ -11,7 +11,7 @@ # define RUBY_VERSION_MINOR RUBY_API_VERSION_MINOR #define RUBY_VERSION_TEENY 1 #define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR -#define RUBY_PATCHLEVEL 59 +#define RUBY_PATCHLEVEL 60 #include "ruby/version.h" #include "ruby/internal/abi.h"