diff options
author | Koichi Sasada <ko1@atdot.net> | 2021-01-22 02:48:31 +0900 |
---|---|---|
committer | Koichi Sasada <ko1@atdot.net> | 2021-01-22 02:48:31 +0900 |
commit | 03d1850bfaa1c279fe5cc79f4bb2128f50c5b9e5 (patch) | |
tree | c4f0917e4b7fc5f8f7b5fb49ed2b0e4149196d72 | |
parent | d961f14df3629f933613b062034deea0346de1cd (diff) |
use ractor_wakeup()
Use ractor_wakeup() for same code.
-rw-r--r-- | ractor.c | 55 |
1 files changed, 27 insertions, 28 deletions
@@ -491,6 +491,31 @@ ractor_try_receive(rb_execution_context_t *ec, rb_ractor_t *r) return ractor_basket_accept(&basket); } +static bool +ractor_sleeping_by(const rb_ractor_t *r, enum ractor_wait_status wait_status) +{ + return (r->sync.wait.status & wait_status) && r->sync.wait.wakeup_status == wakeup_none; +} + +static bool +ractor_wakeup(rb_ractor_t *r, enum ractor_wait_status wait_status, enum ractor_wakeup_status wakeup_status) +{ + ASSERT_ractor_locking(r); + + // fprintf(stderr, "%s r:%p status:%s/%s wakeup_status:%s/%s\n", __func__, r, + // wait_status_str(r->sync.wait.status), wait_status_str(wait_status), + // wakeup_status_str(r->sync.wait.wakeup_status), wakeup_status_str(wakeup_status)); + + if (ractor_sleeping_by(r, wait_status)) { + r->sync.wait.wakeup_status = wakeup_status; + rb_native_cond_signal(&r->sync.cond); + return true; + } + else { + return false; + } +} + static void * ractor_sleep_wo_gvl(void *ptr) { @@ -513,9 +538,8 @@ ractor_sleep_interrupt(void *ptr) rb_ractor_t *r = ptr; RACTOR_LOCK(r); - if (r->sync.wait.wakeup_status == wakeup_none) { - r->sync.wait.wakeup_status = wakeup_by_interrupt; - rb_native_cond_signal(&r->sync.cond); + { + ractor_wakeup(r, wait_receiving | wait_taking | wait_yielding, wakeup_by_interrupt); } RACTOR_UNLOCK(r); } @@ -580,31 +604,6 @@ ractor_sleep(rb_execution_context_t *ec, rb_ractor_t *cr) } } -static bool -ractor_sleeping_by(const rb_ractor_t *r, enum ractor_wait_status wait_status) -{ - return (r->sync.wait.status & wait_status) && r->sync.wait.wakeup_status == wakeup_none; -} - -static bool -ractor_wakeup(rb_ractor_t *r, enum ractor_wait_status wait_status, enum ractor_wakeup_status wakeup_status) -{ - ASSERT_ractor_locking(r); - - // fprintf(stderr, "%s r:%p status:%s/%s wakeup_status:%s/%s\n", __func__, r, - // wait_status_str(r->sync.wait.status), wait_status_str(wait_status), - // wakeup_status_str(r->sync.wait.wakeup_status), wakeup_status_str(wakeup_status)); - - if (ractor_sleeping_by(r, wait_status)) { - r->sync.wait.wakeup_status = wakeup_status; - rb_native_cond_signal(&r->sync.cond); - return true; - } - else { - return false; - } -} - static void ractor_register_taking(rb_ractor_t *r, rb_ractor_t *cr) { |