Author: Remi Meier <remi.me...@inf.ethz.ch> Branch: Changeset: r1366:e0c1255cc369 Date: 2014-09-08 14:18 +0200 http://bitbucket.org/pypy/stmgc/changeset/e0c1255cc369/
Log: ensure that the write of an stm_read() happens before the actual reading by making the C compiler believe that the write may alias the read (prevents some optimizations) diff --git a/c8/stm/core.c b/c8/stm/core.c --- a/c8/stm/core.c +++ b/c8/stm/core.c @@ -262,7 +262,7 @@ OPT_ASSERT((uintptr_t)STM_PSEGMENT->last_commit_log_entry->next == -1); to = &(STM_PSEGMENT->last_commit_log_entry->next); - bool yes = __sync_bool_compare_and_swap(to, -1, new); + bool yes = __sync_bool_compare_and_swap(to, (void*)-1, new); OPT_ASSERT(yes); return; } diff --git a/c8/stm/misc.c b/c8/stm/misc.c --- a/c8/stm/misc.c +++ b/c8/stm/misc.c @@ -31,8 +31,7 @@ bool _stm_was_read(object_t *obj) { - uint8_t rm = ((struct stm_read_marker_s *) - (STM_SEGMENT->segment_base + (((uintptr_t)obj) >> 4)))->rm; + uint8_t rm = *((char *)(STM_SEGMENT->segment_base + (((uintptr_t)obj) >> 4))); assert(rm <= STM_SEGMENT->transaction_read_version); return rm == STM_SEGMENT->transaction_read_version; } diff --git a/c8/stmgc.h b/c8/stmgc.h --- a/c8/stmgc.h +++ b/c8/stmgc.h @@ -24,19 +24,8 @@ typedef TLPREFIX struct object_s object_t; typedef TLPREFIX struct stm_segment_info_s stm_segment_info_t; -typedef TLPREFIX struct stm_read_marker_s stm_read_marker_t; typedef TLPREFIX char stm_char; -struct stm_read_marker_s { - /* In every segment, every object has a corresponding read marker. - We assume that objects are at least 16 bytes long, and use - their address divided by 16. The read marker is equal to - 'STM_SEGMENT->transaction_read_version' if and only if the - object was read in the current transaction. The nurseries - also have corresponding read markers, but they are never used. */ - uint8_t rm; -}; - struct stm_segment_info_s { uint8_t transaction_read_version; int segment_num; @@ -126,8 +115,7 @@ __attribute__((always_inline)) static inline void stm_read(object_t *obj) { - ((stm_read_marker_t *)(((uintptr_t)obj) >> 4))->rm = - STM_SEGMENT->transaction_read_version; + *((stm_char *)(((uintptr_t)obj) >> 4)) = STM_SEGMENT->transaction_read_version; } __attribute__((always_inline)) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit