[pypy-commit] stmgc c8-card-marking: fix
Raemi
noreply at buildbot.pypy.org
Fri Feb 27 22:44:06 CET 2015
Author: Remi Meier <remi.meier at gmail.com>
Branch: c8-card-marking
Changeset: r1680:3a1d24bc19e8
Date: 2015-02-27 17:59 +0100
http://bitbucket.org/pypy/stmgc/changeset/3a1d24bc19e8/
Log: fix
diff --git a/c8/stm/core.c b/c8/stm/core.c
--- a/c8/stm/core.c
+++ b/c8/stm/core.c
@@ -600,12 +600,12 @@
dprintf(("make_bk_slices_for_range(%p, %lu, %lu)\n",
obj, start - (stm_char*)obj, end - start));
char *realobj = REAL_ADDRESS(STM_SEGMENT->segment_base, obj);
- size_t obj_size = stmcb_size_rounded_up((struct object_s*)realobj);
uintptr_t first_page = ((uintptr_t)start) / 4096UL;
uintptr_t end_page = ((uintptr_t)end) / 4096UL;
uintptr_t page;
uintptr_t slice_sz;
+ uintptr_t slice_off = start - (stm_char*)obj;
uintptr_t in_page_offset = (uintptr_t)start % 4096UL;
uintptr_t remaining_obj_sz = end - start;
for (page = first_page; page <= end_page; page++) {
@@ -617,7 +617,6 @@
slice_sz = 4096UL - in_page_offset;
}
- size_t slice_off = obj_size - remaining_obj_sz;
remaining_obj_sz -= slice_sz;
in_page_offset = (in_page_offset + slice_sz) % 4096UL; /* mostly 0 */
@@ -633,7 +632,10 @@
(uintptr_t)obj, /* obj */
(uintptr_t)bk_slice, /* bk_addr */
NEW_SLICE(slice_off, slice_sz));
+ dprintf(("> append slice %p, off=%lu, sz=%lu\n", bk_slice, slice_off, slice_sz));
release_modification_lock(STM_SEGMENT->segment_num);
+
+ slice_off += slice_sz;
}
}
@@ -775,6 +777,7 @@
card_index++;
}
+ obj->stm_flags &= ~GCFLAG_CARDS_SET;
_cards_cleared_in_object(get_priv_segment(STM_SEGMENT->segment_num), obj);
}
@@ -783,7 +786,7 @@
{
assert(obj->stm_flags & GCFLAG_WRITE_BARRIER);
assert(!(obj->stm_flags & GCFLAG_WB_EXECUTED));
- dprintf(("write_slowpath-fast(%p)\n", obj));
+ dprintf(("write_slowpath_overflow_obj(%p)\n", obj));
if (!mark_card) {
/* The basic case, with no card marking. We append the object
@@ -833,10 +836,12 @@
DEBUG_EXPECT_SEGFAULT(false);
if (mark_card) {
- make_bk_slices(obj,
- true, /* first_call */
- -2, /* index: backup only fixed part */
- false); /* do_missing_cards */
+ if (!(obj->stm_flags & GCFLAG_WB_EXECUTED)) {
+ make_bk_slices(obj,
+ true, /* first_call */
+ -2, /* index: backup only fixed part */
+ false); /* do_missing_cards */
+ }
/* don't remove WRITE_BARRIER, but add CARDS_SET */
obj->stm_flags |= (GCFLAG_CARDS_SET | GCFLAG_WB_EXECUTED);
@@ -936,8 +941,9 @@
struct stm_read_marker_s *cards = get_read_marker(STM_SEGMENT->segment_base,
(uintptr_t)obj);
uintptr_t card_index = get_index_to_card_index(index);
- if (!(cards[card_index].rm == CARD_MARKED
- || cards[card_index].rm == STM_SEGMENT->transaction_read_version)) {
+ if (!IS_OVERFLOW_OBJ(STM_PSEGMENT, obj)
+ && !(cards[card_index].rm == CARD_MARKED
+ || cards[card_index].rm == STM_SEGMENT->transaction_read_version)) {
/* need to do the backup slice of the card */
make_bk_slices(obj,
false, /* first_call */
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
@@ -239,7 +239,7 @@
self.commit_transaction()
self.start_transaction()
- assert get_card_value(o, 1000) == CARD_CLEAR
+ assert get_card_value(o, 1000) not in (CARD_CLEAR, CARD_MARKED_OLD())
stm_set_char(o, 'b', 1000, True)
assert get_card_value(o, 1000) == CARD_MARKED
assert o in old_objects_with_cards_set()
@@ -264,7 +264,7 @@
self.commit_transaction()
self.start_transaction()
- assert get_card_value(o, 1000) == CARD_CLEAR
+ assert get_card_value(o, 1000) not in (CARD_CLEAR, CARD_MARKED_OLD())
stm_set_char(o, 'b', 1000, True)
assert get_card_value(o, 1000) == CARD_MARKED
assert o in old_objects_with_cards_set()
@@ -310,8 +310,9 @@
assert get_card_value(p, 1000) == CARD_MARKED
self.push_root(o)
- stm_minor_collect()
+ 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
More information about the pypy-commit
mailing list