Make cross_ractor_require write barrier protected

This commit is contained in:
Peter Zhu 2025-07-30 14:31:20 -04:00
parent 6f7a4f9c96
commit 05353ab4b7

View file

@ -2284,58 +2284,67 @@ static const rb_data_type_t cross_ractor_require_data_type = {
NULL, // memsize NULL, // memsize
NULL, // compact NULL, // compact
}, },
0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_DECL_MARKING 0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED | RUBY_TYPED_DECL_MARKING
}; };
static VALUE static VALUE
require_body(VALUE data) require_body(VALUE crr_obj)
{ {
struct cross_ractor_require *crr = (struct cross_ractor_require *)data; struct cross_ractor_require *crr;
TypedData_Get_Struct(crr_obj, struct cross_ractor_require, &cross_ractor_require_data_type, crr);
ID require; ID require;
CONST_ID(require, "require"); CONST_ID(require, "require");
if (crr->silent) { if (crr->silent) {
int rb_require_internal_silent(VALUE fname); int rb_require_internal_silent(VALUE fname);
crr->result = INT2NUM(rb_require_internal_silent(crr->feature));
RB_OBJ_WRITE(crr_obj, &crr->result, INT2NUM(rb_require_internal_silent(crr->feature)));
} }
else { else {
crr->result = rb_funcallv(Qnil, require, 1, &crr->feature); RB_OBJ_WRITE(crr_obj, &crr->result, rb_funcallv(Qnil, require, 1, &crr->feature));
} }
return Qnil; return Qnil;
} }
static VALUE static VALUE
require_rescue(VALUE data, VALUE errinfo) require_rescue(VALUE crr_obj, VALUE errinfo)
{ {
struct cross_ractor_require *crr = (struct cross_ractor_require *)data; struct cross_ractor_require *crr;
crr->exception = errinfo; TypedData_Get_Struct(crr_obj, struct cross_ractor_require, &cross_ractor_require_data_type, crr);
RB_OBJ_WRITE(crr_obj, &crr->exception, errinfo);
return Qundef; return Qundef;
} }
static VALUE static VALUE
require_result_copy_body(VALUE data) require_result_copy_body(VALUE crr_obj)
{ {
struct cross_ractor_require *crr = (struct cross_ractor_require *)data; struct cross_ractor_require *crr;
TypedData_Get_Struct(crr_obj, struct cross_ractor_require, &cross_ractor_require_data_type, crr);
if (crr->exception != Qundef) { if (crr->exception != Qundef) {
VM_ASSERT(crr->result == Qundef); VM_ASSERT(crr->result == Qundef);
crr->exception = ractor_copy(crr->exception); RB_OBJ_WRITE(crr_obj, &crr->exception, ractor_copy(crr->exception));
} }
else{ else{
VM_ASSERT(crr->result != Qundef); VM_ASSERT(crr->result != Qundef);
crr->result = ractor_copy(crr->result); RB_OBJ_WRITE(crr_obj, &crr->result, ractor_copy(crr->result));
} }
return Qnil; return Qnil;
} }
static VALUE static VALUE
require_result_copy_resuce(VALUE data, VALUE errinfo) require_result_copy_resuce(VALUE crr_obj, VALUE errinfo)
{ {
struct cross_ractor_require *crr = (struct cross_ractor_require *)data; struct cross_ractor_require *crr;
crr->exception = errinfo; // ractor_move(crr->exception); TypedData_Get_Struct(crr_obj, struct cross_ractor_require, &cross_ractor_require_data_type, crr);
RB_OBJ_WRITE(crr_obj, &crr->exception, errinfo);
return Qnil; return Qnil;
} }
@ -2353,16 +2362,16 @@ ractor_require_protect(VALUE crr_obj, VALUE (*func)(VALUE))
} }
// catch any error // catch any error
rb_rescue2(func, (VALUE)crr, rb_rescue2(func, crr_obj,
require_rescue, (VALUE)crr, rb_eException, 0); require_rescue, crr_obj, rb_eException, 0);
if (silent) { if (silent) {
ruby_debug = debug; ruby_debug = debug;
rb_set_errinfo(errinfo); rb_set_errinfo(errinfo);
} }
rb_rescue2(require_result_copy_body, (VALUE)crr, rb_rescue2(require_result_copy_body, crr_obj,
require_result_copy_resuce, (VALUE)crr, rb_eException, 0); require_result_copy_resuce, crr_obj, rb_eException, 0);
ractor_port_send(GET_EC(), crr->port, Qtrue, Qfalse); ractor_port_send(GET_EC(), crr->port, Qtrue, Qfalse);
RB_GC_GUARD(crr_obj); RB_GC_GUARD(crr_obj);
@ -2386,8 +2395,8 @@ rb_ractor_require(VALUE feature, bool silent)
FL_SET_RAW(crr_obj, RUBY_FL_SHAREABLE); FL_SET_RAW(crr_obj, RUBY_FL_SHAREABLE);
// Convert feature to proper file path and make it shareable as fstring // Convert feature to proper file path and make it shareable as fstring
crr->feature = rb_fstring(FilePathValue(feature)); RB_OBJ_WRITE(crr_obj, &crr->feature, rb_fstring(FilePathValue(feature)));
crr->port = ractor_port_new(GET_RACTOR()); RB_OBJ_WRITE(crr_obj, &crr->port, ractor_port_new(GET_RACTOR()));
crr->result = Qundef; crr->result = Qundef;
crr->exception = Qundef; crr->exception = Qundef;
crr->silent = silent; crr->silent = silent;
@ -2422,10 +2431,13 @@ ractor_require(rb_execution_context_t *ec, VALUE self, VALUE feature)
} }
static VALUE static VALUE
autoload_load_body(VALUE data) autoload_load_body(VALUE crr_obj)
{ {
struct cross_ractor_require *crr = (struct cross_ractor_require *)data; struct cross_ractor_require *crr;
crr->result = rb_autoload_load(crr->module, crr->name); TypedData_Get_Struct(crr_obj, struct cross_ractor_require, &cross_ractor_require_data_type, crr);
RB_OBJ_WRITE(crr_obj, &crr->result, rb_autoload_load(crr->module, crr->name));
return Qnil; return Qnil;
} }
@ -2441,9 +2453,9 @@ rb_ractor_autoload_load(VALUE module, ID name)
struct cross_ractor_require *crr; struct cross_ractor_require *crr;
VALUE crr_obj = TypedData_Make_Struct(0, struct cross_ractor_require, &cross_ractor_require_data_type, crr); VALUE crr_obj = TypedData_Make_Struct(0, struct cross_ractor_require, &cross_ractor_require_data_type, crr);
FL_SET_RAW(crr_obj, RUBY_FL_SHAREABLE); FL_SET_RAW(crr_obj, RUBY_FL_SHAREABLE);
crr->module = module; RB_OBJ_WRITE(crr_obj, &crr->module, module);
crr->name = name; RB_OBJ_WRITE(crr_obj, &crr->name, name);
crr->port = ractor_port_new(GET_RACTOR()); RB_OBJ_WRITE(crr_obj, &crr->port, ractor_port_new(GET_RACTOR()));
crr->result = Qundef; crr->result = Qundef;
crr->exception = Qundef; crr->exception = Qundef;