]> granicus.if.org Git - gc/commitdiff
Fix marking of finalizer closure object
authorPetter Urkedal <paurkedal@gmail.com>
Tue, 18 Sep 2018 21:23:47 +0000 (00:23 +0300)
committerIvan Maidanski <ivmai@mail.ru>
Fri, 28 Sep 2018 07:07:42 +0000 (10:07 +0300)
(a cherry-pick of commits 21312a008ea9d6dd6a 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.

fnlz_mlc.c

index 3d6244aae58706938d0d6400bf41e645e16a4211..1e1a6ed0292f620eff113b3ea2cd495d426573f0 100644 (file)
@@ -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;
 }