@@ -266,8 +266,17 @@ void jl_init_thread_heap(jl_ptls_t ptls)
266266 memset (& ptls -> gc_num , 0 , sizeof (ptls -> gc_num ));
267267 jl_atomic_store_relaxed (& ptls -> gc_num .allocd , - (int64_t )gc_num .interval );
268268
269+ // Create mutator
269270 MMTk_Mutator mmtk_mutator = mmtk_bind_mutator ((void * )ptls , ptls -> tid );
270- ptls -> mmtk_mutator_ptr = ((MMTkMutatorContext * )mmtk_mutator );
271+ // Copy the mutator to the thread local storage
272+ memcpy (& ptls -> mmtk_mutator , mmtk_mutator , sizeof (MMTkMutatorContext ));
273+ // Call post_bind to maintain a list of active mutators and to reclaim the old mutator (which is no longer needed)
274+ mmtk_post_bind_mutator (& ptls -> mmtk_mutator , mmtk_mutator );
275+ }
276+
277+ void jl_deinit_thread_heap (jl_ptls_t ptls )
278+ {
279+ mmtk_destroy_mutator (& ptls -> mmtk_mutator );
271280}
272281
273282// System-wide initialization
@@ -506,7 +515,7 @@ void disable_collection(void)
506515JL_DLLEXPORT void jl_gc_array_ptr_copy (jl_array_t * dest , void * * dest_p , jl_array_t * src , void * * src_p , ssize_t n ) JL_NOTSAFEPOINT
507516{
508517 jl_ptls_t ptls = jl_current_task -> ptls ;
509- mmtk_memory_region_copy (ptls -> mmtk_mutator_ptr , jl_array_owner (src ), src_p , jl_array_owner (dest ), dest_p , n );
518+ mmtk_memory_region_copy (& ptls -> mmtk_mutator , jl_array_owner (src ), src_p , jl_array_owner (dest ), dest_p , n );
510519}
511520
512521// No inline write barrier -- only used for debugging
@@ -524,20 +533,20 @@ JL_DLLEXPORT void jl_gc_wb1_slow(const void *parent) JL_NOTSAFEPOINT
524533{
525534 jl_task_t * ct = jl_current_task ;
526535 jl_ptls_t ptls = ct -> ptls ;
527- mmtk_object_reference_write_slow (ptls -> mmtk_mutator_ptr , parent , (const void * ) 0 );
536+ mmtk_object_reference_write_slow (& ptls -> mmtk_mutator , parent , (const void * ) 0 );
528537}
529538
530539JL_DLLEXPORT void jl_gc_wb2_slow (const void * parent , const void * ptr ) JL_NOTSAFEPOINT
531540{
532541 jl_task_t * ct = jl_current_task ;
533542 jl_ptls_t ptls = ct -> ptls ;
534- mmtk_object_reference_write_slow (ptls -> mmtk_mutator_ptr , parent , ptr );
543+ mmtk_object_reference_write_slow (& ptls -> mmtk_mutator , parent , ptr );
535544}
536545
537546void * jl_gc_perm_alloc_nolock (size_t sz , int zero , unsigned align , unsigned offset )
538547{
539548 jl_ptls_t ptls = jl_current_task -> ptls ;
540- void * addr = mmtk_alloc (ptls -> mmtk_mutator_ptr , sz , align , offset , 1 );
549+ void * addr = mmtk_alloc (& ptls -> mmtk_mutator , sz , align , offset , 1 );
541550 return addr ;
542551}
543552
0 commit comments