mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
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]
This commit is contained in:
parent
8247b8edde
commit
182fb73c40
Notes:
git
2020-12-01 15:44:43 +09:00
7 changed files with 267 additions and 35 deletions
|
@ -34,6 +34,10 @@ void rb_provide(const char*);
|
||||||
VALUE rb_f_require(VALUE, VALUE);
|
VALUE rb_f_require(VALUE, VALUE);
|
||||||
VALUE rb_require_string(VALUE);
|
VALUE rb_require_string(VALUE);
|
||||||
|
|
||||||
|
// extension configuration
|
||||||
|
void rb_ext_ractor_safe(bool flag);
|
||||||
|
#define RB_EXT_RACTOR_SAFE(f) rb_ext_ractor_safe(f)
|
||||||
|
|
||||||
RBIMPL_SYMBOL_EXPORT_END()
|
RBIMPL_SYMBOL_EXPORT_END()
|
||||||
|
|
||||||
#endif /* RBIMPL_INTERN_LOAD_H */
|
#endif /* RBIMPL_INTERN_LOAD_H */
|
||||||
|
|
26
load.c
26
load.c
|
@ -997,6 +997,25 @@ rb_resolve_feature_path(VALUE klass, VALUE fname)
|
||||||
return rb_ary_new_from_args(2, sym, path);
|
return rb_ary_new_from_args(2, sym, path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
ext_config_push(rb_thread_t *th, struct rb_ext_config *prev)
|
||||||
|
{
|
||||||
|
*prev = th->ext_config;
|
||||||
|
th->ext_config = (struct rb_ext_config){0};
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
ext_config_pop(rb_thread_t *th, struct rb_ext_config *prev)
|
||||||
|
{
|
||||||
|
th->ext_config = *prev;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
rb_ext_ractor_safe(bool flag)
|
||||||
|
{
|
||||||
|
GET_THREAD()->ext_config.ractor_safe = flag;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* returns
|
* returns
|
||||||
* 0: if already loaded (false)
|
* 0: if already loaded (false)
|
||||||
|
@ -1015,6 +1034,8 @@ require_internal(rb_execution_context_t *ec, VALUE fname, int exception)
|
||||||
enum ruby_tag_type state;
|
enum ruby_tag_type state;
|
||||||
char *volatile ftptr = 0;
|
char *volatile ftptr = 0;
|
||||||
VALUE path;
|
VALUE path;
|
||||||
|
volatile bool reset_ext_config = false;
|
||||||
|
struct rb_ext_config prev_ext_config;
|
||||||
|
|
||||||
fname = rb_get_path(fname);
|
fname = rb_get_path(fname);
|
||||||
path = rb_str_encode_ospath(fname);
|
path = rb_str_encode_ospath(fname);
|
||||||
|
@ -1045,6 +1066,8 @@ require_internal(rb_execution_context_t *ec, VALUE fname, int exception)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 's':
|
case 's':
|
||||||
|
reset_ext_config = true;
|
||||||
|
ext_config_push(th, &prev_ext_config);
|
||||||
handle = (long)rb_vm_call_cfunc(rb_vm_top_self(), load_ext,
|
handle = (long)rb_vm_call_cfunc(rb_vm_top_self(), load_ext,
|
||||||
path, VM_BLOCK_HANDLER_NONE, path);
|
path, VM_BLOCK_HANDLER_NONE, path);
|
||||||
rb_ary_push(ruby_dln_librefs, LONG2NUM(handle));
|
rb_ary_push(ruby_dln_librefs, LONG2NUM(handle));
|
||||||
|
@ -1055,9 +1078,12 @@ require_internal(rb_execution_context_t *ec, VALUE fname, int exception)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
EC_POP_TAG();
|
EC_POP_TAG();
|
||||||
|
|
||||||
th = rb_ec_thread_ptr(ec);
|
th = rb_ec_thread_ptr(ec);
|
||||||
th->top_self = self;
|
th->top_self = self;
|
||||||
th->top_wrapper = wrapper;
|
th->top_wrapper = wrapper;
|
||||||
|
if (reset_ext_config) ext_config_pop(th, &prev_ext_config);
|
||||||
|
|
||||||
if (ftptr) load_unlock(RSTRING_PTR(path), !state);
|
if (ftptr) load_unlock(RSTRING_PTR(path), !state);
|
||||||
|
|
||||||
if (state) {
|
if (state) {
|
||||||
|
|
2
ractor.c
2
ractor.c
|
@ -21,6 +21,7 @@ static VALUE rb_eRactorRemoteError;
|
||||||
static VALUE rb_eRactorMovedError;
|
static VALUE rb_eRactorMovedError;
|
||||||
static VALUE rb_eRactorClosedError;
|
static VALUE rb_eRactorClosedError;
|
||||||
static VALUE rb_cRactorMovedObject;
|
static VALUE rb_cRactorMovedObject;
|
||||||
|
VALUE rb_eRactorUnsafeError;
|
||||||
|
|
||||||
VALUE
|
VALUE
|
||||||
rb_ractor_error_class(void)
|
rb_ractor_error_class(void)
|
||||||
|
@ -1670,6 +1671,7 @@ Init_Ractor(void)
|
||||||
rb_eRactorRemoteError = rb_define_class_under(rb_cRactor, "RemoteError", rb_eRactorError);
|
rb_eRactorRemoteError = rb_define_class_under(rb_cRactor, "RemoteError", rb_eRactorError);
|
||||||
rb_eRactorMovedError = rb_define_class_under(rb_cRactor, "MovedError", rb_eRactorError);
|
rb_eRactorMovedError = rb_define_class_under(rb_cRactor, "MovedError", rb_eRactorError);
|
||||||
rb_eRactorClosedError = rb_define_class_under(rb_cRactor, "ClosedError", rb_eStopIteration);
|
rb_eRactorClosedError = rb_define_class_under(rb_cRactor, "ClosedError", rb_eStopIteration);
|
||||||
|
rb_eRactorUnsafeError = rb_define_class_under(rb_cRactor, "UnsafeError", rb_eRactorError);
|
||||||
|
|
||||||
rb_cRactorMovedObject = rb_define_class_under(rb_cRactor, "MovedObject", rb_cBasicObject);
|
rb_cRactorMovedObject = rb_define_class_under(rb_cRactor, "MovedObject", rb_cBasicObject);
|
||||||
rb_undef_alloc_func(rb_cRactorMovedObject);
|
rb_undef_alloc_func(rb_cRactorMovedObject);
|
||||||
|
|
1
vm.c
1
vm.c
|
@ -3052,6 +3052,7 @@ th_init(rb_thread_t *th, VALUE self)
|
||||||
#endif
|
#endif
|
||||||
th->name = Qnil;
|
th->name = Qnil;
|
||||||
th->report_on_exception = th->vm->thread_report_on_exception;
|
th->report_on_exception = th->vm->thread_report_on_exception;
|
||||||
|
th->ext_config.ractor_safe = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
|
|
|
@ -912,6 +912,10 @@ void rb_ec_initialize_vm_stack(rb_execution_context_t *ec, VALUE *stack, size_t
|
||||||
// @param ec the execution context to update.
|
// @param ec the execution context to update.
|
||||||
void rb_ec_clear_vm_stack(rb_execution_context_t *ec);
|
void rb_ec_clear_vm_stack(rb_execution_context_t *ec);
|
||||||
|
|
||||||
|
struct rb_ext_config {
|
||||||
|
bool ractor_safe;
|
||||||
|
};
|
||||||
|
|
||||||
typedef struct rb_ractor_struct rb_ractor_t;
|
typedef struct rb_ractor_struct rb_ractor_t;
|
||||||
|
|
||||||
typedef struct rb_thread_struct {
|
typedef struct rb_thread_struct {
|
||||||
|
@ -1000,6 +1004,8 @@ typedef struct rb_thread_struct {
|
||||||
/* misc */
|
/* misc */
|
||||||
VALUE name;
|
VALUE name;
|
||||||
|
|
||||||
|
struct rb_ext_config ext_config;
|
||||||
|
|
||||||
#ifdef USE_SIGALTSTACK
|
#ifdef USE_SIGALTSTACK
|
||||||
void *altstack;
|
void *altstack;
|
||||||
#endif
|
#endif
|
||||||
|
@ -1994,6 +2000,8 @@ extern void rb_reset_coverages(void);
|
||||||
|
|
||||||
void rb_postponed_job_flush(rb_vm_t *vm);
|
void rb_postponed_job_flush(rb_vm_t *vm);
|
||||||
|
|
||||||
|
extern VALUE rb_eRactorUnsafeError; // ractor.c
|
||||||
|
|
||||||
RUBY_SYMBOL_EXPORT_END
|
RUBY_SYMBOL_EXPORT_END
|
||||||
|
|
||||||
#endif /* RUBY_VM_CORE_H */
|
#endif /* RUBY_VM_CORE_H */
|
||||||
|
|
193
vm_insnhelper.c
193
vm_insnhelper.c
|
@ -2469,110 +2469,275 @@ vm_call_iseq_setup_tailcall(rb_execution_context_t *ec, rb_control_frame_t *cfp,
|
||||||
return Qundef;
|
return Qundef;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
ractor_unsafe_check(void)
|
||||||
|
{
|
||||||
|
if (!rb_ractor_main_p()) {
|
||||||
|
rb_raise(rb_eRactorUnsafeError, "ractor unsafe method called from not main ractor");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
call_cfunc_m2(VALUE recv, int argc, const VALUE *argv, VALUE (*func)(ANYARGS))
|
call_cfunc_m2(VALUE recv, int argc, const VALUE *argv, VALUE (*func)(ANYARGS))
|
||||||
{
|
{
|
||||||
|
ractor_unsafe_check();
|
||||||
return (*func)(recv, rb_ary_new4(argc, argv));
|
return (*func)(recv, rb_ary_new4(argc, argv));
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
call_cfunc_m1(VALUE recv, int argc, const VALUE *argv, VALUE (*func)(ANYARGS))
|
call_cfunc_m1(VALUE recv, int argc, const VALUE *argv, VALUE (*func)(ANYARGS))
|
||||||
{
|
{
|
||||||
|
ractor_unsafe_check();
|
||||||
return (*func)(argc, argv, recv);
|
return (*func)(argc, argv, recv);
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
call_cfunc_0(VALUE recv, int argc, const VALUE *argv, VALUE (*func)(ANYARGS))
|
call_cfunc_0(VALUE recv, int argc, const VALUE *argv, VALUE (*func)(ANYARGS))
|
||||||
{
|
{
|
||||||
|
ractor_unsafe_check();
|
||||||
VALUE(*f)(VALUE) = (VALUE(*)(VALUE))func;
|
VALUE(*f)(VALUE) = (VALUE(*)(VALUE))func;
|
||||||
return (*f)(recv);
|
return (*f)(recv);
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
call_cfunc_1(VALUE recv, int argc, const VALUE *argv, VALUE (*func)(ANYARGS))
|
call_cfunc_1(VALUE recv, int argc, const VALUE *argv, VALUE (*func)(ANYARGS))
|
||||||
|
{
|
||||||
|
ractor_unsafe_check();
|
||||||
|
VALUE(*f)(VALUE, VALUE) = (VALUE(*)(VALUE, VALUE))func;
|
||||||
|
return (*f)(recv, argv[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static VALUE
|
||||||
|
call_cfunc_2(VALUE recv, int argc, const VALUE *argv, VALUE (*func)(ANYARGS))
|
||||||
|
{
|
||||||
|
ractor_unsafe_check();
|
||||||
|
VALUE(*f)(VALUE, VALUE, VALUE) = (VALUE(*)(VALUE, VALUE, VALUE))func;
|
||||||
|
return (*f)(recv, argv[0], argv[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static VALUE
|
||||||
|
call_cfunc_3(VALUE recv, int argc, const VALUE *argv, VALUE (*func)(ANYARGS))
|
||||||
|
{
|
||||||
|
ractor_unsafe_check();
|
||||||
|
VALUE(*f)(VALUE, VALUE, VALUE, VALUE) = (VALUE(*)(VALUE, VALUE, VALUE, VALUE))func;
|
||||||
|
return (*f)(recv, argv[0], argv[1], argv[2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static VALUE
|
||||||
|
call_cfunc_4(VALUE recv, int argc, const VALUE *argv, VALUE (*func)(ANYARGS))
|
||||||
|
{
|
||||||
|
ractor_unsafe_check();
|
||||||
|
VALUE(*f)(VALUE, VALUE, VALUE, VALUE, VALUE) = (VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE))func;
|
||||||
|
return (*f)(recv, argv[0], argv[1], argv[2], argv[3]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static VALUE
|
||||||
|
call_cfunc_5(VALUE recv, int argc, const VALUE *argv, VALUE (*func)(ANYARGS))
|
||||||
|
{
|
||||||
|
ractor_unsafe_check();
|
||||||
|
VALUE(*f)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE) = (VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE))func;
|
||||||
|
return (*f)(recv, argv[0], argv[1], argv[2], argv[3], argv[4]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static VALUE
|
||||||
|
call_cfunc_6(VALUE recv, int argc, const VALUE *argv, VALUE (*func)(ANYARGS))
|
||||||
|
{
|
||||||
|
ractor_unsafe_check();
|
||||||
|
VALUE(*f)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE) = (VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE))func;
|
||||||
|
return (*f)(recv, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static VALUE
|
||||||
|
call_cfunc_7(VALUE recv, int argc, const VALUE *argv, VALUE (*func)(ANYARGS))
|
||||||
|
{
|
||||||
|
ractor_unsafe_check();
|
||||||
|
VALUE(*f)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE) = (VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE))func;
|
||||||
|
return (*f)(recv, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static VALUE
|
||||||
|
call_cfunc_8(VALUE recv, int argc, const VALUE *argv, VALUE (*func)(ANYARGS))
|
||||||
|
{
|
||||||
|
ractor_unsafe_check();
|
||||||
|
VALUE(*f)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE) = (VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE))func;
|
||||||
|
return (*f)(recv, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static VALUE
|
||||||
|
call_cfunc_9(VALUE recv, int argc, const VALUE *argv, VALUE (*func)(ANYARGS))
|
||||||
|
{
|
||||||
|
ractor_unsafe_check();
|
||||||
|
VALUE(*f)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE) = (VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE))func;
|
||||||
|
return (*f)(recv, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static VALUE
|
||||||
|
call_cfunc_10(VALUE recv, int argc, const VALUE *argv, VALUE (*func)(ANYARGS))
|
||||||
|
{
|
||||||
|
ractor_unsafe_check();
|
||||||
|
VALUE(*f)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE) = (VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE))func;
|
||||||
|
return (*f)(recv, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static VALUE
|
||||||
|
call_cfunc_11(VALUE recv, int argc, const VALUE *argv, VALUE (*func)(ANYARGS))
|
||||||
|
{
|
||||||
|
ractor_unsafe_check();
|
||||||
|
VALUE(*f)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE) = (VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE))func;
|
||||||
|
return (*f)(recv, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9], argv[10]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static VALUE
|
||||||
|
call_cfunc_12(VALUE recv, int argc, const VALUE *argv, VALUE (*func)(ANYARGS))
|
||||||
|
{
|
||||||
|
ractor_unsafe_check();
|
||||||
|
VALUE(*f)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE) = (VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE))func;
|
||||||
|
return (*f)(recv, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9], argv[10], argv[11]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static VALUE
|
||||||
|
call_cfunc_13(VALUE recv, int argc, const VALUE *argv, VALUE (*func)(ANYARGS))
|
||||||
|
{
|
||||||
|
ractor_unsafe_check();
|
||||||
|
VALUE(*f)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE) = (VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE))func;
|
||||||
|
return (*f)(recv, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9], argv[10], argv[11], argv[12]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static VALUE
|
||||||
|
call_cfunc_14(VALUE recv, int argc, const VALUE *argv, VALUE (*func)(ANYARGS))
|
||||||
|
{
|
||||||
|
ractor_unsafe_check();
|
||||||
|
VALUE(*f)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE) = (VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE))func;
|
||||||
|
return (*f)(recv, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9], argv[10], argv[11], argv[12], argv[13]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static VALUE
|
||||||
|
call_cfunc_15(VALUE recv, int argc, const VALUE *argv, VALUE (*func)(ANYARGS))
|
||||||
|
{
|
||||||
|
ractor_unsafe_check();
|
||||||
|
VALUE(*f)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE) = (VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE))func;
|
||||||
|
return (*f)(recv, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9], argv[10], argv[11], argv[12], argv[13], argv[14]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static VALUE
|
||||||
|
ractor_safe_call_cfunc_m2(VALUE recv, int argc, const VALUE *argv, VALUE (*func)(ANYARGS))
|
||||||
|
{
|
||||||
|
return (*func)(recv, rb_ary_new4(argc, argv));
|
||||||
|
}
|
||||||
|
|
||||||
|
static VALUE
|
||||||
|
ractor_safe_call_cfunc_m1(VALUE recv, int argc, const VALUE *argv, VALUE (*func)(ANYARGS))
|
||||||
|
{
|
||||||
|
return (*func)(argc, argv, recv);
|
||||||
|
}
|
||||||
|
|
||||||
|
static VALUE
|
||||||
|
ractor_safe_call_cfunc_0(VALUE recv, int argc, const VALUE *argv, VALUE (*func)(ANYARGS))
|
||||||
|
{
|
||||||
|
VALUE(*f)(VALUE) = (VALUE(*)(VALUE))func;
|
||||||
|
return (*f)(recv);
|
||||||
|
}
|
||||||
|
|
||||||
|
static VALUE
|
||||||
|
ractor_safe_call_cfunc_1(VALUE recv, int argc, const VALUE *argv, VALUE (*func)(ANYARGS))
|
||||||
{
|
{
|
||||||
VALUE(*f)(VALUE, VALUE) = (VALUE(*)(VALUE, VALUE))func;
|
VALUE(*f)(VALUE, VALUE) = (VALUE(*)(VALUE, VALUE))func;
|
||||||
return (*f)(recv, argv[0]);
|
return (*f)(recv, argv[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
call_cfunc_2(VALUE recv, int argc, const VALUE *argv, VALUE (*func)(ANYARGS))
|
ractor_safe_call_cfunc_2(VALUE recv, int argc, const VALUE *argv, VALUE (*func)(ANYARGS))
|
||||||
{
|
{
|
||||||
VALUE(*f)(VALUE, VALUE, VALUE) = (VALUE(*)(VALUE, VALUE, VALUE))func;
|
VALUE(*f)(VALUE, VALUE, VALUE) = (VALUE(*)(VALUE, VALUE, VALUE))func;
|
||||||
return (*f)(recv, argv[0], argv[1]);
|
return (*f)(recv, argv[0], argv[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
call_cfunc_3(VALUE recv, int argc, const VALUE *argv, VALUE (*func)(ANYARGS))
|
ractor_safe_call_cfunc_3(VALUE recv, int argc, const VALUE *argv, VALUE (*func)(ANYARGS))
|
||||||
{
|
{
|
||||||
VALUE(*f)(VALUE, VALUE, VALUE, VALUE) = (VALUE(*)(VALUE, VALUE, VALUE, VALUE))func;
|
VALUE(*f)(VALUE, VALUE, VALUE, VALUE) = (VALUE(*)(VALUE, VALUE, VALUE, VALUE))func;
|
||||||
return (*f)(recv, argv[0], argv[1], argv[2]);
|
return (*f)(recv, argv[0], argv[1], argv[2]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
call_cfunc_4(VALUE recv, int argc, const VALUE *argv, VALUE (*func)(ANYARGS))
|
ractor_safe_call_cfunc_4(VALUE recv, int argc, const VALUE *argv, VALUE (*func)(ANYARGS))
|
||||||
{
|
{
|
||||||
VALUE(*f)(VALUE, VALUE, VALUE, VALUE, VALUE) = (VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE))func;
|
VALUE(*f)(VALUE, VALUE, VALUE, VALUE, VALUE) = (VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE))func;
|
||||||
return (*f)(recv, argv[0], argv[1], argv[2], argv[3]);
|
return (*f)(recv, argv[0], argv[1], argv[2], argv[3]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
call_cfunc_5(VALUE recv, int argc, const VALUE *argv, VALUE (*func)(ANYARGS))
|
ractor_safe_call_cfunc_5(VALUE recv, int argc, const VALUE *argv, VALUE (*func)(ANYARGS))
|
||||||
{
|
{
|
||||||
VALUE(*f)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE) = (VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE))func;
|
VALUE(*f)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE) = (VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE))func;
|
||||||
return (*f)(recv, argv[0], argv[1], argv[2], argv[3], argv[4]);
|
return (*f)(recv, argv[0], argv[1], argv[2], argv[3], argv[4]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
call_cfunc_6(VALUE recv, int argc, const VALUE *argv, VALUE (*func)(ANYARGS))
|
ractor_safe_call_cfunc_6(VALUE recv, int argc, const VALUE *argv, VALUE (*func)(ANYARGS))
|
||||||
{
|
{
|
||||||
VALUE(*f)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE) = (VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE))func;
|
VALUE(*f)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE) = (VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE))func;
|
||||||
return (*f)(recv, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5]);
|
return (*f)(recv, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
call_cfunc_7(VALUE recv, int argc, const VALUE *argv, VALUE (*func)(ANYARGS))
|
ractor_safe_call_cfunc_7(VALUE recv, int argc, const VALUE *argv, VALUE (*func)(ANYARGS))
|
||||||
{
|
{
|
||||||
VALUE(*f)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE) = (VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE))func;
|
VALUE(*f)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE) = (VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE))func;
|
||||||
return (*f)(recv, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6]);
|
return (*f)(recv, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
call_cfunc_8(VALUE recv, int argc, const VALUE *argv, VALUE (*func)(ANYARGS))
|
ractor_safe_call_cfunc_8(VALUE recv, int argc, const VALUE *argv, VALUE (*func)(ANYARGS))
|
||||||
{
|
{
|
||||||
VALUE(*f)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE) = (VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE))func;
|
VALUE(*f)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE) = (VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE))func;
|
||||||
return (*f)(recv, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7]);
|
return (*f)(recv, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
call_cfunc_9(VALUE recv, int argc, const VALUE *argv, VALUE (*func)(ANYARGS))
|
ractor_safe_call_cfunc_9(VALUE recv, int argc, const VALUE *argv, VALUE (*func)(ANYARGS))
|
||||||
{
|
{
|
||||||
VALUE(*f)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE) = (VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE))func;
|
VALUE(*f)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE) = (VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE))func;
|
||||||
return (*f)(recv, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8]);
|
return (*f)(recv, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
call_cfunc_10(VALUE recv, int argc, const VALUE *argv, VALUE (*func)(ANYARGS))
|
ractor_safe_call_cfunc_10(VALUE recv, int argc, const VALUE *argv, VALUE (*func)(ANYARGS))
|
||||||
{
|
{
|
||||||
VALUE(*f)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE) = (VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE))func;
|
VALUE(*f)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE) = (VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE))func;
|
||||||
return (*f)(recv, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9]);
|
return (*f)(recv, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
call_cfunc_11(VALUE recv, int argc, const VALUE *argv, VALUE (*func)(ANYARGS))
|
ractor_safe_call_cfunc_11(VALUE recv, int argc, const VALUE *argv, VALUE (*func)(ANYARGS))
|
||||||
{
|
{
|
||||||
VALUE(*f)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE) = (VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE))func;
|
VALUE(*f)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE) = (VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE))func;
|
||||||
return (*f)(recv, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9], argv[10]);
|
return (*f)(recv, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9], argv[10]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
call_cfunc_12(VALUE recv, int argc, const VALUE *argv, VALUE (*func)(ANYARGS))
|
ractor_safe_call_cfunc_12(VALUE recv, int argc, const VALUE *argv, VALUE (*func)(ANYARGS))
|
||||||
{
|
{
|
||||||
VALUE(*f)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE) = (VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE))func;
|
VALUE(*f)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE) = (VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE))func;
|
||||||
return (*f)(recv, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9], argv[10], argv[11]);
|
return (*f)(recv, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9], argv[10], argv[11]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
call_cfunc_13(VALUE recv, int argc, const VALUE *argv, VALUE (*func)(ANYARGS))
|
ractor_safe_call_cfunc_13(VALUE recv, int argc, const VALUE *argv, VALUE (*func)(ANYARGS))
|
||||||
{
|
{
|
||||||
VALUE(*f)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE) = (VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE))func;
|
VALUE(*f)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE) = (VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE))func;
|
||||||
return (*f)(recv, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9], argv[10], argv[11], argv[12]);
|
return (*f)(recv, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9], argv[10], argv[11], argv[12]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
call_cfunc_14(VALUE recv, int argc, const VALUE *argv, VALUE (*func)(ANYARGS))
|
ractor_safe_call_cfunc_14(VALUE recv, int argc, const VALUE *argv, VALUE (*func)(ANYARGS))
|
||||||
{
|
{
|
||||||
VALUE(*f)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE) = (VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE))func;
|
VALUE(*f)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE) = (VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE))func;
|
||||||
return (*f)(recv, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9], argv[10], argv[11], argv[12], argv[13]);
|
return (*f)(recv, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9], argv[10], argv[11], argv[12], argv[13]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
call_cfunc_15(VALUE recv, int argc, const VALUE *argv, VALUE (*func)(ANYARGS))
|
ractor_safe_call_cfunc_15(VALUE recv, int argc, const VALUE *argv, VALUE (*func)(ANYARGS))
|
||||||
{
|
{
|
||||||
VALUE(*f)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE) = (VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE))func;
|
VALUE(*f)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE) = (VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE))func;
|
||||||
return (*f)(recv, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9], argv[10], argv[11], argv[12], argv[13], argv[14]);
|
return (*f)(recv, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9], argv[10], argv[11], argv[12], argv[13], argv[14]);
|
||||||
|
|
68
vm_method.c
68
vm_method.c
|
@ -347,27 +347,53 @@ extern int rb_method_definition_eq(const rb_method_definition_t *d1, const rb_me
|
||||||
static VALUE
|
static VALUE
|
||||||
(*call_cfunc_invoker_func(int argc))(VALUE recv, int argc, const VALUE *, VALUE (*func)(ANYARGS))
|
(*call_cfunc_invoker_func(int argc))(VALUE recv, int argc, const VALUE *, VALUE (*func)(ANYARGS))
|
||||||
{
|
{
|
||||||
switch (argc) {
|
if (!GET_THREAD()->ext_config.ractor_safe) {
|
||||||
case -2: return &call_cfunc_m2;
|
switch (argc) {
|
||||||
case -1: return &call_cfunc_m1;
|
case -2: return &call_cfunc_m2;
|
||||||
case 0: return &call_cfunc_0;
|
case -1: return &call_cfunc_m1;
|
||||||
case 1: return &call_cfunc_1;
|
case 0: return &call_cfunc_0;
|
||||||
case 2: return &call_cfunc_2;
|
case 1: return &call_cfunc_1;
|
||||||
case 3: return &call_cfunc_3;
|
case 2: return &call_cfunc_2;
|
||||||
case 4: return &call_cfunc_4;
|
case 3: return &call_cfunc_3;
|
||||||
case 5: return &call_cfunc_5;
|
case 4: return &call_cfunc_4;
|
||||||
case 6: return &call_cfunc_6;
|
case 5: return &call_cfunc_5;
|
||||||
case 7: return &call_cfunc_7;
|
case 6: return &call_cfunc_6;
|
||||||
case 8: return &call_cfunc_8;
|
case 7: return &call_cfunc_7;
|
||||||
case 9: return &call_cfunc_9;
|
case 8: return &call_cfunc_8;
|
||||||
case 10: return &call_cfunc_10;
|
case 9: return &call_cfunc_9;
|
||||||
case 11: return &call_cfunc_11;
|
case 10: return &call_cfunc_10;
|
||||||
case 12: return &call_cfunc_12;
|
case 11: return &call_cfunc_11;
|
||||||
case 13: return &call_cfunc_13;
|
case 12: return &call_cfunc_12;
|
||||||
case 14: return &call_cfunc_14;
|
case 13: return &call_cfunc_13;
|
||||||
case 15: return &call_cfunc_15;
|
case 14: return &call_cfunc_14;
|
||||||
default:
|
case 15: return &call_cfunc_15;
|
||||||
rb_bug("call_cfunc_func: unsupported length: %d", argc);
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue