[pypy-commit] stmgc c8-card-marking: basic card-marking seems to work
Raemi
noreply at buildbot.pypy.org
Thu Feb 26 21:46:50 CET 2015
Author: Remi Meier <remi.meier at gmail.com>
Branch: c8-card-marking
Changeset: r1673:a7b28578ad96
Date: 2015-02-26 21:47 +0100
http://bitbucket.org/pypy/stmgc/changeset/a7b28578ad96/
Log: basic card-marking seems to work
diff --git a/c8/stm/core.c b/c8/stm/core.c
--- a/c8/stm/core.c
+++ b/c8/stm/core.c
@@ -581,7 +581,7 @@
}
-static bool obj_should_use_cards(char *seg_base, object_t *obj)
+bool obj_should_use_cards(char *seg_base, object_t *obj)
{
if (is_small_uniform(obj))
return false;
diff --git a/c8/stm/core.h b/c8/stm/core.h
--- a/c8/stm/core.h
+++ b/c8/stm/core.h
@@ -237,6 +237,7 @@
return (addr - stm_object_pages) / (NB_PAGES * 4096UL);
}
+bool obj_should_use_cards(char *seg_base, object_t *obj);
static bool _is_tl_registered(stm_thread_local_t *tl);
static bool _seems_to_be_running_transaction(void);
diff --git a/c8/stm/gcpage.c b/c8/stm/gcpage.c
--- a/c8/stm/gcpage.c
+++ b/c8/stm/gcpage.c
@@ -501,11 +501,6 @@
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 {
@@ -519,11 +514,11 @@
({
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;
+ /* mark marked cards as old if it survives */
+ uint8_t mark_value = mark_visited_test(item) ?
+ CARD_MARKED_OLD : CARD_CLEAR;
_reset_object_cards(pseg, item, mark_value, false);
}));
list_clear(lst);
@@ -535,6 +530,8 @@
while (n-- > 0) {
object_t *obj = (object_t *)list_item(lst, n);
if (!mark_visited_test(obj)) {
+ if (obj_should_use_cards(pseg->pub.segment_base, obj))
+ _reset_object_cards(pseg, obj, CARD_CLEAR, false);
list_set_item(lst, n, list_pop_item(lst));
}
}
diff --git a/c8/test/test_card_marking.py b/c8/test/test_card_marking.py
--- a/c8/test/test_card_marking.py
+++ b/c8/test/test_card_marking.py
@@ -244,3 +244,47 @@
assert get_card_value(o, 1000) == CARD_MARKED
assert o in old_objects_with_cards_set()
self.commit_transaction()
+
+ def test_clear_cards2(self):
+ self.start_transaction()
+ o = stm_allocate(1000+20*CARD_SIZE)
+ assert get_card_value(o, 1000) == CARD_CLEAR
+ stm_set_char(o, 'a', 1000, True)
+ assert get_card_value(o, 1000) == CARD_CLEAR
+ assert o not in old_objects_with_cards_set()
+
+ self.push_root(o)
+ stm_minor_collect()
+ o = self.pop_root()
+
+ assert get_card_value(o, 1000) == CARD_CLEAR
+ stm_set_char(o, 'b', 1000, True)
+ assert get_card_value(o, 1000) == CARD_MARKED
+ assert o in old_objects_with_cards_set()
+ self.commit_transaction()
+
+ self.start_transaction()
+ assert get_card_value(o, 1000) == CARD_CLEAR
+ stm_set_char(o, 'b', 1000, True)
+ assert get_card_value(o, 1000) == CARD_MARKED
+ assert o in old_objects_with_cards_set()
+ self.commit_transaction()
+
+ def test_clear_cards3(self):
+ self.start_transaction()
+ o = stm_allocate(1000+20*CARD_SIZE)
+
+ self.push_root(o)
+ stm_minor_collect()
+ o = self.pop_root()
+
+ assert get_card_value(o, 1000) == CARD_CLEAR
+ stm_set_char(o, 'b', 1000, True)
+ assert get_card_value(o, 1000) == CARD_MARKED
+ assert o in old_objects_with_cards_set()
+
+ stm_major_collect()
+ assert get_card_value(o, 1000) == CARD_CLEAR
+ assert o not in old_objects_with_cards_set()
+
+ self.commit_transaction()
More information about the pypy-commit
mailing list