summaryrefslogtreecommitdiff
path: root/finalize.c
diff options
context:
space:
mode:
authorBill Holmes <bill.holmes@unity3d.com>2021-10-22 11:53:26 -0400
committerIvan Maidanski <ivmai@mail.ru>2023-02-04 10:24:30 +0300
commite71a7d653ed4b00112bb422a80b4ae05bf80e6c8 (patch)
tree14b393827553e0a1034fb3d968820d5c63481588 /finalize.c
parent703b3aace87f90c45ac10bcc618bd86d751540b5 (diff)
downloadbdwgc-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.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/finalize.c b/finalize.c
index ffbf96ce..bc71a5b4 100644
--- a/finalize.c
+++ b/finalize.c
@@ -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