@@ -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