Author: Remi Meier <[email protected]>
Branch: c8-card-marking
Changeset: r1684:17b08c18f7b4
Date: 2015-02-27 22:42 +0100
http://bitbucket.org/pypy/stmgc/changeset/17b08c18f7b4/
Log: one more
diff --git a/c8/stm/core.c b/c8/stm/core.c
--- a/c8/stm/core.c
+++ b/c8/stm/core.c
@@ -675,6 +675,12 @@
/* whole obj */
make_bk_slices_for_range(obj, (stm_char*)obj + start_offset,
(stm_char*)obj + obj_size);
+ if (obj_should_use_cards(STM_SEGMENT->segment_base, obj)) {
+ /* mark whole obj as MARKED_OLD so we don't do bk slices
anymore */
+ _reset_object_cards(get_priv_segment(STM_SEGMENT->segment_num),
+ obj, STM_SEGMENT->transaction_read_version,
+ true, false);
+ }
} else {
/* only fixed part */
stmcb_get_card_base_itemsize(realobj, offset_itemsize);
@@ -944,6 +950,7 @@
return;
}
+ assert(obj_should_use_cards(STM_SEGMENT->segment_base, obj));
dprintf_test(("write_slowpath_card %p -> index:%lu\n",
obj, index));
@@ -1266,8 +1273,9 @@
undo->backup,
SLICE_SIZE(undo->slice));
- dprintf(("reset_modified_from_backup_copies(%d): obj=%p off=%lu
bk=%p\n",
- segment_num, obj, SLICE_OFFSET(undo->slice), undo->backup));
+ dprintf(("reset_modified_from_backup_copies(%d): obj=%p off=%lu sz=%d
bk=%p\n",
+ segment_num, obj, SLICE_OFFSET(undo->slice),
+ SLICE_SIZE(undo->slice), undo->backup));
free_bk(undo);
}
diff --git a/c8/stm/gcpage.c b/c8/stm/gcpage.c
--- a/c8/stm/gcpage.c
+++ b/c8/stm/gcpage.c
@@ -488,7 +488,8 @@
REAL_ADDRESS(pseg->pub.segment_base, item);
OPT_ASSERT(realobj->stm_flags & GCFLAG_WRITE_BARRIER);
- /* mark marked cards as old if it survives */
+ /* mark marked cards as old if it survives, otherwise
+ CLEAR, as their spot could get reused */
uint8_t mark_value = mark_visited_test(item) ?
pseg->pub.transaction_read_version : CARD_CLEAR;
_reset_object_cards(pseg, item, mark_value, false,
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
@@ -351,7 +351,7 @@
self.commit_transaction()
self.start_transaction()
- assert get_card_value(o, HDR-HDR) == CARD_CLEAR
+ assert get_card_value(o, HDR-HDR) < CARD_MARKED_OLD()
stm_set_char(o, 'x', 1000, True)
stm_set_char(o, 'u', HDR, False)
@@ -362,3 +362,15 @@
self.start_transaction()
assert stm_get_char(o, HDR) == 'v'
+
+ def test_card_marked_old3(self):
+ o = stm_allocate_old(1000+20*CARD_SIZE)
+
+ self.start_transaction()
+ stm_set_char(o, 'v', HDR, False)
+ stm_minor_collect()
+ stm_set_char(o, 'u', HDR, True)
+ self.abort_transaction()
+
+ self.start_transaction()
+ assert stm_get_char(o, HDR) == '\0'
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit