@@ -48,13 +48,20 @@ struct objspace {
4848 unsigned int fork_hook_vm_lock_lev ;
4949};
5050
51+ #define OBJ_FREE_BUF_CAPACITY 128
52+
5153struct MMTk_ractor_cache {
5254 struct ccan_list_node list_node ;
5355
5456 MMTk_Mutator * mutator ;
5557 bool gc_mutator_p ;
5658
5759 MMTk_BumpPointer * bump_pointer ;
60+
61+ MMTk_ObjectReference obj_free_parallel_buf [OBJ_FREE_BUF_CAPACITY ];
62+ size_t obj_free_parallel_count ;
63+ MMTk_ObjectReference obj_free_non_parallel_buf [OBJ_FREE_BUF_CAPACITY ];
64+ size_t obj_free_non_parallel_count ;
5865};
5966
6067struct MMTk_final_job {
@@ -143,6 +150,8 @@ rb_mmtk_resume_mutators(void)
143150 }
144151}
145152
153+ static void mmtk_flush_obj_free_buffer (struct MMTk_ractor_cache * cache );
154+
146155static void
147156rb_mmtk_block_for_gc (MMTk_VMMutatorThread mutator )
148157{
@@ -173,6 +182,11 @@ rb_mmtk_block_for_gc(MMTk_VMMutatorThread mutator)
173182
174183 rb_gc_vm_barrier ();
175184
185+ struct MMTk_ractor_cache * rc ;
186+ ccan_list_for_each (& objspace -> ractor_caches , rc , list_node ) {
187+ mmtk_flush_obj_free_buffer (rc );
188+ }
189+
176190 objspace -> world_stopped = true;
177191
178192 pthread_cond_broadcast (& objspace -> cond_world_stopped );
@@ -584,7 +598,7 @@ rb_gc_impl_ractor_cache_alloc(void *objspace_ptr, void *ractor)
584598 }
585599 objspace -> live_ractor_cache_count ++ ;
586600
587- struct MMTk_ractor_cache * cache = malloc ( sizeof (struct MMTk_ractor_cache ));
601+ struct MMTk_ractor_cache * cache = calloc ( 1 , sizeof (struct MMTk_ractor_cache ));
588602 ccan_list_add (& objspace -> ractor_caches , & cache -> list_node );
589603
590604 cache -> mutator = mmtk_bind_mutator (cache );
@@ -601,6 +615,8 @@ rb_gc_impl_ractor_cache_free(void *objspace_ptr, void *cache_ptr)
601615
602616 ccan_list_del (& cache -> list_node );
603617
618+ mmtk_flush_obj_free_buffer (cache );
619+
604620 if (ruby_free_at_exit_p ()) {
605621 MMTK_ASSERT (objspace -> live_ractor_cache_count > 0 );
606622 }
@@ -801,6 +817,42 @@ obj_can_parallel_free_p(VALUE obj)
801817 }
802818}
803819
820+ static void
821+ mmtk_flush_obj_free_buffer (struct MMTk_ractor_cache * cache )
822+ {
823+ if (cache -> obj_free_parallel_count > 0 ) {
824+ mmtk_add_obj_free_candidates (cache -> obj_free_parallel_buf ,
825+ cache -> obj_free_parallel_count , true);
826+ cache -> obj_free_parallel_count = 0 ;
827+ }
828+ if (cache -> obj_free_non_parallel_count > 0 ) {
829+ mmtk_add_obj_free_candidates (cache -> obj_free_non_parallel_buf ,
830+ cache -> obj_free_non_parallel_count , false);
831+ cache -> obj_free_non_parallel_count = 0 ;
832+ }
833+ }
834+
835+ static inline void
836+ mmtk_buffer_obj_free_candidate (struct MMTk_ractor_cache * cache , VALUE obj )
837+ {
838+ if (obj_can_parallel_free_p (obj )) {
839+ cache -> obj_free_parallel_buf [cache -> obj_free_parallel_count ++ ] = (MMTk_ObjectReference )obj ;
840+ if (cache -> obj_free_parallel_count >= OBJ_FREE_BUF_CAPACITY ) {
841+ mmtk_add_obj_free_candidates (cache -> obj_free_parallel_buf ,
842+ cache -> obj_free_parallel_count , true);
843+ cache -> obj_free_parallel_count = 0 ;
844+ }
845+ }
846+ else {
847+ cache -> obj_free_non_parallel_buf [cache -> obj_free_non_parallel_count ++ ] = (MMTk_ObjectReference )obj ;
848+ if (cache -> obj_free_non_parallel_count >= OBJ_FREE_BUF_CAPACITY ) {
849+ mmtk_add_obj_free_candidates (cache -> obj_free_non_parallel_buf ,
850+ cache -> obj_free_non_parallel_count , false);
851+ cache -> obj_free_non_parallel_count = 0 ;
852+ }
853+ }
854+ }
855+
804856VALUE
805857rb_gc_impl_new_obj (void * objspace_ptr , void * cache_ptr , VALUE klass , VALUE flags , bool wb_protected , size_t alloc_size )
806858{
@@ -837,7 +889,7 @@ rb_gc_impl_new_obj(void *objspace_ptr, void *cache_ptr, VALUE klass, VALUE flags
837889 mmtk_post_alloc (ractor_cache -> mutator , (void * )alloc_obj , alloc_size , MMTK_ALLOCATION_SEMANTICS_DEFAULT );
838890
839891 // TODO: only add when object needs obj_free to be called
840- mmtk_add_obj_free_candidate ( alloc_obj , obj_can_parallel_free_p (( VALUE )alloc_obj ) );
892+ mmtk_buffer_obj_free_candidate ( ractor_cache , ( VALUE )alloc_obj );
841893
842894 objspace -> total_allocated_objects ++ ;
843895
@@ -1277,6 +1329,11 @@ rb_gc_impl_shutdown_call_finalizer(void *objspace_ptr)
12771329
12781330 unsigned int lev = RB_GC_VM_LOCK ();
12791331 {
1332+ struct MMTk_ractor_cache * rc ;
1333+ ccan_list_for_each (& objspace -> ractor_caches , rc , list_node ) {
1334+ mmtk_flush_obj_free_buffer (rc );
1335+ }
1336+
12801337 struct MMTk_RawVecOfObjRef registered_candidates = mmtk_get_all_obj_free_candidates ();
12811338 for (size_t i = 0 ; i < registered_candidates .len ; i ++ ) {
12821339 VALUE obj = (VALUE )registered_candidates .ptr [i ];
0 commit comments