Author: Remi Meier <remi.me...@inf.ethz.ch> Branch: c8-private-pages Changeset: r1535:50c110de7f3a Date: 2015-01-16 13:53 +0100 http://bitbucket.org/pypy/stmgc/changeset/50c110de7f3a/
Log: progress diff --git a/c8/stm/core.c b/c8/stm/core.c --- a/c8/stm/core.c +++ b/c8/stm/core.c @@ -298,9 +298,6 @@ cl = first_cl; while ((next_cl = cl->next) != NULL) { if (next_cl == INEV_RUNNING) { -#if STM_TESTS - stm_abort_transaction(); -#endif /* only validate entries up to INEV */ break; } @@ -337,6 +334,8 @@ */ reset_modified_from_backup_copies(my_segnum); needs_abort = true; + + dprintf(("_stm_validate() failed for obj %p\n", undo->object)); break; } } @@ -419,6 +418,14 @@ stm_abort_transaction(); } +#if STM_TESTS + if (STM_PSEGMENT->transaction_state != TS_INEVITABLE + && STM_PSEGMENT->last_commit_log_entry->next == INEV_RUNNING) { + /* abort for tests... */ + stm_abort_transaction(); + } +#endif + /* try to attach to commit log: */ old = STM_PSEGMENT->last_commit_log_entry; if (old->next == NULL) { @@ -479,7 +486,6 @@ stm_abort_transaction(); } #endif - } diff --git a/c8/stm/core.h b/c8/stm/core.h --- a/c8/stm/core.h +++ b/c8/stm/core.h @@ -216,7 +216,7 @@ { #ifndef NDEBUG long l; - for (l = 1; l < NB_SEGMENTS; l++) { + for (l = 0; l < NB_SEGMENTS; l++) { if (!get_priv_segment(l)->privatization_lock) return false; } @@ -228,8 +228,9 @@ static inline void acquire_all_privatization_locks() { + /* XXX: don't do for the sharing seg0 */ long l; - for (l = 1; l < NB_SEGMENTS; l++) { + for (l = 0; l < NB_SEGMENTS; l++) { acquire_privatization_lock(l); } } @@ -237,7 +238,7 @@ static inline void release_all_privatization_locks() { long l; - for (l = NB_SEGMENTS-1; l >= 1; l--) { + for (l = NB_SEGMENTS-1; l >= 0; l--) { release_privatization_lock(l); } } @@ -269,7 +270,7 @@ /* acquire locks in global order */ int i; - for (i = 1; i < NB_SEGMENTS; i++) { + for (i = 0; i < NB_SEGMENTS; i++) { if ((seg_set & (1 << i)) == 0) continue; @@ -283,7 +284,7 @@ OPT_ASSERT(seg_set < (1 << NB_SEGMENTS)); int i; - for (i = 1; i < NB_SEGMENTS; i++) { + for (i = 0; i < NB_SEGMENTS; i++) { if ((seg_set & (1 << i)) == 0) continue; diff --git a/c8/stm/gcpage.c b/c8/stm/gcpage.c --- a/c8/stm/gcpage.c +++ b/c8/stm/gcpage.c @@ -359,7 +359,6 @@ */ lst = pseg->objects_pointing_to_nursery; if (!list_is_empty(lst)) { - abort(); // check that there is a test LIST_FOREACH_R(lst, object_t* /*item*/, ({ struct object_s *realobj = (struct object_s *) diff --git a/c8/stm/nursery.c b/c8/stm/nursery.c --- a/c8/stm/nursery.c +++ b/c8/stm/nursery.c @@ -391,7 +391,17 @@ for (i = 0; i < NB_SEGMENTS; i++) { set_gs_register(get_segment_base(i)); + assert(!must_abort()); if (!_stm_validate()) { + assert(i != 0); /* sharing seg0 should never need an abort */ + + if (STM_PSEGMENT->transaction_state == TS_NONE) { + /* we found a segment that has stale read-marker data and thus + is in conflict with committed objs. Since it is not running + currently, it's fine to ignore it. */ + continue; + } + /* tell it to abort when continuing */ STM_PSEGMENT->pub.nursery_end = NSE_SIGABORT; assert(must_abort()); diff --git a/c8/stm/pages.h b/c8/stm/pages.h --- a/c8/stm/pages.h +++ b/c8/stm/pages.h @@ -63,7 +63,7 @@ static inline bool get_page_status_in(long segnum, uintptr_t pagenum) { /* reading page status requires "read"-lock: */ - assert(STM_SEGMENT->segment_num==0 || STM_PSEGMENT->privatization_lock); + assert(STM_PSEGMENT->privatization_lock); OPT_ASSERT(segnum < 8 * sizeof(struct page_shared_s)); volatile struct page_shared_s *ps = (volatile struct page_shared_s *) diff --git a/c8/test/test_gcpage.py b/c8/test/test_gcpage.py --- a/c8/test/test_gcpage.py +++ b/c8/test/test_gcpage.py @@ -289,3 +289,23 @@ stm_major_collect() assert lib._stm_total_allocated() == 64 + LMO # large malloc'd self.commit_transaction() + + def test_bug(self): + lp_ref_4 = stm_allocate_old_refs(50) + # + self.start_transaction() + stm_set_ref(lp_ref_4, 0, ffi.NULL, False) + # + self.switch(1) + self.start_transaction() + self.become_inevitable() + # + py.test.raises(Conflict, self.switch, 0) + # + self.switch(1) + + stm_set_ref(lp_ref_4, 0, ffi.NULL, False) + + self.commit_transaction() + self.start_transaction() + stm_major_collect() _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit