mirror of
https://github.com/ruby/ruby.git
synced 2025-08-15 13:39:04 +02:00
Make cross_ractor_require write barrier protected
This commit is contained in:
parent
6f7a4f9c96
commit
05353ab4b7
1 changed files with 39 additions and 27 deletions
66
ractor.c
66
ractor.c
|
@ -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;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue