summaryrefslogtreecommitdiff
path: root/fnlz_mlc.c
diff options
context:
space:
mode:
authorIvan Maidanski <ivmai@mail.ru>2023-04-11 00:23:10 +0300
committerIvan Maidanski <ivmai@mail.ru>2023-04-11 00:24:09 +0300
commitd80ce053ff9701ccac04506267bbdf30be350481 (patch)
treed25f2182302372ad259ad25b26f3ba09d453a506 /fnlz_mlc.c
parentf62ced2173e0d665a1797acf85568ee030aa64f2 (diff)
downloadbdwgc-d80ce053ff9701ccac04506267bbdf30be350481.tar.gz
Fix double lock in GC_init_finalized_malloc
(fix of commit 05ee810c3) * fnlz_mlc.c [ENABLE_DISCLAIM] (GC_register_disclaim_proc_inner): New STATIC function (move most code from GC_register_disclaim_proc except for LOCK/UNLOCK). * fnlz_mlc.c [ENABLE_DISCLAIM] (GC_init_finalized_malloc): Call GC_register_disclaim_proc_inner instead of GC_register_disclaim_proc. * fnlz_mlc.c [ENABLE_DISCLAIM] (GC_register_disclaim_proc): Call GC_register_disclaim_proc_inner().
Diffstat (limited to 'fnlz_mlc.c')
-rw-r--r--fnlz_mlc.c20
1 files changed, 13 insertions, 7 deletions
diff --git a/fnlz_mlc.c b/fnlz_mlc.c
index cb6f1c3e..d5030b84 100644
--- a/fnlz_mlc.c
+++ b/fnlz_mlc.c
@@ -52,6 +52,16 @@ STATIC int GC_CALLBACK GC_finalized_disclaim(void *obj)
return 0;
}
+STATIC void GC_register_disclaim_proc_inner(int kind, GC_disclaim_proc proc,
+ GC_bool mark_unconditionally)
+{
+ GC_ASSERT((unsigned)kind < MAXOBJKINDS);
+ if (EXPECT(GC_find_leak, FALSE)) return;
+
+ GC_obj_kinds[kind].ok_disclaim_proc = proc;
+ GC_obj_kinds[kind].ok_mark_unconditionally = mark_unconditionally;
+}
+
GC_API void GC_CALL GC_init_finalized_malloc(void)
{
GC_init(); /* In case it's not already done. */
@@ -76,20 +86,16 @@ GC_API void GC_CALL GC_init_finalized_malloc(void)
GC_finalized_kind = GC_new_kind_inner(GC_new_free_list_inner(),
GC_DS_LENGTH, TRUE, TRUE);
GC_ASSERT(GC_finalized_kind != 0);
- GC_register_disclaim_proc(GC_finalized_kind, GC_finalized_disclaim, TRUE);
+ GC_register_disclaim_proc_inner(GC_finalized_kind, GC_finalized_disclaim,
+ TRUE);
UNLOCK();
}
GC_API void GC_CALL GC_register_disclaim_proc(int kind, GC_disclaim_proc proc,
int mark_unconditionally)
{
- GC_ASSERT((unsigned)kind < MAXOBJKINDS);
LOCK();
- if (!EXPECT(GC_find_leak, FALSE)) {
- GC_obj_kinds[kind].ok_disclaim_proc = proc;
- GC_obj_kinds[kind].ok_mark_unconditionally =
- (GC_bool)mark_unconditionally;
- }
+ GC_register_disclaim_proc_inner(kind, proc, (GC_bool)mark_unconditionally);
UNLOCK();
}