diff options
author | Ivan Maidanski <ivmai@mail.ru> | 2023-04-11 00:23:10 +0300 |
---|---|---|
committer | Ivan Maidanski <ivmai@mail.ru> | 2023-04-11 00:24:09 +0300 |
commit | d80ce053ff9701ccac04506267bbdf30be350481 (patch) | |
tree | d25f2182302372ad259ad25b26f3ba09d453a506 /fnlz_mlc.c | |
parent | f62ced2173e0d665a1797acf85568ee030aa64f2 (diff) | |
download | bdwgc-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.c | 20 |
1 files changed, 13 insertions, 7 deletions
@@ -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(); } |