[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