From 501fff14c7657f769d68f90de98fd2ebccb807fb Mon Sep 17 00:00:00 2001 From: Samuel Williams Date: Sun, 20 Sep 2020 11:34:02 +1200 Subject: When setting current thread scheduler to nil, invoke `#close`. --- eval.c | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'eval.c') diff --git a/eval.c b/eval.c index 0b51b83066..43a50840ae 100644 --- a/eval.c +++ b/eval.c @@ -28,6 +28,7 @@ #include "internal/io.h" #include "internal/mjit.h" #include "internal/object.h" +#include "internal/thread.h" #include "internal/variable.h" #include "iseq.h" #include "mjit.h" @@ -157,6 +158,13 @@ rb_ec_teardown(rb_execution_context_t *ec) rb_ec_clear_all_trace_func(ec); } +static void +rb_ec_scheduler_finalize(rb_execution_context_t *ec) +{ + rb_thread_t *thread = rb_ec_thread_ptr(ec); + rb_thread_scheduler_set(thread->self, Qnil); +} + static void rb_ec_finalize(rb_execution_context_t *ec) { @@ -270,6 +278,9 @@ rb_ec_cleanup(rb_execution_context_t *ec, volatile int ex) } } + // If the user code defined a scheduler for the top level thread, run it: + rb_ec_scheduler_finalize(ec); + mjit_finish(true); // We still need ISeqs here. rb_ec_finalize(ec); -- cgit v1.2.3