summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTakashi Kokubun <[email protected]>2024-05-28 17:46:47 -0700
committerTakashi Kokubun <[email protected]>2024-05-28 17:46:47 -0700
commit9cb804a2bd6eb43b67a716ccef6db400e47f29cf (patch)
treef207e6e2ca72d5e7f7d9c311394df77740e2d25e
parent0e96dd93c51337a01fa29b563c2d330c472b03b7 (diff)
merge revision(s) 04729fe68dceddab045be7324e26c2bb15aa62c7: [Backport #20288]
Fix exception handling in `rb_fiber_scheduler_set`. (#10042)
-rw-r--r--scheduler.c18
-rw-r--r--version.h2
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"