diff options
author | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-12-13 19:11:25 +0000 |
---|---|---|
committer | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-12-13 19:11:25 +0000 |
commit | e27d80f7754f29f038c29ddcb2decd894d3e4aa4 (patch) | |
tree | 7506d65c4a5b0a1a5cd4450e48e4943360f9ab19 /libitm/beginend.cc | |
parent | ef43e66cabccf0abdfb6589967043993a98a7205 (diff) | |
download | gcc-e27d80f7754f29f038c29ddcb2decd894d3e4aa4.tar.gz |
libitm: Conversion to c++11 atomics.
* local_atomic: New file.
* libitm_i.h: Include it.
(gtm_thread::shared_state): Use atomic template.
* beginend.cc (GTM::gtm_clock): Use atomic template.
(global_tid): Use atomic template if 64-bit atomics available.
(gtm_thread::gtm_thread): Update shared_state access.
(gtm_thread::trycommit): Likewise.
(choose_code_path): Update global_tid access.
* method-gl.cc (gl_mg::orec): Use atomic template. Update all users.
* stmlock.h (GTM::gtm_clock): Use atomic template.
(gtm_get_clock, gtm_inc_clock): Update accesses.
* config/linux/rwlock.cc (gtm_rwlock::read_lock): Remove
redundant __sync_synchronize after atomic shared_state access.
* config/posix/rwlock.cc (gtm_rwlock::read_lock): Likewise.
(gtm_rwlock::write_lock_generic): Likewise.
(gtm_rwlock::read_unlock): Likewise.
* config/alpha/target.h (atomic_read_barrier): Remove.
(atomic_write_barrier): Remove.
* config/x86/target.h (atomic_read_barrier): Remove.
(atomic_write_barrier): Remove.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@182294 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libitm/beginend.cc')
-rw-r--r-- | libitm/beginend.cc | 23 |
1 files changed, 12 insertions, 11 deletions
diff --git a/libitm/beginend.cc b/libitm/beginend.cc index d8ef651236d..bcc8516be05 100644 --- a/libitm/beginend.cc +++ b/libitm/beginend.cc @@ -37,12 +37,18 @@ gtm_thread *GTM::gtm_thread::list_of_threads = 0; unsigned GTM::gtm_thread::number_of_threads = 0; gtm_stmlock GTM::gtm_stmlock_array[LOCK_ARRAY_SIZE]; -gtm_version GTM::gtm_clock; +atomic<gtm_version> GTM::gtm_clock; /* ??? Move elsewhere when we figure out library initialization. */ uint64_t GTM::gtm_spin_count_var = 1000; +#ifdef HAVE_64BIT_SYNC_BUILTINS +static atomic<_ITM_transactionId_t> global_tid; +#else static _ITM_transactionId_t global_tid; +static pthread_mutex_t global_tid_lock = PTHREAD_MUTEX_INITIALIZER; +#endif + // Provides a on-thread-exit callback used to release per-thread data. static pthread_key_t thr_release_key; @@ -114,7 +120,7 @@ GTM::gtm_thread::gtm_thread () // This object's memory has been set to zero by operator new, so no need // to initialize any of the other primitive-type members that do not have // constructors. - shared_state = ~(typeof shared_state)0; + shared_state.store(-1, memory_order_relaxed); // Register this transaction with the list of all threads' transactions. serial_lock.write_lock (); @@ -132,13 +138,8 @@ GTM::gtm_thread::gtm_thread () GTM_fatal("Setting thread release TLS key failed."); } - - -#ifndef HAVE_64BIT_SYNC_BUILTINS -static pthread_mutex_t global_tid_lock = PTHREAD_MUTEX_INITIALIZER; -#endif - -static inline uint32_t choose_code_path(uint32_t prop, abi_dispatch *disp) +static inline uint32_t +choose_code_path(uint32_t prop, abi_dispatch *disp) { if ((prop & pr_uninstrumentedCode) && disp->can_run_uninstrumented_code()) return a_runUninstrumentedCode; @@ -258,7 +259,7 @@ GTM::gtm_thread::begin_transaction (uint32_t prop, const gtm_jmpbuf *jb) else { #ifdef HAVE_64BIT_SYNC_BUILTINS - tx->id = __sync_add_and_fetch (&global_tid, tid_block_size); + tx->id = global_tid.fetch_add(tid_block_size, memory_order_relaxed); tx->local_tid = tx->id + 1; #else pthread_mutex_lock (&global_tid_lock); @@ -480,7 +481,7 @@ GTM::gtm_thread::trycommit () it = it->next_thread) { if (it == this) continue; - while (it->shared_state < priv_time) + while (it->shared_state.load(memory_order_relaxed) < priv_time) cpu_relax(); } } |