Author: Remi Meier <[email protected]>
Branch: nonmovable-int-ref
Changeset: r485:b19dfb209a10
Date: 2013-08-19 11:36 +0200
http://bitbucket.org/pypy/stmgc/changeset/b19dfb209a10/
Log: merge
diff --git a/c4/nursery.c b/c4/nursery.c
--- a/c4/nursery.c
+++ b/c4/nursery.c
@@ -177,10 +177,21 @@
fresh_old_copy = id_obj;
fresh_old_copy->h_original = 0;
obj->h_tid &= ~GCFLAG_HAS_ID;
+
+ /* priv_from_prot's backup->h_originals already point
+ to id_obj */
}
else {
/* make a copy of it outside */
fresh_old_copy = create_old_object_copy(obj);
+
+ if (obj->h_tid & GCFLAG_PRIVATE_FROM_PROTECTED
+ && !(obj->h_original)) {
+ /* the object's backup copy still has
+ a h_original that is NULL*/
+ gcptr B = (gcptr)obj->h_revision;
+ B->h_original = (revision_t)fresh_old_copy;
+ }
}
obj->h_tid |= GCFLAG_MOVED;
diff --git a/c4/stmgc.h b/c4/stmgc.h
--- a/c4/stmgc.h
+++ b/c4/stmgc.h
@@ -215,17 +215,18 @@
: (obj))
#define stm_repeat_read_barrier(obj) \
- (UNLIKELY((obj)->h_tid & (GCFLAG_PUBLIC_TO_PRIVATE | GCFLAG_MOVED)) ? \
+ (UNLIKELY(((obj)->h_tid & (GCFLAG_PUBLIC_TO_PRIVATE | \
+ GCFLAG_MOVED)) != 0) ? \
stm_RepeatReadBarrier(obj) \
: (obj))
#define stm_immut_read_barrier(obj) \
- (UNLIKELY((obj)->h_tid & GCFLAG_STUB) ? \
+ (UNLIKELY(((obj)->h_tid & GCFLAG_STUB) != 0) ? \
stm_ImmutReadBarrier(obj) \
: (obj))
#define stm_repeat_write_barrier(obj) \
- (UNLIKELY((obj)->h_tid & GCFLAG_WRITE_BARRIER) ? \
+ (UNLIKELY(((obj)->h_tid & GCFLAG_WRITE_BARRIER) != 0) ? \
stm_RepeatWriteBarrier(obj) \
: (obj))
diff --git a/c4/test/test_extra.py b/c4/test/test_extra.py
--- a/c4/test/test_extra.py
+++ b/c4/test/test_extra.py
@@ -157,7 +157,7 @@
0, 0,
0, 0]
-def test_bug():
+def test_clear_original_on_id_copy():
p1 = nalloc(HDR)
pid = lib.stm_id(p1)
lib.stm_push_root(p1)
@@ -167,7 +167,7 @@
assert p1o == ffi.cast("gcptr", pid)
assert follow_original(p1o) == ffi.NULL
-def test_bug2():
+def test_clear_original_on_priv_from_prot_abort():
p = oalloc(HDR+WORD)
def cb(c):
@@ -179,6 +179,25 @@
p = lib.stm_pop_root()
assert follow_original(p) == ffi.NULL
+def test_set_backups_original_on_move_to_id_copy():
+ p1 = nalloc(HDR+WORD)
+ lib.stm_commit_transaction()
+ lib.stm_begin_inevitable_transaction()
+ assert classify(p1) == 'protected'
+
+ pw = lib.stm_write_barrier(p1)
+ assert classify(pw) == 'private_from_protected'
+ assert pw == p1
+
+ lib.stm_push_root(pw)
+ # make pw old
+ minor_collect()
+ p1o = lib.stm_pop_root()
+
+ # Backup has updated h_original:
+ assert classify(p1o) == 'private_from_protected'
+ B = follow_revision(p1o)
+ assert follow_original(B) == p1o
def test_allocate_public_integer_address():
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit