summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--finalize.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/finalize.c b/finalize.c
index 62ec894c..10c6ffb5 100644
--- a/finalize.c
+++ b/finalize.c
@@ -660,6 +660,10 @@ STATIC void GC_unreachable_finalize_mark_proc(ptr_t p)
GC_normal_finalize_mark_proc(p);
}
+static GC_bool need_unreachable_finalization = FALSE;
+ /* Avoid the work if this is not used. */
+ /* TODO: turn need_unreachable_finalization into a counter */
+
/* Register a finalization function. See gc.h for details. */
/* The last parameter is a procedure that determines */
/* marking for finalization ordering. Any objects marked */
@@ -682,6 +686,8 @@ STATIC void GC_register_finalizer_inner(void * obj,
}
LOCK();
GC_ASSERT(obj != NULL && GC_base_C(obj) == obj);
+ if (mp == GC_unreachable_finalize_mark_proc)
+ need_unreachable_finalization = TRUE;
if (EXPECT(NULL == GC_fnlz_roots.fo_head, FALSE)
|| EXPECT(GC_fo_entries > ((word)1 << GC_log_fo_table_size), FALSE)) {
GC_grow_table((struct hash_chain_entry ***)&GC_fnlz_roots.fo_head,
@@ -823,14 +829,10 @@ GC_API void GC_CALL GC_register_finalizer_no_order(void * obj,
ocd, GC_null_finalize_mark_proc);
}
-static GC_bool need_unreachable_finalization = FALSE;
- /* Avoid the work if this isn't used. */
-
GC_API void GC_CALL GC_register_finalizer_unreachable(void * obj,
GC_finalization_proc fn, void * cd,
GC_finalization_proc *ofn, void ** ocd)
{
- need_unreachable_finalization = TRUE;
GC_ASSERT(GC_java_finalization);
GC_register_finalizer_inner(obj, fn, cd, ofn,
ocd, GC_unreachable_finalize_mark_proc);