summaryrefslogtreecommitdiff
path: root/fnlz_mlc.c
diff options
context:
space:
mode:
authorPetter Urkedal <paurkedal@gmail.com>2018-09-19 00:23:47 +0300
committerIvan Maidanski <ivmai@mail.ru>2018-09-28 10:07:42 +0300
commit435036290c6f3acf523337f9428fef6ad6776e74 (patch)
tree91d346e6dbfa26e5ac400a78fdb9ffad2745d789 /fnlz_mlc.c
parent00976d2cde5d1174d02a5cad16c193676e50544d (diff)
downloadbdwgc-435036290c6f3acf523337f9428fef6ad6776e74.tar.gz
Fix marking of finalizer closure object
(a cherry-pick of commits 21312a008, ea9d6dd6a from 'master') * fnlz_mlc.c [ENABLE_DISCLAIM]: Include dbg_mlc.h. * fnlz_mlc.c [ENABLE_DISCLAIM] (GC_init_finalized_malloc): Call GC_register_displacement_inner(FINALIZER_CLOSURE_FLAG) and GC_register_displacement_inner(sizeof(oh)+FINALIZER_CLOSURE_FLAG); add comment. * fnlz_mlc.c [ENABLE_DISCLAIM] (GC_finalized_malloc): Call GC_dirty and REACHABLE_AFTER_DIRTY after storing fclos.
Diffstat (limited to 'fnlz_mlc.c')
-rw-r--r--fnlz_mlc.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/fnlz_mlc.c b/fnlz_mlc.c
index 3d6244aa..1e1a6ed0 100644
--- a/fnlz_mlc.c
+++ b/fnlz_mlc.c
@@ -18,6 +18,7 @@
#include "gc_disclaim.h"
#include "gc_inline.h" /* for GC_malloc_kind */
+#include "private/dbg_mlc.h" /* for oh type */
STATIC int GC_finalized_kind = 0;
@@ -67,6 +68,11 @@ GC_API void GC_CALL GC_init_finalized_malloc(void)
/* start of the user region. */
GC_register_displacement_inner(sizeof(word));
+ /* And, the pointer to the finalizer closure object itself is */
+ /* displaced due to baking in this indicator. */
+ GC_register_displacement_inner(FINALIZER_CLOSURE_FLAG);
+ GC_register_displacement_inner(sizeof(oh) + FINALIZER_CLOSURE_FLAG);
+
GC_finalized_kind = GC_new_kind_inner(GC_new_free_list_inner(),
GC_DS_LENGTH, TRUE, TRUE);
GC_ASSERT(GC_finalized_kind != 0);
@@ -96,6 +102,8 @@ GC_API GC_ATTR_MALLOC void * GC_CALL GC_finalized_malloc(size_t lb,
if (EXPECT(NULL == op, FALSE))
return NULL;
*op = (word)fclos | FINALIZER_CLOSURE_FLAG;
+ GC_dirty(op);
+ REACHABLE_AFTER_DIRTY(fclos);
return op + 1;
}