diff options
author | Yusuke Endoh <[email protected]> | 2021-07-28 11:05:36 +0900 |
---|---|---|
committer | Yusuke Endoh <[email protected]> | 2021-07-28 11:05:36 +0900 |
commit | 6505c77501f1924571b2fe620c5c7b31ede0cd22 (patch) | |
tree | 3dd62e955ab1a073aac6677df50f96d27c3b32b1 /thread.c | |
parent | 4fc9ddd7b6af54abf88d702c2e11e97ca7750ce3 (diff) |
Revert "Fix potential hang when joining threads."
This reverts commit 13f8521c630a15c87398dee0763e95f59c032a94.
http://rubyci.s3.amazonaws.com/solaris11-gcc/ruby-master/log/20210727T230009Z.fail.html.gz
http://rubyci.s3.amazonaws.com/solaris11-sunc/ruby-master/log/20210728T000009Z.fail.html.gz
This revert is to confirm whether the commit is the cause.
If the failures consistently occur after this revert, I'll
reintroduce the commit.
Diffstat (limited to 'thread.c')
-rw-r--r-- | thread.c | 21 |
1 files changed, 4 insertions, 17 deletions
@@ -632,7 +632,6 @@ thread_cleanup_func_before_exec(void *th_ptr) { rb_thread_t *th = th_ptr; th->status = THREAD_KILLED; - // The thread stack doesn't exist in the forked process: th->ec->machine.stack_start = th->ec->machine.stack_end = NULL; @@ -818,9 +817,6 @@ thread_start_func_2(rb_thread_t *th, VALUE *stack_start) thread_debug("thread start (get lock): %p\n", (void *)th); - // Ensure that we are not joinable. - VM_ASSERT(th->value == Qundef); - EC_PUSH_TAG(th->ec); if ((state = EC_EXEC_TAG()) == TAG_NONE) { @@ -861,12 +857,6 @@ thread_start_func_2(rb_thread_t *th, VALUE *stack_start) th->value = Qnil; } - // The thread is effectively finished and can be joined. - VM_ASSERT(th->value != Qundef); - - rb_threadptr_join_list_wakeup(th); - rb_threadptr_unlock_all_locking_mutexes(th); - if (th->invoke_type == thread_invoke_type_ractor_proc) { rb_thread_terminate_all(th); rb_ractor_teardown(th->ec); @@ -884,6 +874,9 @@ thread_start_func_2(rb_thread_t *th, VALUE *stack_start) rb_threadptr_raise(ractor_main_th, 1, &errinfo); } + rb_threadptr_join_list_wakeup(th); + rb_threadptr_unlock_all_locking_mutexes(th); + EC_POP_TAG(); rb_ec_clear_current_thread_trace_func(th->ec); @@ -1160,12 +1153,6 @@ remove_from_join_list(VALUE arg) static rb_hrtime_t *double2hrtime(rb_hrtime_t *, double); -static int -thread_finished(rb_thread_t *th) -{ - return th->status == THREAD_KILLED || th->value != Qundef; -} - static VALUE thread_join_sleep(VALUE arg) { @@ -1192,7 +1179,7 @@ thread_join_sleep(VALUE arg) end = rb_hrtime_add(*limit, rb_hrtime_now()); } - while (!thread_finished(target_th)) { + while (target_th->status != THREAD_KILLED) { VALUE scheduler = rb_fiber_scheduler_current(); if (scheduler != Qnil) { |