@@ -36,12 +36,12 @@ use mmtk::Mutator;
3636
3737pub type RubyMutator = Mutator < Ruby > ;
3838
39- #[ no_mangle]
39+ #[ unsafe ( no_mangle) ]
4040pub extern "C" fn mmtk_is_live_object ( object : ObjectReference ) -> bool {
4141 memory_manager:: is_live_object ( object)
4242}
4343
44- #[ no_mangle]
44+ #[ unsafe ( no_mangle) ]
4545pub extern "C" fn mmtk_is_reachable ( object : ObjectReference ) -> bool {
4646 binding:: object_survives_current_gc ( object)
4747}
@@ -106,25 +106,14 @@ fn parse_float_env_var(key: &str, default: f64, min: f64, max: f64) -> f64 {
106106 . unwrap_or ( default)
107107}
108108
109- fn mmtk_builder_default_parse_heap_mode (
110- heap_min : usize ,
111- heap_max : usize ,
112- plan : PlanSelector ,
113- ) -> GCTriggerSelector {
109+ fn mmtk_builder_default_parse_heap_mode ( heap_min : usize , heap_max : usize ) -> GCTriggerSelector {
114110 let make_fixed = || GCTriggerSelector :: FixedHeapSize ( heap_max) ;
115111 let make_dynamic = || GCTriggerSelector :: DynamicHeapSize ( heap_min, heap_max) ;
116112
117113 parse_env_var_with ( "MMTK_HEAP_MODE" , |s| match s {
118114 "fixed" => Some ( make_fixed ( ) ) ,
119115 "dynamic" => Some ( make_dynamic ( ) ) ,
120116 "ruby" => {
121- if plan == PlanSelector :: NoGC {
122- eprintln ! (
123- "[WARN] Cannot use ruby heap mode with NoGC. Using fixed heap mode instead."
124- ) ;
125- return Some ( make_fixed ( ) ) ;
126- }
127-
128117 let min_ratio = parse_float_env_var ( "RUBY_GC_HEAP_FREE_SLOTS_MIN_RATIO" , 0.2 , 0.0 , 1.0 ) ;
129118 let goal_ratio =
130119 parse_float_env_var ( "RUBY_GC_HEAP_FREE_SLOTS_GOAL_RATIO" , 0.4 , min_ratio, 1.0 ) ;
@@ -144,13 +133,6 @@ fn mmtk_builder_default_parse_heap_mode(
144133 Some ( GCTriggerSelector :: Delegated )
145134 }
146135 "cpu" => {
147- if plan == PlanSelector :: NoGC {
148- eprintln ! (
149- "[WARN] Cannot use cpu heap mode with NoGC. Using fixed heap mode instead."
150- ) ;
151- return Some ( make_fixed ( ) ) ;
152- }
153-
154136 // CPU-overhead-driven heap sizing based on Tavakolisomeh et al.,
155137 // "Heap Size Adjustment with CPU Control", MPLR '23.
156138 //
@@ -202,17 +184,15 @@ fn mmtk_builder_default_parse_plan() -> PlanSelector {
202184 . unwrap_or ( PlanSelector :: Immix )
203185}
204186
205- #[ no_mangle]
187+ #[ unsafe ( no_mangle) ]
206188pub extern "C" fn mmtk_builder_default ( ) -> * mut MMTKBuilder {
207189 let mut builder = MMTKBuilder :: new_no_env_vars ( ) ;
208190 builder. options . no_finalizer . set ( true ) ;
209191
210- if let Some ( threads) = mmtk_builder_default_parse_threads ( ) {
211- if !builder. options . threads . set ( threads) {
212- // MMTk will validate it and reject 0.
213- eprintln ! ( "[FATAL] Failed to set the number of MMTk threads to {threads}" ) ;
214- std:: process:: exit ( 1 ) ;
215- }
192+ if let Some ( threads) = mmtk_builder_default_parse_threads ( ) && !builder. options . threads . set ( threads) {
193+ // MMTk will validate it and reject 0.
194+ eprintln ! ( "[FATAL] Failed to set the number of MMTk threads to {threads}" ) ;
195+ std:: process:: exit ( 1 ) ;
216196 }
217197
218198 let heap_min = mmtk_builder_default_parse_heap_min ( ) ;
@@ -224,21 +204,17 @@ pub extern "C" fn mmtk_builder_default() -> *mut MMTKBuilder {
224204 std:: process:: exit ( 1 ) ;
225205 }
226206
227- let plan = mmtk_builder_default_parse_plan ( ) ;
228-
229- builder. options . plan . set ( plan) ;
230-
231207 builder
232208 . options
233209 . gc_trigger
234- . set ( mmtk_builder_default_parse_heap_mode (
235- heap_min , heap_max , plan ,
236- ) ) ;
210+ . set ( mmtk_builder_default_parse_heap_mode ( heap_min , heap_max ) ) ;
211+
212+ builder . options . plan . set ( mmtk_builder_default_parse_plan ( ) ) ;
237213
238214 Box :: into_raw ( Box :: new ( builder) )
239215}
240216
241- #[ no_mangle]
217+ #[ unsafe ( no_mangle) ]
242218pub unsafe extern "C" fn mmtk_init_binding (
243219 builder : * mut MMTKBuilder ,
244220 binding_options : * const RubyBindingOptions ,
@@ -265,27 +241,27 @@ pub unsafe extern "C" fn mmtk_init_binding(
265241 . unwrap_or_else ( |_| panic ! ( "Binding is already initialized" ) ) ;
266242}
267243
268- #[ no_mangle]
244+ #[ unsafe ( no_mangle) ]
269245pub extern "C" fn mmtk_get_vo_bit_log_region_size ( ) -> usize {
270246 mmtk:: util:: is_mmtk_object:: VO_BIT_REGION_SIZE . trailing_zeros ( ) as usize
271247}
272248
273- #[ no_mangle]
249+ #[ unsafe ( no_mangle) ]
274250pub extern "C" fn mmtk_get_vo_bit_base_addr ( ) -> usize {
275251 mmtk:: util:: metadata:: side_metadata:: vo_bit_side_metadata_addr ( ) . as_usize ( )
276252}
277253
278- #[ no_mangle]
254+ #[ unsafe ( no_mangle) ]
279255pub extern "C" fn mmtk_initialize_collection ( tls : VMThread ) {
280256 memory_manager:: initialize_collection ( mmtk ( ) , tls)
281257}
282258
283- #[ no_mangle]
259+ #[ unsafe ( no_mangle) ]
284260pub extern "C" fn mmtk_bind_mutator ( tls : VMMutatorThread ) -> * mut RubyMutator {
285261 Box :: into_raw ( memory_manager:: bind_mutator ( mmtk ( ) , tls) )
286262}
287263
288- #[ no_mangle]
264+ #[ unsafe ( no_mangle) ]
289265pub unsafe extern "C" fn mmtk_get_bump_pointer_allocator ( m : * mut RubyMutator ) -> * mut BumpPointer {
290266 match * crate :: BINDING . get ( ) . unwrap ( ) . mmtk . get_options ( ) . plan {
291267 PlanSelector :: Immix | PlanSelector :: StickyImmix => {
@@ -303,7 +279,7 @@ pub unsafe extern "C" fn mmtk_get_bump_pointer_allocator(m: *mut RubyMutator) ->
303279 }
304280}
305281
306- #[ no_mangle]
282+ #[ unsafe ( no_mangle) ]
307283pub unsafe extern "C" fn mmtk_destroy_mutator ( mutator : * mut RubyMutator ) {
308284 // notify mmtk-core about destroyed mutator
309285 memory_manager:: destroy_mutator ( unsafe { & mut * mutator } ) ;
@@ -313,7 +289,7 @@ pub unsafe extern "C" fn mmtk_destroy_mutator(mutator: *mut RubyMutator) {
313289
314290// =============== GC ===============
315291
316- #[ no_mangle]
292+ #[ unsafe ( no_mangle) ]
317293pub extern "C" fn mmtk_handle_user_collection_request (
318294 tls : VMMutatorThread ,
319295 force : bool ,
@@ -339,7 +315,7 @@ pub extern "C" fn mmtk_handle_user_collection_request(
339315 }
340316}
341317
342- #[ no_mangle]
318+ #[ unsafe ( no_mangle) ]
343319pub extern "C" fn mmtk_set_gc_enabled ( enable : bool ) {
344320 if enable {
345321 crate :: mmtk ( ) . enable_collection ( ) ;
@@ -357,22 +333,22 @@ pub extern "C" fn mmtk_set_gc_enabled(enable: bool) {
357333 }
358334}
359335
360- #[ no_mangle]
336+ #[ unsafe ( no_mangle) ]
361337pub extern "C" fn mmtk_gc_enabled_p ( ) -> bool {
362338 crate :: mmtk ( ) . is_collection_enabled ( )
363339}
364340
365341// =============== Object allocation ===============
366342
367- #[ no_mangle]
343+ #[ unsafe ( no_mangle) ]
368344pub extern "C" fn mmtk_max_non_los_default_alloc_bytes ( ) -> usize {
369345 mmtk ( )
370346 . get_plan ( )
371347 . constraints ( )
372348 . max_non_los_default_alloc_bytes
373349}
374350
375- #[ no_mangle]
351+ #[ unsafe ( no_mangle) ]
376352pub unsafe extern "C" fn mmtk_alloc (
377353 mutator : * mut RubyMutator ,
378354 size : usize ,
@@ -390,7 +366,7 @@ pub unsafe extern "C" fn mmtk_alloc(
390366 )
391367}
392368
393- #[ no_mangle]
369+ #[ unsafe ( no_mangle) ]
394370pub unsafe extern "C" fn mmtk_post_alloc (
395371 mutator : * mut RubyMutator ,
396372 refer : ObjectReference ,
@@ -400,7 +376,7 @@ pub unsafe extern "C" fn mmtk_post_alloc(
400376 memory_manager:: post_alloc :: < Ruby > ( unsafe { & mut * mutator } , refer, bytes, semantics)
401377}
402378
403- #[ no_mangle]
379+ #[ unsafe ( no_mangle) ]
404380pub unsafe extern "C" fn mmtk_add_obj_free_candidates (
405381 objects : * const ObjectReference ,
406382 count : usize ,
@@ -414,31 +390,31 @@ pub unsafe extern "C" fn mmtk_add_obj_free_candidates(
414390
415391// =============== Weak references ===============
416392
417- #[ no_mangle]
393+ #[ unsafe ( no_mangle) ]
418394pub extern "C" fn mmtk_declare_weak_references ( object : ObjectReference ) {
419395 binding ( ) . weak_proc . add_weak_reference ( object) ;
420396}
421397
422- #[ no_mangle]
398+ #[ unsafe ( no_mangle) ]
423399pub extern "C" fn mmtk_weak_references_alive_p ( object : ObjectReference ) -> bool {
424400 binding:: object_survives_current_gc ( object)
425401}
426402
427- #[ no_mangle]
403+ #[ unsafe ( no_mangle) ]
428404pub extern "C" fn mmtk_weak_references_count ( ) -> usize {
429405 binding ( ) . weak_proc . weak_references_count ( )
430406}
431407
432408// =============== Compaction ===============
433409
434- #[ no_mangle]
410+ #[ unsafe ( no_mangle) ]
435411pub extern "C" fn mmtk_register_pinning_obj ( obj : ObjectReference ) {
436412 crate :: binding ( ) . pinning_registry . register ( obj) ;
437413}
438414
439415// =============== Write barriers ===============
440416
441- #[ no_mangle]
417+ #[ unsafe ( no_mangle) ]
442418pub unsafe extern "C" fn mmtk_object_reference_write_post (
443419 mutator : * mut RubyMutator ,
444420 object : ObjectReference ,
@@ -453,19 +429,19 @@ pub unsafe extern "C" fn mmtk_object_reference_write_post(
453429 )
454430}
455431
456- #[ no_mangle]
432+ #[ unsafe ( no_mangle) ]
457433pub extern "C" fn mmtk_register_wb_unprotected_object ( object : ObjectReference ) {
458434 crate :: binding ( ) . register_wb_unprotected_object ( object)
459435}
460436
461- #[ no_mangle]
437+ #[ unsafe ( no_mangle) ]
462438pub extern "C" fn mmtk_object_wb_unprotected_p ( object : ObjectReference ) -> bool {
463439 crate :: binding ( ) . object_wb_unprotected_p ( object)
464440}
465441
466442// =============== Heap walking ===============
467443
468- #[ no_mangle]
444+ #[ unsafe ( no_mangle) ]
469445pub extern "C" fn mmtk_enumerate_objects (
470446 callback : extern "C" fn ( ObjectReference , * mut libc:: c_void ) ,
471447 data : * mut libc:: c_void ,
@@ -477,63 +453,63 @@ pub extern "C" fn mmtk_enumerate_objects(
477453
478454// =============== Finalizers ===============
479455
480- #[ no_mangle]
456+ #[ unsafe ( no_mangle) ]
481457pub extern "C" fn mmtk_get_all_obj_free_candidates ( ) -> RawVecOfObjRef {
482458 let vec = binding ( ) . weak_proc . get_all_obj_free_candidates ( ) ;
483459 RawVecOfObjRef :: from_vec ( vec)
484460}
485461
486- #[ no_mangle]
462+ #[ unsafe ( no_mangle) ]
487463pub extern "C" fn mmtk_free_raw_vec_of_obj_ref ( raw_vec : RawVecOfObjRef ) {
488464 unsafe { raw_vec. into_vec ( ) } ;
489465}
490466
491467// =============== Forking ===============
492468
493- #[ no_mangle]
469+ #[ unsafe ( no_mangle) ]
494470pub extern "C" fn mmtk_before_fork ( ) {
495471 mmtk ( ) . prepare_to_fork ( ) ;
496472 binding ( ) . join_all_gc_threads ( ) ;
497473}
498474
499- #[ no_mangle]
475+ #[ unsafe ( no_mangle) ]
500476pub extern "C" fn mmtk_after_fork ( tls : VMThread ) {
501477 mmtk ( ) . after_fork ( tls) ;
502478}
503479
504480// =============== Statistics ===============
505481
506- #[ no_mangle]
482+ #[ unsafe ( no_mangle) ]
507483pub extern "C" fn mmtk_total_bytes ( ) -> usize {
508484 memory_manager:: total_bytes ( mmtk ( ) )
509485}
510486
511- #[ no_mangle]
487+ #[ unsafe ( no_mangle) ]
512488pub extern "C" fn mmtk_used_bytes ( ) -> usize {
513489 memory_manager:: used_bytes ( mmtk ( ) )
514490}
515491
516- #[ no_mangle]
492+ #[ unsafe ( no_mangle) ]
517493pub extern "C" fn mmtk_free_bytes ( ) -> usize {
518494 memory_manager:: free_bytes ( mmtk ( ) )
519495}
520496
521- #[ no_mangle]
497+ #[ unsafe ( no_mangle) ]
522498pub extern "C" fn mmtk_starting_heap_address ( ) -> Address {
523499 memory_manager:: starting_heap_address ( )
524500}
525501
526- #[ no_mangle]
502+ #[ unsafe ( no_mangle) ]
527503pub extern "C" fn mmtk_last_heap_address ( ) -> Address {
528504 memory_manager:: last_heap_address ( )
529505}
530506
531- #[ no_mangle]
507+ #[ unsafe ( no_mangle) ]
532508pub extern "C" fn mmtk_worker_count ( ) -> usize {
533509 memory_manager:: num_of_workers ( mmtk ( ) )
534510}
535511
536- #[ no_mangle]
512+ #[ unsafe ( no_mangle) ]
537513pub extern "C" fn mmtk_plan ( ) -> * const u8 {
538514 static NO_GC : & [ u8 ] = b"NoGC\0 " ;
539515 static MARK_SWEEP : & [ u8 ] = b"MarkSweep\0 " ;
@@ -549,7 +525,7 @@ pub extern "C" fn mmtk_plan() -> *const u8 {
549525 }
550526}
551527
552- #[ no_mangle]
528+ #[ unsafe ( no_mangle) ]
553529pub extern "C" fn mmtk_heap_mode ( ) -> * const u8 {
554530 static FIXED_HEAP : & [ u8 ] = b"fixed\0 " ;
555531 static DYNAMIC_HEAP : & [ u8 ] = b"dynamic\0 " ;
@@ -571,7 +547,7 @@ pub extern "C" fn mmtk_heap_mode() -> *const u8 {
571547 }
572548}
573549
574- #[ no_mangle]
550+ #[ unsafe ( no_mangle) ]
575551pub extern "C" fn mmtk_heap_min ( ) -> usize {
576552 match * crate :: BINDING . get ( ) . unwrap ( ) . mmtk . get_options ( ) . gc_trigger {
577553 GCTriggerSelector :: FixedHeapSize ( _) => 0 ,
@@ -591,7 +567,7 @@ pub extern "C" fn mmtk_heap_min() -> usize {
591567 }
592568}
593569
594- #[ no_mangle]
570+ #[ unsafe ( no_mangle) ]
595571pub extern "C" fn mmtk_heap_max ( ) -> usize {
596572 match * crate :: BINDING . get ( ) . unwrap ( ) . mmtk . get_options ( ) . gc_trigger {
597573 GCTriggerSelector :: FixedHeapSize ( max_size) => max_size,
@@ -613,7 +589,7 @@ pub extern "C" fn mmtk_heap_max() -> usize {
613589
614590// =============== Miscellaneous ===============
615591
616- #[ no_mangle]
592+ #[ unsafe ( no_mangle) ]
617593pub extern "C" fn mmtk_is_mmtk_object ( addr : Address ) -> bool {
618594 debug_assert ! ( !addr. is_zero( ) ) ;
619595 debug_assert ! ( addr. is_aligned_to( mmtk:: util:: is_mmtk_object:: VO_BIT_REGION_SIZE ) ) ;
0 commit comments