@@ -346,61 +346,39 @@ size_t get_so_size(void* obj_raw)
346346 return 0 ;
347347}
348348
349- void run_finalizer_function ( void * o_raw , void * ff_raw , bool is_ptr )
350- {
351- jl_value_t * o = ( jl_value_t * ) o_raw ;
352- jl_value_t * ff = ( jl_value_t * ) ff_raw ;
353- if ( is_ptr ) {
354- run_finalizer ( jl_current_task , ( jl_value_t * )((( uintptr_t ) o ) | 1 ), ( jl_value_t * ) ff );
355- } else {
356- run_finalizer (jl_current_task , ( jl_value_t * ) o , ( jl_value_t * ) ff );
349+ extern void run_finalizers ( jl_task_t * ct );
350+
351+ // Called after GC to run finalizers
352+ void mmtk_jl_run_finalizers ( void * ptls_raw ) {
353+ jl_ptls_t ptls = ( jl_ptls_t ) ptls_raw ;
354+ if (! ptls -> finalizers_inhibited && ptls -> locks . len == 0 ) {
355+ JL_TIMING ( GC , GC_Finalizers );
356+ run_finalizers (jl_current_task );
357357 }
358358}
359359
360+ // We implement finalization in the binding side. These functions
361+ // returns some pointers so MMTk can manipulate finalizer lists.
362+
363+ extern jl_mutex_t finalizers_lock ;
364+ extern arraylist_t to_finalize ;
365+ extern arraylist_t finalizer_list_marked ;
360366
361- static inline void mmtk_jl_run_finalizers_in_list (bool at_exit ) {
362- jl_task_t * ct = jl_current_task ;
363- uint8_t sticky = ct -> sticky ;
364- mmtk_run_finalizers (at_exit );
365- ct -> sticky = sticky ;
367+ void * get_thread_finalizer_list (void * ptls_raw ) {
368+ jl_ptls_t ptls = (jl_ptls_t ) ptls_raw ;
369+ return (void * )& ptls -> finalizers ;
366370}
367371
368- void mmtk_jl_run_pending_finalizers (void * ptls ) {
369- if (!((jl_ptls_t )ptls )-> in_finalizer && !((jl_ptls_t )ptls )-> finalizers_inhibited && ((jl_ptls_t )ptls )-> locks .len == 0 ) {
370- jl_task_t * ct = jl_current_task ;
371- ((jl_ptls_t )ptls )-> in_finalizer = 1 ;
372- uint64_t save_rngState [JL_RNG_SIZE ];
373- memcpy (& save_rngState [0 ], & ct -> rngState [0 ], sizeof (save_rngState ));
374- jl_rng_split (ct -> rngState , finalizer_rngState );
375- jl_atomic_store_relaxed (& jl_gc_have_pending_finalizers , 0 );
376- mmtk_jl_run_finalizers_in_list (false);
377- memcpy (& ct -> rngState [0 ], & save_rngState [0 ], sizeof (save_rngState ));
378- ((jl_ptls_t )ptls )-> in_finalizer = 0 ;
379- }
372+ void * get_to_finalize_list (void ) {
373+ return (void * )& to_finalize ;
380374}
381375
382- void mmtk_jl_run_finalizers (void * ptls ) {
383- // Only disable finalizers on current thread
384- // Doing this on all threads is racy (it's impossible to check
385- // or wait for finalizers on other threads without dead lock).
386- if (!((jl_ptls_t )ptls )-> finalizers_inhibited && ((jl_ptls_t )ptls )-> locks .len == 0 ) {
387- jl_task_t * ct = jl_current_task ;
388- int8_t was_in_finalizer = ((jl_ptls_t )ptls )-> in_finalizer ;
389- ((jl_ptls_t )ptls )-> in_finalizer = 1 ;
390- uint64_t save_rngState [JL_RNG_SIZE ];
391- memcpy (& save_rngState [0 ], & ct -> rngState [0 ], sizeof (save_rngState ));
392- jl_rng_split (ct -> rngState , finalizer_rngState );
393- jl_atomic_store_relaxed (& jl_gc_have_pending_finalizers , 0 );
394- mmtk_jl_run_finalizers_in_list (false);
395- memcpy (& ct -> rngState [0 ], & save_rngState [0 ], sizeof (save_rngState ));
396- ((jl_ptls_t )ptls )-> in_finalizer = was_in_finalizer ;
397- } else {
398- jl_atomic_store_relaxed (& jl_gc_have_pending_finalizers , 1 );
399- }
376+ void * get_marked_finalizers_list (void ) {
377+ return (void * )& finalizer_list_marked ;
400378}
401379
402- void mmtk_jl_gc_run_all_finalizers (void ) {
403- mmtk_jl_run_finalizers_in_list (true) ;
380+ int * get_jl_gc_have_pending_finalizers (void ) {
381+ return ( int * ) & jl_gc_have_pending_finalizers ;
404382}
405383
406384// add the initial root set to mmtk roots
@@ -928,7 +906,7 @@ Julia_Upcalls mmtk_upcalls = (Julia_Upcalls) {
928906 .scan_julia_exc_obj = scan_julia_exc_obj ,
929907 .get_stackbase = get_stackbase ,
930908 .calculate_roots = calculate_roots ,
931- .run_finalizer_function = run_finalizer_function ,
909+ // .run_finalizer_function = run_finalizer_function,
932910 .get_jl_last_err = get_jl_last_err ,
933911 .set_jl_last_err = set_jl_last_err ,
934912 .get_lo_size = get_lo_size ,
@@ -946,4 +924,9 @@ Julia_Upcalls mmtk_upcalls = (Julia_Upcalls) {
946924 .jl_hrtime = jl_hrtime ,
947925 .update_gc_time = update_gc_time ,
948926 .get_abi_structs_checksum_c = get_abi_structs_checksum_c ,
927+ .get_thread_finalizer_list = get_thread_finalizer_list ,
928+ .get_to_finalize_list = get_to_finalize_list ,
929+ .get_marked_finalizers_list = get_marked_finalizers_list ,
930+ .arraylist_grow = (void (* )(void * , long unsigned int ))arraylist_grow ,
931+ .get_jl_gc_have_pending_finalizers = get_jl_gc_have_pending_finalizers ,
949932};
0 commit comments