summaryrefslogtreecommitdiff
path: root/finalize.c
diff options
context:
space:
mode:
authorIvan Maidanski <ivmai@mail.ru>2022-12-30 07:41:59 +0300
committerIvan Maidanski <ivmai@mail.ru>2022-12-30 10:42:41 +0300
commiteefacb753ae1f4dd8f6e0fe007335553d4a2019e (patch)
tree050054437f66063cd5ce3bd590fc2258272aa07e /finalize.c
parentb528d5760e1e05c51b341741833a3caba34ea20a (diff)
downloadbdwgc-eefacb753ae1f4dd8f6e0fe007335553d4a2019e.tar.gz
Do not invoke finalizers during thread creation or destruction
* finalize.c [THREADS] (GC_notify_or_invoke_finalizers): Do not call GC_check_finalizer_nested() and GC_invoke_finalizers() if GC_in_thread_creation.
Diffstat (limited to 'finalize.c')
-rw-r--r--finalize.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/finalize.c b/finalize.c
index 1dac0ec9..0a4353d0 100644
--- a/finalize.c
+++ b/finalize.c
@@ -1349,7 +1349,15 @@ GC_INNER void GC_notify_or_invoke_finalizers(void)
}
if (!GC_finalize_on_demand) {
- unsigned char *pnested = GC_check_finalizer_nested();
+ unsigned char *pnested;
+
+# ifdef THREADS
+ if (EXPECT(GC_in_thread_creation, FALSE)) {
+ UNLOCK();
+ return;
+ }
+# endif
+ pnested = GC_check_finalizer_nested();
UNLOCK();
/* Skip GC_invoke_finalizers() if nested */
if (pnested != NULL) {