[pypy-commit] stmgc c8-card-marking: even more fixes
Raemi
noreply at buildbot.pypy.org
Fri Feb 27 22:44:09 CET 2015
Author: Remi Meier <remi.meier at gmail.com>
Branch: c8-card-marking
Changeset: r1683:b551018deaf1
Date: 2015-02-27 22:15 +0100
http://bitbucket.org/pypy/stmgc/changeset/b551018deaf1/
Log: even more fixes
diff --git a/c8/stm/core.c b/c8/stm/core.c
--- a/c8/stm/core.c
+++ b/c8/stm/core.c
@@ -701,10 +701,12 @@
}
card_index = get_index_to_card_index(index);
+
size_t card_offset = offset_itemsize[0]
+ get_card_index_to_index(card_index) * offset_itemsize[1];
size_t after_card_offset = offset_itemsize[0]
+ get_card_index_to_index(card_index + 1) * offset_itemsize[1];
+
if (after_card_offset > obj_size)
after_card_offset = obj_size;
@@ -733,10 +735,11 @@
/* "CARD_MARKED_OLD" or CARD_MARKED */
OPT_ASSERT(card_value == STM_SEGMENT->transaction_read_version
|| card_value == CARD_MARKED);
- /* we don't need CARD_MARKED anymore after executing this function,
- but we may still need to avoid creating bk copies in the future: */
- cards[card_index].rm = STM_SEGMENT->transaction_read_version;
}
+ /* in any case, remember that we already made a bk slice for this
+ card, so set to "MARKED_OLD": */
+ cards[card_index].rm = STM_SEGMENT->transaction_read_version;
+
if (start_card_index != -1 /* something to copy */
&& (card_value == CARD_MARKED /* found marked card */
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
@@ -229,44 +229,44 @@
o = stm_allocate_old(1000+20*CARD_SIZE)
self.start_transaction()
- assert get_card_value(o, 1000) == CARD_CLEAR
+ assert get_card_value(o, 1000-HDR) == CARD_CLEAR
stm_set_char(o, 'a', 1000, True)
- assert get_card_value(o, 1000) == CARD_MARKED
+ assert get_card_value(o, 1000-HDR) == CARD_MARKED
assert o in old_objects_with_cards_set()
stm_minor_collect()
- assert get_card_value(o, 1000) == CARD_MARKED_OLD()
+ assert get_card_value(o, 1000-HDR) == CARD_MARKED_OLD()
self.commit_transaction()
self.start_transaction()
- assert get_card_value(o, 1000) not in (CARD_CLEAR, CARD_MARKED_OLD())
+ assert get_card_value(o, 1000-HDR) not in (CARD_CLEAR, CARD_MARKED_OLD())
stm_set_char(o, 'b', 1000, True)
- assert get_card_value(o, 1000) == CARD_MARKED
+ assert get_card_value(o, 1000-HDR) == 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
+ assert get_card_value(o, 1000-HDR) == CARD_CLEAR
stm_set_char(o, 'a', 1000, True)
- assert get_card_value(o, 1000) == CARD_CLEAR
+ assert get_card_value(o, 1000-HDR) == 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
+ assert get_card_value(o, 1000-HDR) == CARD_CLEAR
stm_set_char(o, 'b', 1000, True)
- assert get_card_value(o, 1000) == CARD_MARKED
+ assert get_card_value(o, 1000-HDR) == CARD_MARKED
assert o in old_objects_with_cards_set()
self.commit_transaction()
self.start_transaction()
- assert get_card_value(o, 1000) not in (CARD_CLEAR, CARD_MARKED_OLD())
+ assert get_card_value(o, 1000-HDR) not in (CARD_CLEAR, CARD_MARKED_OLD())
stm_set_char(o, 'b', 1000, True)
- assert get_card_value(o, 1000) == CARD_MARKED
+ assert get_card_value(o, 1000-HDR) == CARD_MARKED
assert o in old_objects_with_cards_set()
self.commit_transaction()
@@ -278,13 +278,13 @@
stm_minor_collect()
o = self.pop_root()
- assert get_card_value(o, 1000) == CARD_CLEAR
+ assert get_card_value(o, 1000-HDR) == CARD_CLEAR
stm_set_char(o, 'b', 1000, True)
- assert get_card_value(o, 1000) == CARD_MARKED
+ assert get_card_value(o, 1000-HDR) == CARD_MARKED
assert o in old_objects_with_cards_set()
stm_major_collect()
- assert get_card_value(o, 1000) == CARD_CLEAR
+ assert get_card_value(o, 1000-HDR) == CARD_CLEAR
assert o not in old_objects_with_cards_set()
self.commit_transaction()
@@ -293,8 +293,8 @@
self.start_transaction()
o = stm_allocate(1000+20*CARD_SIZE)
p = stm_allocate(1000+20*CARD_SIZE)
- assert get_card_value(o, 1000) == CARD_CLEAR
- assert get_card_value(p, 1000) == CARD_CLEAR
+ assert get_card_value(o, 1000-HDR) == CARD_CLEAR
+ assert get_card_value(p, 1000-HDR) == CARD_CLEAR
self.push_root(o)
self.push_root(p)
@@ -302,20 +302,20 @@
p = self.pop_root()
o = self.pop_root()
- assert get_card_value(o, 1000) == CARD_CLEAR
- assert get_card_value(p, 1000) == CARD_CLEAR
+ assert get_card_value(o, 1000-HDR) == CARD_CLEAR
+ assert get_card_value(p, 1000-HDR) == CARD_CLEAR
stm_set_char(o, 'b', 1000, True)
stm_set_char(p, 'b', 1000, True)
- assert get_card_value(o, 1000) == CARD_MARKED
- assert get_card_value(p, 1000) == CARD_MARKED
+ assert get_card_value(o, 1000-HDR) == CARD_MARKED
+ assert get_card_value(p, 1000-HDR) == CARD_MARKED
self.push_root(o)
stm_major_collect()
o = self.pop_root()
# p dies and gets cards CLEARed
- assert get_card_value(o, 1000) == CARD_MARKED_OLD()
- assert get_card_value(p, 1000) == CARD_CLEAR
+ assert get_card_value(o, 1000-HDR) == CARD_MARKED_OLD()
+ assert get_card_value(p, 1000-HDR) == CARD_CLEAR
self.push_root(o)
self.commit_transaction()
@@ -323,10 +323,10 @@
self.start_transaction()
o = self.pop_root()
- assert get_card_value(o, 1000) != CARD_CLEAR
- assert get_card_value(o, 1000) < CARD_MARKED_OLD()
+ assert get_card_value(o, 1000-HDR) != CARD_CLEAR
+ assert get_card_value(o, 1000-HDR) < CARD_MARKED_OLD()
stm_set_char(o, 'b', 1000, True)
- assert get_card_value(o, 1000) == CARD_MARKED
+ assert get_card_value(o, 1000-HDR) == CARD_MARKED
self.commit_transaction()
@@ -341,3 +341,24 @@
self.start_transaction()
assert stm_get_char(o, HDR) == '\0'
+
+
+ def test_card_marked_old2(self):
+ o = stm_allocate_old(1000+20*CARD_SIZE)
+
+ self.start_transaction()
+ stm_set_char(o, 'v', HDR, False)
+ self.commit_transaction()
+
+ self.start_transaction()
+ assert get_card_value(o, HDR-HDR) == CARD_CLEAR
+ stm_set_char(o, 'x', 1000, True)
+
+ stm_set_char(o, 'u', HDR, False)
+
+ stm_minor_collect()
+ stm_set_char(o, 'y', HDR, True)
+ self.abort_transaction()
+
+ self.start_transaction()
+ assert stm_get_char(o, HDR) == 'v'
More information about the pypy-commit
mailing list