summaryrefslogtreecommitdiff
path: root/vm_method.c
diff options
context:
space:
mode:
authorKoichi Sasada <ko1@atdot.net>2020-11-30 16:18:43 +0900
committerKoichi Sasada <ko1@atdot.net>2020-12-01 15:44:18 +0900
commit182fb73c40351f917bf44626c44c1adb6cb1aa5a (patch)
treefe9dd0b8c312dc491b1576004ce80122b77fbfe4 /vm_method.c
parent8247b8eddeb2a504a5c9776d1f77d413c8146897 (diff)
rb_ext_ractor_safe() to declare ractor-safe ext
C extensions can violate the ractor-safety, so only ractor-safe C extensions (C methods) can run on non-main ractors. rb_ext_ractor_safe(true) declares that the successive defined methods are ractor-safe. Otherwiwze, defined methods checked they are invoked in main ractor and raise an error if invoked at non-main ractors. [Feature #17307]
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/3824
Diffstat (limited to 'vm_method.c')
-rw-r--r--vm_method.c68
1 files changed, 47 insertions, 21 deletions
diff --git a/vm_method.c b/vm_method.c
index a143db7cc5..6845ad44f0 100644
--- a/vm_method.c
+++ b/vm_method.c
@@ -347,27 +347,53 @@ extern int rb_method_definition_eq(const rb_method_definition_t *d1, const rb_me
static VALUE
(*call_cfunc_invoker_func(int argc))(VALUE recv, int argc, const VALUE *, VALUE (*func)(ANYARGS))
{
- switch (argc) {
- case -2: return &call_cfunc_m2;
- case -1: return &call_cfunc_m1;
- case 0: return &call_cfunc_0;
- case 1: return &call_cfunc_1;
- case 2: return &call_cfunc_2;
- case 3: return &call_cfunc_3;
- case 4: return &call_cfunc_4;
- case 5: return &call_cfunc_5;
- case 6: return &call_cfunc_6;
- case 7: return &call_cfunc_7;
- case 8: return &call_cfunc_8;
- case 9: return &call_cfunc_9;
- case 10: return &call_cfunc_10;
- case 11: return &call_cfunc_11;
- case 12: return &call_cfunc_12;
- case 13: return &call_cfunc_13;
- case 14: return &call_cfunc_14;
- case 15: return &call_cfunc_15;
- default:
- rb_bug("call_cfunc_func: unsupported length: %d", argc);
+ if (!GET_THREAD()->ext_config.ractor_safe) {
+ switch (argc) {
+ case -2: return &call_cfunc_m2;
+ case -1: return &call_cfunc_m1;
+ case 0: return &call_cfunc_0;
+ case 1: return &call_cfunc_1;
+ case 2: return &call_cfunc_2;
+ case 3: return &call_cfunc_3;
+ case 4: return &call_cfunc_4;
+ case 5: return &call_cfunc_5;
+ case 6: return &call_cfunc_6;
+ case 7: return &call_cfunc_7;
+ case 8: return &call_cfunc_8;
+ case 9: return &call_cfunc_9;
+ case 10: return &call_cfunc_10;
+ case 11: return &call_cfunc_11;
+ case 12: return &call_cfunc_12;
+ case 13: return &call_cfunc_13;
+ case 14: return &call_cfunc_14;
+ case 15: return &call_cfunc_15;
+ default:
+ rb_bug("unsupported length: %d", argc);
+ }
+ }
+ else {
+ switch (argc) {
+ case -2: return &ractor_safe_call_cfunc_m2;
+ case -1: return &ractor_safe_call_cfunc_m1;
+ case 0: return &ractor_safe_call_cfunc_0;
+ case 1: return &ractor_safe_call_cfunc_1;
+ case 2: return &ractor_safe_call_cfunc_2;
+ case 3: return &ractor_safe_call_cfunc_3;
+ case 4: return &ractor_safe_call_cfunc_4;
+ case 5: return &ractor_safe_call_cfunc_5;
+ case 6: return &ractor_safe_call_cfunc_6;
+ case 7: return &ractor_safe_call_cfunc_7;
+ case 8: return &ractor_safe_call_cfunc_8;
+ case 9: return &ractor_safe_call_cfunc_9;
+ case 10: return &ractor_safe_call_cfunc_10;
+ case 11: return &ractor_safe_call_cfunc_11;
+ case 12: return &ractor_safe_call_cfunc_12;
+ case 13: return &ractor_safe_call_cfunc_13;
+ case 14: return &ractor_safe_call_cfunc_14;
+ case 15: return &ractor_safe_call_cfunc_15;
+ default:
+ rb_bug("unsupported length: %d", argc);
+ }
}
}