diff options
author | Koichi Sasada <ko1@atdot.net> | 2020-12-07 16:01:35 +0900 |
---|---|---|
committer | Koichi Sasada <ko1@atdot.net> | 2020-12-07 16:01:35 +0900 |
commit | c2fa024e0220aca6e2437e56df2abf1a2368cbdf (patch) | |
tree | bbe108853e83749d2ef4ff16e053c4b9f6bd8d7e /ractor.c | |
parent | cc36e499f9403c2e3dd0514fc8f13ff485c10b82 (diff) |
fix Thread's interrupt and Ractor#take issue
Thread's interrupt set Ractor's wakeup_status as interrupted, but
the status remains next Ractor communication API. This patch makes
to ignore the previous interrupt state.
[Bug #17366]
Also this patch solves the Thread#kill and Ractor#take issues.
Diffstat (limited to 'ractor.c')
-rw-r--r-- | ractor.c | 6 |
1 files changed, 4 insertions, 2 deletions
@@ -627,8 +627,8 @@ ractor_receive(rb_execution_context_t *ec, rb_ractor_t *r) { if (ractor_queue_empty_p(r, &r->incoming_queue)) { VM_ASSERT(r->wait.status == wait_none); - VM_ASSERT(r->wait.wakeup_status == wakeup_none); r->wait.status = wait_receiving; + r->wait.wakeup_status = wakeup_none; ractor_sleep(ec, r); @@ -887,8 +887,8 @@ ractor_select(rb_execution_context_t *ec, const VALUE *rs, int alen, VALUE yield RACTOR_LOCK(cr); { VM_ASSERT(cr->wait.status == wait_none); - VM_ASSERT(cr->wait.wakeup_status == wakeup_none); cr->wait.status = wait_status; + cr->wait.wakeup_status == wakeup_none; } RACTOR_UNLOCK(cr); @@ -1331,6 +1331,8 @@ ractor_yield_atexit(rb_execution_context_t *ec, rb_ractor_t *cr, VALUE v, bool e VM_ASSERT(cr->wait.status == wait_none); cr->wait.status = wait_yielding; + cr->wait.wakeup_status = wakeup_none; + VM_ASSERT(cr->yield_atexit == false); cr->yield_atexit = true; } |