summaryrefslogtreecommitdiff
path: root/thread.c
diff options
context:
space:
mode:
authorKoichi Sasada <ko1@atdot.net>2020-11-10 18:21:11 +0900
committerKoichi Sasada <ko1@atdot.net>2020-11-11 15:49:02 +0900
commitdb31ace934e8b900e90853bd875f23195837b398 (patch)
treef9e1e0999b574c0adf974e885420781b2dbd5a15 /thread.c
parent1e8abe5d03ae386af82e2c95ef05170cd9791889 (diff)
Threads in a ractor will be killed with the ractor
If a terminating ractor has child threads, then kill all child threads.
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/3754
Diffstat (limited to 'thread.c')
-rw-r--r--thread.c14
1 files changed, 7 insertions, 7 deletions
diff --git a/thread.c b/thread.c
index d0187ae..ad1f476 100644
--- a/thread.c
+++ b/thread.c
@@ -587,16 +587,15 @@ rb_threadptr_unlock_all_locking_mutexes(rb_thread_t *th)
}
void
-rb_thread_terminate_all(void)
+rb_thread_terminate_all(rb_thread_t *th)
{
- rb_thread_t *volatile th = GET_THREAD(); /* main thread */
+ rb_ractor_t *cr = th->ractor;
rb_execution_context_t * volatile ec = th->ec;
- rb_ractor_t *r = th->ractor;
volatile int sleeping = 0;
- if (r->threads.main != th) {
+ if (cr->threads.main != th) {
rb_bug("rb_thread_terminate_all: called by child thread (%p, %p)",
- (void *)r->threads.main, (void *)th);
+ (void *)cr->threads.main, (void *)th);
}
/* unlock all locking mutexes */
@@ -606,9 +605,9 @@ rb_thread_terminate_all(void)
if (EC_EXEC_TAG() == TAG_NONE) {
retry:
thread_debug("rb_thread_terminate_all (main thread: %p)\n", (void *)th);
- terminate_all(th->ractor, th);
+ terminate_all(cr, th);
- while (rb_ractor_living_thread_num(th->ractor) > 1) {
+ while (rb_ractor_living_thread_num(cr) > 1) {
rb_hrtime_t rel = RB_HRTIME_PER_SEC;
/*q
* Thread exiting routine in thread_start_func_2 notify
@@ -854,6 +853,7 @@ thread_start_func_2(rb_thread_t *th, VALUE *stack_start)
}
if (th->invoke_type == thread_invoke_type_ractor_proc) {
+ rb_thread_terminate_all(th);
rb_ractor_teardown(th->ec);
}