diff options
Diffstat (limited to 'finalize.c')
-rw-r--r-- | finalize.c | 10 |
1 files changed, 9 insertions, 1 deletions
@@ -1264,6 +1264,14 @@ GC_INNER void GC_finalize(void) #endif /* !JAVA_FINALIZATION_NOT_NEEDED */ +static volatile GC_bool GC_interrupt_finalizers = FALSE; + +void +GC_set_interrupt_finalizers(void) +{ + GC_interrupt_finalizers = TRUE; +} + /* Returns true if it is worth calling GC_invoke_finalizers. (Useful if */ /* finalizers can only be called from some kind of "safe state" and */ /* getting into that safe state is expensive.) */ @@ -1284,7 +1292,7 @@ GC_API int GC_CALL GC_invoke_finalizers(void) word bytes_freed_before = 0; /* initialized to prevent warning. */ DCL_LOCK_STATE; - while (GC_should_invoke_finalizers()) { + while (GC_should_invoke_finalizers() && !GC_interrupt_finalizers) { struct finalizable_object * curr_fo; # ifdef THREADS |