Author: Remi Meier <[email protected]>
Branch: c8-card-marking
Changeset: r1671:aaa47dab157c
Date: 2015-02-26 20:35 +0100
http://bitbucket.org/pypy/stmgc/changeset/aaa47dab157c/
Log: progress
diff --git a/c8/stm/core.c b/c8/stm/core.c
--- a/c8/stm/core.c
+++ b/c8/stm/core.c
@@ -985,7 +985,7 @@
({
assert(item->stm_flags & GCFLAG_WB_EXECUTED);
_cards_cleared_in_object(pseg, item); /* check for C8 */
- _reset_object_cards(pseg, item, CARD_CLEAR, false); /*
unnecessary, as sync_obj_enq does it already? */
+
item->stm_flags &= ~GCFLAG_WB_EXECUTED;
synchronize_object_enqueue(item, true);
}));
diff --git a/c8/stm/gcpage.c b/c8/stm/gcpage.c
--- a/c8/stm/gcpage.c
+++ b/c8/stm/gcpage.c
@@ -499,6 +499,13 @@
assert(!(realobj->stm_flags & GCFLAG_WRITE_BARRIER));
realobj->stm_flags |= GCFLAG_WRITE_BARRIER;
+
+ OPT_ASSERT(!(realobj->stm_flags & GCFLAG_CARDS_SET));
+ if (realobj->stm_flags & GCFLAG_CARDS_SET) {
+ /* we called a normal WB on this object, so all cards
+ need to be marked OLD */
+ _reset_object_cards(pseg, item, CARD_MARKED_OLD,
true); /* mark all */
+ }
}));
list_clear(lst);
} else {
@@ -507,6 +514,21 @@
modified_old_objs. */
}
+ lst = pseg->old_objects_with_cards_set;
+ LIST_FOREACH_R(lst, object_t* /*item*/,
+ ({
+ struct object_s *realobj = (struct object_s *)
+ REAL_ADDRESS(pseg->pub.segment_base, item);
+ OPT_ASSERT(realobj->stm_flags & GCFLAG_CARDS_SET);
+ OPT_ASSERT(realobj->stm_flags & GCFLAG_WRITE_BARRIER);
+
+ /* mark marked cards as old otherwise */
+ uint8_t mark_value = CARD_MARKED_OLD;
+ _reset_object_cards(pseg, item, mark_value, false);
+ }));
+ list_clear(lst);
+
+
/* remove from new_objects all objects that die */
lst = pseg->new_objects;
uintptr_t n = list_count(lst);
diff --git a/c8/stm/nursery.c b/c8/stm/nursery.c
--- a/c8/stm/nursery.c
+++ b/c8/stm/nursery.c
@@ -207,9 +207,6 @@
assert(IMPLY(mark_value == CARD_CLEAR, !mark_all)); /* not necessary */
assert(IMPLY(mark_all, mark_value == CARD_MARKED_OLD)); /* set *all* to
OLD */
- assert(IMPLY(realobj->stm_flags & GCFLAG_WB_EXECUTED,
- mark_value == CARD_CLEAR)); /* overflows are always CLEARed */
-
struct stm_read_marker_s *cards = get_read_marker(pseg->pub.segment_base,
(uintptr_t)obj);
uintptr_t card_index = 1;
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit