Author: Remi Meier <[email protected]>
Branch:
Changeset: r1233:e69d7d6c2ed9
Date: 2014-05-22 16:33 +0200
http://bitbucket.org/pypy/stmgc/changeset/e69d7d6c2ed9/
Log: fix small bug causing test_random to fail sometimes
diff --git a/c7/stm/nursery.c b/c7/stm/nursery.c
--- a/c7/stm/nursery.c
+++ b/c7/stm/nursery.c
@@ -280,6 +280,9 @@
TREE_LOOP_FORWARD(*pseg->young_outside_nursery, item) {
assert(!_is_in_nursery((object_t *)item->addr));
+ /* mark slot as unread */
+ ((stm_read_marker_t *)(item->addr >> 4))->rm = 0;
+
_stm_large_free(stm_object_pages + item->addr);
} TREE_LOOP_END;
diff --git a/c7/test/support.py b/c7/test/support.py
--- a/c7/test/support.py
+++ b/c7/test/support.py
@@ -324,7 +324,7 @@
assert HDR == 8
GCFLAG_WRITE_BARRIER = lib._STM_GCFLAG_WRITE_BARRIER
NB_SEGMENTS = lib.STM_NB_SEGMENTS
-
+FAST_ALLOC = lib._STM_FAST_ALLOC
class Conflict(Exception):
pass
diff --git a/c7/test/test_nursery.py b/c7/test/test_nursery.py
--- a/c7/test/test_nursery.py
+++ b/c7/test/test_nursery.py
@@ -236,3 +236,14 @@
# the 'p1' reference is invalid now, don't try to read it.
# we check that it's invalid because _stm_total_allocated()
# only records one of the two objects.
+
+ def test_clear_read_marker_for_external_young(self):
+ self.start_transaction()
+ big = stm_allocate(FAST_ALLOC + 1000) # young outside nursery
+ stm_read(big)
+ assert stm_was_read(big)
+ stm_minor_collect() # free young outside
+ assert not stm_was_read(big)
+ # if the read marker is not cleared, we get false conflicts
+ # with later transactions using the same large-malloced slot
+ # as our outside-nursery-obj
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit