summaryrefslogtreecommitdiffstats
path: root/libitm/stmlock.h
diff options
context:
space:
mode:
Diffstat (limited to 'libitm/stmlock.h')
-rw-r--r--libitm/stmlock.h17
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 (&gtm_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)
OpenPOWER on IntegriCloud