Author: Remi Meier <remi.me...@inf.ethz.ch> Branch: Changeset: r1636:49aadef69fd0 Date: 2015-02-18 16:05 +0100 http://bitbucket.org/pypy/stmgc/changeset/49aadef69fd0/
Log: phew, ensure that nobody applies our old backup copies after we just committed diff --git a/c8/stm/core.c b/c8/stm/core.c --- a/c8/stm/core.c +++ b/c8/stm/core.c @@ -79,9 +79,9 @@ assert((get_page_status_in(STM_SEGMENT->segment_num, current_page_num) != PAGE_NO_ACCESS)); - dprintf(("import slice seg=%d obj=%p off=%lu sz=%d pg=%lu\n", - from_segnum, obj, SLICE_OFFSET(undo->slice), - SLICE_SIZE(undo->slice), current_page_num)); + /* dprintf(("import slice seg=%d obj=%p off=%lu sz=%d pg=%lu\n", */ + /* from_segnum, obj, SLICE_OFFSET(undo->slice), */ + /* SLICE_SIZE(undo->slice), current_page_num)); */ char *src, *dst; if (src_segment_base != NULL) src = REAL_ADDRESS(src_segment_base, oslice); @@ -232,6 +232,7 @@ } int segnum = get_segment_of_linear_address(addr); + OPT_ASSERT(segnum != 0); if (segnum != STM_SEGMENT->segment_num) { fprintf(stderr, "Segmentation fault: accessing %p (seg %d) from" " seg %d\n", addr, segnum, STM_SEGMENT->segment_num); @@ -263,11 +264,7 @@ struct stm_commit_log_entry_s *cl = &commit_log_root; fprintf(stderr, "commit log:\n"); - while ((cl = cl->next)) { - if (cl == INEV_RUNNING) { - fprintf(stderr, " INEVITABLE\n"); - return; - } + while (cl) { fprintf(stderr, " entry at %p: seg %d, rev %lu\n", cl, cl->segment_num, cl->rev_num); struct stm_undo_s *undo = cl->written; struct stm_undo_s *end = undo + cl->written_count; @@ -279,6 +276,12 @@ /* fprintf(stderr, " 0x%016lx", *(long *)(undo->backup + i)); */ fprintf(stderr, "\n"); } + + cl = cl->next; + if (cl == INEV_RUNNING) { + fprintf(stderr, " INEVITABLE\n"); + return; + } } } @@ -477,6 +480,12 @@ reset_wb_executed_flags(); check_all_write_barrier_flags(STM_SEGMENT->segment_base, STM_PSEGMENT->modified_old_objects); + + /* need to remove the entries in modified_old_objects "at the same + time" as the attach to commit log. Otherwise, another thread may + see the new CL entry, import it, look for backup copies in this + segment and find the old backup copies! */ + acquire_modification_lock(STM_SEGMENT->segment_num); } /* try to attach to commit log: */ @@ -493,6 +502,7 @@ } if (is_commit) { + release_modification_lock(STM_SEGMENT->segment_num); /* XXX: unfortunately, if we failed to attach our CL entry, we have to re-add the WB_EXECUTED flags before we try to validate again because of said condition (s.a) */ @@ -511,6 +521,16 @@ in major_do_validation_and_minor_collections, and don't free 'new' */ _stm_collectable_safe_point(); } + + if (is_commit) { + /* compare with _validate_and_add_to_commit_log */ + STM_PSEGMENT->transaction_state = TS_NONE; + STM_PSEGMENT->safe_point = SP_NO_TRANSACTION; + + list_clear(STM_PSEGMENT->modified_old_objects); + STM_PSEGMENT->last_commit_log_entry = new; + release_modification_lock(STM_SEGMENT->segment_num); + } } static void _validate_and_turn_inevitable(void) @@ -533,20 +553,19 @@ check_all_write_barrier_flags(STM_SEGMENT->segment_base, STM_PSEGMENT->modified_old_objects); + /* compare with _validate_and_attach: */ + STM_PSEGMENT->transaction_state = TS_NONE; + STM_PSEGMENT->safe_point = SP_NO_TRANSACTION; + list_clear(STM_PSEGMENT->modified_old_objects); + STM_PSEGMENT->last_commit_log_entry = new; + + /* do it: */ bool yes = __sync_bool_compare_and_swap(&old->next, INEV_RUNNING, new); OPT_ASSERT(yes); } else { _validate_and_attach(new); } - - STM_PSEGMENT->transaction_state = TS_NONE; - STM_PSEGMENT->safe_point = SP_NO_TRANSACTION; - - acquire_modification_lock(STM_SEGMENT->segment_num); - list_clear(STM_PSEGMENT->modified_old_objects); - STM_PSEGMENT->last_commit_log_entry = new; - release_modification_lock(STM_SEGMENT->segment_num); } /* ############# STM ############# */ @@ -1140,7 +1159,7 @@ if (get_page_status_in(i, page) != PAGE_NO_ACCESS) { /* shared or private, but never segfault */ char *dst = REAL_ADDRESS(get_segment_base(i), frag); - //dprintf(("-> flush %p to seg %lu, sz=%lu\n", frag, i, frag_size)); + dprintf(("-> flush %p to seg %lu, sz=%lu\n", frag, i, frag_size)); memcpy(dst, src, frag_size); } } diff --git a/c8/stm/gcpage.c b/c8/stm/gcpage.c --- a/c8/stm/gcpage.c +++ b/c8/stm/gcpage.c @@ -482,6 +482,7 @@ This is the case for transactions where MINOR_NOTHING_TO_DO() == true but they still did write-barriers on objects + (the objs are still in modified_old_objects list) */ lst = pseg->objects_pointing_to_nursery; if (!list_is_empty(lst)) { @@ -516,6 +517,7 @@ #pragma pop_macro("STM_PSEGMENT") } + static inline bool largemalloc_keep_object_at(char *data) { /* this is called by _stm_largemalloc_sweep() */ diff --git a/c8/stm/largemalloc.c b/c8/stm/largemalloc.c --- a/c8/stm/largemalloc.c +++ b/c8/stm/largemalloc.c @@ -616,6 +616,7 @@ /* use the callback to know if 'chunk' contains an object that survives or dies */ if (!_largemalloc_sweep_keep(chunk)) { + dprintf(("dies: %p\n", (char*)((char*)&chunk->d - stm_object_pages))); _large_free(chunk); /* dies */ } chunk = mnext; _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit