diff options
author | Koichi Sasada <ko1@atdot.net> | 2020-09-25 03:19:27 +0900 |
---|---|---|
committer | Koichi Sasada <ko1@atdot.net> | 2020-09-25 12:52:53 +0900 |
commit | 52865263467b48c0f5af6d9548972dd1f9e5bee1 (patch) | |
tree | e3f9292d6cdba7c2746f8eef9c69adb001d465b9 /ractor.c | |
parent | fde136152eacca454bfb978347abfa67bd73ac4d (diff) |
frozen T_OBJECT can be shareable.
If an T_OBJECT object is frozen and all ivars are shareable,
the object should be shareable.
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/3575
Diffstat (limited to 'ractor.c')
-rw-r--r-- | ractor.c | 23 |
1 files changed, 23 insertions, 0 deletions
@@ -1776,6 +1776,22 @@ rb_ractor_shareable_p_hash_i(VALUE key, VALUE value, VALUE arg) return ST_CONTINUE; } +static bool +ractor_obj_ivars_shareable_p(VALUE obj) +{ + uint32_t len = ROBJECT_NUMIV(obj); + VALUE *ptr = ROBJECT_IVPTR(obj); + + for (uint32_t i=0; i<len; i++) { + VALUE val = ptr[i]; + if (val != Qundef && !rb_ractor_shareable_p(ptr[i])) { + return false; + } + } + + return true; +} + MJIT_FUNC_EXPORTED bool rb_ractor_shareable_p_continue(VALUE obj) { @@ -1826,6 +1842,13 @@ rb_ractor_shareable_p_continue(VALUE obj) return false; } } + case T_OBJECT: + if (RB_OBJ_FROZEN_RAW(obj) && ractor_obj_ivars_shareable_p(obj)) { + goto shareable; + } + else { + return false; + } default: return false; } |