diff options
Diffstat (limited to 'libitm/stmlock.h')
-rw-r--r-- | libitm/stmlock.h | 17 |
1 files changed, 8 insertions, 9 deletions
diff --git a/libitm/stmlock.h b/libitm/stmlock.h index f115a417da2..a338258e9f1 100644 --- a/libitm/stmlock.h +++ b/libitm/stmlock.h @@ -92,24 +92,23 @@ gtm_get_stmlock (const gtm_cacheline *addr) } /* The current global version number. */ -extern gtm_version gtm_clock; +extern atomic<gtm_version> gtm_clock; static inline gtm_version gtm_get_clock (void) { - gtm_version r; - - __sync_synchronize (); - r = gtm_clock; - atomic_read_barrier (); - - return r; + atomic_thread_fence(memory_order_release); + return gtm_clock.load(memory_order_acquire); } static inline gtm_version gtm_inc_clock (void) { - gtm_version r = __sync_add_and_fetch (>m_clock, 1); + /* ??? Here we have a choice, the pre-inc operator mapping to + __atomic_add_fetch with memory_order_seq_cst, or fetch_add + with memory_order_acq_rel plus another separate increment. + We really ought to recognize and optimize fetch_op(x) op x... */ + gtm_version r = ++gtm_clock; /* ??? Ought to handle wraparound for 32-bit. */ if (sizeof(r) < 8 && r > GTM_VERSION_MAX) |