summaryrefslogtreecommitdiff
path: root/thread.c
diff options
context:
space:
mode:
authorYusuke Endoh <mame@ruby-lang.org>2021-07-28 11:05:36 +0900
committerYusuke Endoh <mame@ruby-lang.org>2021-07-28 11:05:36 +0900
commit6505c77501f1924571b2fe620c5c7b31ede0cd22 (patch)
tree3dd62e955ab1a073aac6677df50f96d27c3b32b1 /thread.c
parent4fc9ddd7b6af54abf88d702c2e11e97ca7750ce3 (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.c21
1 files changed, 4 insertions, 17 deletions
diff --git a/thread.c b/thread.c
index 1232129935..3c3f645dbd 100644
--- a/thread.c
+++ b/thread.c
@@ -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) {