aboutsummaryrefslogtreecommitdiffstats
path: root/eval.c
diff options
context:
space:
mode:
authorSamuel Williams <samuel.williams@oriontransfer.co.nz>2020-09-20 11:34:02 +1200
committerSamuel Williams <samuel.williams@oriontransfer.co.nz>2020-09-21 09:51:33 +1200
commit501fff14c7657f769d68f90de98fd2ebccb807fb (patch)
tree10dfcaf36b27dcd6b83268f9b0de2516fed41ec2 /eval.c
parentb6d599d76ec85422bea16b63f105985cf08e04bd (diff)
downloadruby-501fff14c7657f769d68f90de98fd2ebccb807fb.tar.gz
When setting current thread scheduler to nil, invoke `#close`.
Diffstat (limited to 'eval.c')
-rw-r--r--eval.c11
1 files changed, 11 insertions, 0 deletions
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"
@@ -158,6 +159,13 @@ rb_ec_teardown(rb_execution_context_t *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)
{
ruby_sig_finalize();
@@ -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);