From a72b7b898c69a116d754d599e8bb061761015255 Mon Sep 17 00:00:00 2001 From: nagachika Date: Mon, 21 Mar 2022 16:23:30 +0900 Subject: merge revision(s) d0d6227a0da5925acf946a09191f172daf53baf2,fff1edf23ba28267bf57097c269f7fa87530e3fa: [Backport #17529] alen should be actions number on ractor_select() alen was number of rs, but it should be actions number (taking ractors + receiving + yielding). --- ractor.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) fix Ractor.yield(obj, move: true) Ractor.yield(obj, move: true) and Ractor.select(..., yield_value: obj, move: true) tried to yield a value with move semantices, but if the trial is faild, the obj should not become a moved object. To keep this rule, `wait_moving` wait status is introduced. New yield/take process: (1) If a ractor tried to yield (move:true), make taking racotr's wait status `wait_moving` and make a moved object by `ractor_move(obj)` and wakeup taking ractor. (2) If a ractor tried to take a message from a ractor waiting fo yielding (move:true), wakeup the ractor and wait for (1). --- bootstraptest/test_ractor.rb | 25 +++++++++++++++ ractor.c | 73 +++++++++++++++++++++++++++++++++++--------- ractor_core.h | 1 + 3 files changed, 84 insertions(+), 15 deletions(-) --- ractor_core.h | 1 + 1 file changed, 1 insertion(+) (limited to 'ractor_core.h') diff --git a/ractor_core.h b/ractor_core.h index 1ed6858c9f..800e7ce409 100644 --- a/ractor_core.h +++ b/ractor_core.h @@ -61,6 +61,7 @@ struct rb_ractor_sync { wait_receiving = 0x01, wait_taking = 0x02, wait_yielding = 0x04, + wait_moving = 0x08, } status; enum ractor_wakeup_status { -- cgit v1.2.3