@@ -181,6 +181,7 @@ bigval_t *big_objects_marked = NULL;
181181// `to_finalize` should not have tagged pointers.
182182arraylist_t finalizer_list_marked ;
183183arraylist_t to_finalize ;
184+ int jl_gc_have_pending_finalizers = 0 ;
184185
185186NOINLINE uintptr_t gc_get_stack_ptr (void )
186187{
@@ -261,6 +262,7 @@ static void schedule_finalization(void *o, void *f) JL_NOTSAFEPOINT
261262{
262263 arraylist_push (& to_finalize , o );
263264 arraylist_push (& to_finalize , f );
265+ jl_gc_have_pending_finalizers = 1 ;
264266}
265267
266268static void run_finalizer (jl_ptls_t ptls , jl_value_t * o , jl_value_t * ff )
@@ -386,19 +388,47 @@ static void run_finalizers(jl_ptls_t ptls)
386388 if (to_finalize .items == to_finalize ._space ) {
387389 copied_list .items = copied_list ._space ;
388390 }
391+ jl_gc_have_pending_finalizers = 0 ;
389392 arraylist_new (& to_finalize , 0 );
390393 // This releases the finalizers lock.
391394 jl_gc_run_finalizers_in_list (ptls , & copied_list );
392395 arraylist_free (& copied_list );
393396}
394397
398+ JL_DLLEXPORT void jl_gc_run_pending_finalizers (jl_ptls_t ptls )
399+ {
400+ if (ptls == NULL )
401+ ptls = jl_get_ptls_states ();
402+ if (!ptls -> in_finalizer && ptls -> locks .len == 0 && ptls -> finalizers_inhibited == 0 ) {
403+ ptls -> in_finalizer = 1 ;
404+ run_finalizers (ptls );
405+ ptls -> in_finalizer = 0 ;
406+ }
407+ }
408+
395409JL_DLLEXPORT int jl_gc_get_finalizers_inhibited (jl_ptls_t ptls )
396410{
397411 if (ptls == NULL )
398412 ptls = jl_get_ptls_states ();
399413 return ptls -> finalizers_inhibited ;
400414}
401415
416+ JL_DLLEXPORT void jl_gc_disable_finalizers_internal (void )
417+ {
418+ jl_ptls_t ptls = jl_get_ptls_states ();
419+ ptls -> finalizers_inhibited ++ ;
420+ }
421+
422+ JL_DLLEXPORT void jl_gc_enable_finalizers_internal (void )
423+ {
424+ jl_ptls_t ptls = jl_get_ptls_states ();
425+ #ifdef NDEBUG
426+ ptls -> finalizers_inhibited -- ;
427+ #else
428+ jl_gc_enable_finalizers (ptls , 1 );
429+ #endif
430+ }
431+
402432JL_DLLEXPORT void jl_gc_enable_finalizers (jl_ptls_t ptls , int on )
403433{
404434 if (ptls == NULL )
@@ -421,10 +451,8 @@ JL_DLLEXPORT void jl_gc_enable_finalizers(jl_ptls_t ptls, int on)
421451 return ;
422452 }
423453 ptls -> finalizers_inhibited = new_val ;
424- if (!new_val && old_val && !ptls -> in_finalizer && ptls -> locks .len == 0 ) {
425- ptls -> in_finalizer = 1 ;
426- run_finalizers (ptls );
427- ptls -> in_finalizer = 0 ;
454+ if (jl_gc_have_pending_finalizers ) {
455+ jl_gc_run_pending_finalizers (ptls );
428456 }
429457}
430458
0 commit comments