[svn:parrot] r49505 - in branches/generational_gc: lib/Parrot/Pmc2c src/gc

bacek at svn.parrot.org bacek at svn.parrot.org
Mon Oct 11 08:11:55 UTC 2010


Author: bacek
Date: Mon Oct 11 08:11:55 2010
New Revision: 49505
URL: https://trac.parrot.org/parrot/changeset/49505

Log:
Add VTABLE_IS_WRITE_BARRIER_FLAG to avoid wrong sealing of already
sealed objects.

Modified:
   branches/generational_gc/lib/Parrot/Pmc2c/PMCEmitter.pm
   branches/generational_gc/src/gc/gc_ms2.c

Modified: branches/generational_gc/lib/Parrot/Pmc2c/PMCEmitter.pm
==============================================================================
--- branches/generational_gc/lib/Parrot/Pmc2c/PMCEmitter.pm	Mon Oct 11 08:11:13 2010	(r49504)
+++ branches/generational_gc/lib/Parrot/Pmc2c/PMCEmitter.pm	Mon Oct 11 08:11:55 2010	(r49505)
@@ -601,6 +601,9 @@
 
     for my $k ( keys %extra_vt ) {
         my $k_flags = $self->$k->vtable_flags;
+        # HACK
+        $k_flags .= '|VTABLE_IS_WRITE_BARRIER_FLAG' if $k eq 'wb';
+
         $cout .= <<"EOC";
         {
             VTABLE                   *vt_$k;

Modified: branches/generational_gc/src/gc/gc_ms2.c
==============================================================================
--- branches/generational_gc/src/gc/gc_ms2.c	Mon Oct 11 08:11:13 2010	(r49504)
+++ branches/generational_gc/src/gc/gc_ms2.c	Mon Oct 11 08:11:55 2010	(r49505)
@@ -711,14 +711,16 @@
                     /* "Seal" object with write barrier */
                     VTABLE  *t   = pmc->vtable;
 
-                    PARROT_ASSERT(pmc->vtable);
-                    PARROT_ASSERT(pmc->vtable->wb_variant_vtable);
-
-                    pmc->vtable = pmc->vtable->wb_variant_vtable;
-                    pmc->vtable->wb_variant_vtable = t;
-
-                    PARROT_ASSERT(pmc->vtable != pmc->vtable->wb_variant_vtable);
-                    PARROT_ASSERT(pmc->vtable != pmc->vtable->ro_variant_vtable);
+                    if (!(t->flags & VTABLE_IS_WRITE_BARRIER_FLAG)) {
+                        PARROT_ASSERT(pmc->vtable);
+                        PARROT_ASSERT(pmc->vtable->wb_variant_vtable);
+
+                        pmc->vtable = pmc->vtable->wb_variant_vtable;
+                        pmc->vtable->wb_variant_vtable = t;
+
+                        PARROT_ASSERT(pmc->vtable != pmc->vtable->wb_variant_vtable);
+                        PARROT_ASSERT(pmc->vtable != pmc->vtable->ro_variant_vtable);
+                    }
 
                     /* Move to older generation */
                     LIST_REMOVE(self->objects[i], tmp);


More information about the parrot-commits mailing list