@@ -2237,6 +2237,28 @@ struct cross_ractor_require {
2237
2237
ID name ;
2238
2238
};
2239
2239
2240
+ static void
2241
+ cross_ractor_require_mark (void * ptr )
2242
+ {
2243
+ struct cross_ractor_require * crr = (struct cross_ractor_require * )ptr ;
2244
+ rb_gc_mark (crr -> port );
2245
+ rb_gc_mark (crr -> result );
2246
+ rb_gc_mark (crr -> exception );
2247
+ rb_gc_mark (crr -> feature );
2248
+ rb_gc_mark (crr -> module );
2249
+ }
2250
+
2251
+ static const rb_data_type_t cross_ractor_require_data_type = {
2252
+ "ractor/cross_ractor_require" ,
2253
+ {
2254
+ cross_ractor_require_mark ,
2255
+ RUBY_DEFAULT_FREE ,
2256
+ NULL , // memsize
2257
+ NULL , // compact
2258
+ },
2259
+ 0 , 0 , RUBY_TYPED_FREE_IMMEDIATELY
2260
+ };
2261
+
2240
2262
static VALUE
2241
2263
require_body (VALUE data )
2242
2264
{
@@ -2283,8 +2305,11 @@ require_result_copy_resuce(VALUE data, VALUE errinfo)
2283
2305
}
2284
2306
2285
2307
static VALUE
2286
- ractor_require_protect (struct cross_ractor_require * crr , VALUE (* func )(VALUE ))
2308
+ ractor_require_protect (VALUE crr_obj , VALUE (* func )(VALUE ))
2287
2309
{
2310
+ struct cross_ractor_require * crr ;
2311
+ TypedData_Get_Struct (crr_obj , struct cross_ractor_require , & cross_ractor_require_data_type , crr );
2312
+
2288
2313
// catch any error
2289
2314
rb_rescue2 (func , (VALUE )crr ,
2290
2315
require_rescue , (VALUE )crr , rb_eException , 0 );
@@ -2293,43 +2318,48 @@ ractor_require_protect(struct cross_ractor_require *crr, VALUE (*func)(VALUE))
2293
2318
require_result_copy_resuce , (VALUE )crr , rb_eException , 0 );
2294
2319
2295
2320
ractor_port_send (GET_EC (), crr -> port , Qtrue , Qfalse );
2321
+ RB_GC_GUARD (crr_obj );
2296
2322
return Qnil ;
2297
2323
}
2298
2324
2299
2325
static VALUE
2300
- ractor_require_func (void * data )
2326
+ ractor_require_func (void * crr_obj )
2301
2327
{
2302
- struct cross_ractor_require * crr = (struct cross_ractor_require * )data ;
2303
- return ractor_require_protect (crr , require_body );
2328
+ return ractor_require_protect ((VALUE )crr_obj , require_body );
2304
2329
}
2305
2330
2306
2331
VALUE
2307
2332
rb_ractor_require (VALUE feature )
2308
2333
{
2334
+ struct cross_ractor_require * crr ;
2335
+ VALUE crr_obj = TypedData_Make_Struct (0 , struct cross_ractor_require , & cross_ractor_require_data_type , crr );
2336
+
2309
2337
// TODO: make feature shareable
2310
- struct cross_ractor_require crr = {
2311
- .feature = feature , // TODO: ractor
2312
- .port = ractor_port_new (GET_RACTOR ()),
2313
- .result = Qundef ,
2314
- .exception = Qundef ,
2315
- };
2338
+ crr -> feature = feature ;
2339
+ crr -> port = ractor_port_new (GET_RACTOR ());
2340
+ crr -> result = Qundef ;
2341
+ crr -> exception = Qundef ;
2316
2342
2317
2343
rb_execution_context_t * ec = GET_EC ();
2318
2344
rb_ractor_t * main_r = GET_VM ()-> ractor .main_ractor ;
2319
- rb_ractor_interrupt_exec (main_r , ractor_require_func , & crr , 0 );
2345
+ rb_ractor_interrupt_exec (main_r , ractor_require_func , ( void * ) crr_obj , rb_interrupt_exec_flag_value_data );
2320
2346
2321
2347
// wait for require done
2322
- ractor_port_receive (ec , crr . port );
2323
- ractor_port_close (ec , crr . port );
2348
+ ractor_port_receive (ec , crr -> port );
2349
+ ractor_port_close (ec , crr -> port );
2324
2350
2325
- if (crr .exception != Qundef ) {
2326
- ractor_reset_belonging (crr .exception );
2327
- rb_exc_raise (crr .exception );
2351
+ VALUE exc = crr -> exception ;
2352
+ VALUE result = crr -> result ;
2353
+ RB_GC_GUARD (crr_obj );
2354
+
2355
+ if (exc != Qundef ) {
2356
+ ractor_reset_belonging (exc );
2357
+ rb_exc_raise (exc );
2328
2358
}
2329
2359
else {
2330
- RUBY_ASSERT (crr . result != Qundef );
2331
- ractor_reset_belonging (crr . result );
2332
- return crr . r
6D4E
esult ;
2360
+ RUBY_ASSERT (result != Qundef );
2361
+ ractor_reset_belonging (result );
2362
+ return result ;
2333
2363
}
2334
2364
}
2335
2365
@@ -2348,36 +2378,39 @@ autoload_load_body(VALUE data)
2348
2378
}
2349
2379
2350
2380
static VALUE
2351
- ractor_autoload_load_func (void * data )
2381
+ ractor_autoload_load_func (void * crr_obj )
2352
2382
{
2353
- struct cross_ractor_require * crr = (struct cross_ractor_require * )data ;
2354
- return ractor_require_protect (crr , autoload_load_body );
2383
+ return ractor_require_protect ((VALUE )crr_obj , autoload_load_body );
2355
2384
}
2356
2385
2357
2386
VALUE
2358
2387
rb_ractor_autoload_load (VALUE module , ID name )
2359
2388
{
2360
- struct cross_ractor_require crr = {
2361
- . module = module ,
2362
- . name = name ,
2363
- . port = ractor_port_new ( GET_RACTOR ()),
2364
- . result = Qundef ,
2365
- . exception = Qundef ,
2366
- } ;
2389
+ struct cross_ractor_require * crr ;
2390
+ VALUE crr_obj = TypedData_Make_Struct ( 0 , struct cross_ractor_require , & cross_ractor_require_data_type , crr );
2391
+ crr -> module = module ;
2392
+ crr -> name = name ;
2393
+ crr -> port = ractor_port_new ( GET_RACTOR ());
2394
+ crr -> result = Qundef ;
2395
+ crr -> exception = Qundef ;
2367
2396
2368
2397
rb_execution_context_t * ec = GET_EC ();
2369
2398
rb_ractor_t * main_r = GET_VM ()-> ractor .main_ractor ;
2370
- rb_ractor_interrupt_exec (main_r , ractor_autoload_load_func , & crr , 0 );
2399
+ rb_ractor_interrupt_exec (main_r , ractor_autoload_load_func , ( void * ) crr_obj , rb_interrupt_exec_flag_value_data );
2371
2400
2372
2401
// wait for require done
2373
- ractor_port_receive (ec , crr .port );
2374
- ractor_port_close (ec , crr .port );
2402
+ ractor_port_receive (ec , crr -> port );
2403
+ ractor_port_close (ec , crr -> port );
2404
+
2405
+ VALUE exc = crr -> exception ;
2406
+ VALUE result = crr -> result ;
2407
+ RB_GC_GUARD (crr_obj );
2375
2408
2376
- if (crr . exception != Qundef ) {
2377
- rb_exc_raise (crr . exception );
2409
+ if (exc != Qundef ) {
2410
+ rb_exc_raise (exc );
2378
2411
}
2379
2412
else {
2380
- return crr . result ;
2413
+ return result ;
2381
2414
}
2382
2415
}
2383
2416
0 commit comments