diff options
author | Bill Holmes <bill.holmes@unity3d.com> | 2021-10-22 11:53:26 -0400 |
---|---|---|
committer | Ivan Maidanski <ivmai@mail.ru> | 2023-02-04 10:24:30 +0300 |
commit | e71a7d653ed4b00112bb422a80b4ae05bf80e6c8 (patch) | |
tree | 14b393827553e0a1034fb3d968820d5c63481588 /finalize.c | |
parent | 703b3aace87f90c45ac10bcc618bd86d751540b5 (diff) | |
download | bdwgc-e71a7d653ed4b00112bb422a80b4ae05bf80e6c8.tar.gz |
New API function (GC_set_interrupt_finalizers) to break finalizer loop
(cherry-pick of b8a4d0d from Unity-Technologies/bdwgc)
GC_invoke_finalizers() can take a long period of time to complete.
The client might need a way to safely stop the finalization of objects
(e.g., during the shutdown of client's runtime).
* finalize.c (GC_interrupt_finalizers): New static variable.
* finalize.c (GC_set_interrupt_finalizers): New API function
definition.
* finalize.c (GC_invoke_finalizers): Break from the loop if
GC_interrupt_finalizers.
* include/gc/gc.h (GC_set_interrupt_finalizers): New API function
declaration.
Diffstat (limited to 'finalize.c')
-rw-r--r-- | finalize.c | 9 |
1 files changed, 8 insertions, 1 deletions
@@ -1216,6 +1216,13 @@ GC_INNER void GC_finalize(void) #endif /* !JAVA_FINALIZATION_NOT_NEEDED */ +STATIC GC_bool GC_interrupt_finalizers = FALSE; + +GC_API void GC_CALL 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.) */ @@ -1235,7 +1242,7 @@ GC_API int GC_CALL GC_invoke_finalizers(void) word bytes_freed_before = 0; /* initialized to prevent warning. */ GC_ASSERT(I_DONT_HOLD_LOCK()); - while (GC_should_invoke_finalizers()) { + while (GC_should_invoke_finalizers() && !GC_interrupt_finalizers) { struct finalizable_object * curr_fo; # ifdef THREADS |