Author: Remi Meier <remi.me...@gmail.com> Branch: Changeset: r484:e02ee68b20c4 Date: 2013-08-19 11:28 +0200 http://bitbucket.org/pypy/stmgc/changeset/e02ee68b20c4/
Log: another bug with h_original :( 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/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,4 +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 + + + _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit