diff options
author | Koichi Sasada <ko1@atdot.net> | 2020-11-10 18:21:11 +0900 |
---|---|---|
committer | Koichi Sasada <ko1@atdot.net> | 2020-11-11 15:49:02 +0900 |
commit | db31ace934e8b900e90853bd875f23195837b398 (patch) | |
tree | f9e1e0999b574c0adf974e885420781b2dbd5a15 /thread.c | |
parent | 1e8abe5d03ae386af82e2c95ef05170cd9791889 (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.c | 14 |
1 files changed, 7 insertions, 7 deletions
@@ -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); } |