diff options
author | Samuel Williams <samuel.williams@oriontransfer.co.nz> | 2024-02-22 00:33:18 +1300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-02-22 00:33:18 +1300 |
commit | 04729fe68dceddab045be7324e26c2bb15aa62c7 (patch) | |
tree | 29afee45996175525c0dc08e0c49254a81dfd58c /scheduler.c | |
parent | 78d9fe69479d32214a52ad7291c3973f1b6b7f6f (diff) |
Fix exception handling in `rb_fiber_scheduler_set`. (#10042)
Diffstat (limited to 'scheduler.c')
-rw-r--r-- | scheduler.c | 18 |
1 files changed, 17 insertions, 1 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; |