blob: 24382fd9c010e44ec96fdc63dec6a138de33ada6 [file] [log] [blame]
glider@chromium.org86d0cc32012-10-03 01:28:23 +09001// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// This file is an internal atomic implementation for compiler-based
6// ThreadSanitizer. Use base/atomicops.h instead.
7
8#ifndef BASE_ATOMICOPS_INTERNALS_TSAN_H_
9#define BASE_ATOMICOPS_INTERNALS_TSAN_H_
10
glider@chromium.org5e30cf52014-02-18 17:02:37 +090011#include <sanitizer/tsan_interface_atomic.h>
12
glider@chromium.org86d0cc32012-10-03 01:28:23 +090013namespace base {
14namespace subtle {
15
ctruta@blackberry.com83bafe82014-02-08 13:59:55 +090016inline Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr,
17 Atomic32 old_value,
18 Atomic32 new_value) {
glider@chromium.org86d0cc32012-10-03 01:28:23 +090019 Atomic32 cmp = old_value;
20 __tsan_atomic32_compare_exchange_strong(ptr, &cmp, new_value,
glider@chromium.orgdb27d262012-12-10 20:12:10 +090021 __tsan_memory_order_relaxed, __tsan_memory_order_relaxed);
glider@chromium.org86d0cc32012-10-03 01:28:23 +090022 return cmp;
23}
24
ctruta@blackberry.com83bafe82014-02-08 13:59:55 +090025inline Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr,
26 Atomic32 new_value) {
glider@chromium.org86d0cc32012-10-03 01:28:23 +090027 return __tsan_atomic32_exchange(ptr, new_value,
28 __tsan_memory_order_relaxed);
29}
30
ctruta@blackberry.com83bafe82014-02-08 13:59:55 +090031inline Atomic32 Acquire_AtomicExchange(volatile Atomic32* ptr,
32 Atomic32 new_value) {
glider@chromium.org86d0cc32012-10-03 01:28:23 +090033 return __tsan_atomic32_exchange(ptr, new_value,
34 __tsan_memory_order_acquire);
35}
36
ctruta@blackberry.com83bafe82014-02-08 13:59:55 +090037inline Atomic32 Release_AtomicExchange(volatile Atomic32* ptr,
38 Atomic32 new_value) {
glider@chromium.org86d0cc32012-10-03 01:28:23 +090039 return __tsan_atomic32_exchange(ptr, new_value,
40 __tsan_memory_order_release);
41}
42
ctruta@blackberry.com83bafe82014-02-08 13:59:55 +090043inline Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32* ptr,
44 Atomic32 increment) {
glider@chromium.org86d0cc32012-10-03 01:28:23 +090045 return increment + __tsan_atomic32_fetch_add(ptr, increment,
46 __tsan_memory_order_relaxed);
47}
48
ctruta@blackberry.com83bafe82014-02-08 13:59:55 +090049inline Atomic32 Barrier_AtomicIncrement(volatile Atomic32* ptr,
50 Atomic32 increment) {
glider@chromium.org86d0cc32012-10-03 01:28:23 +090051 return increment + __tsan_atomic32_fetch_add(ptr, increment,
52 __tsan_memory_order_acq_rel);
53}
54
ctruta@blackberry.com83bafe82014-02-08 13:59:55 +090055inline Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr,
56 Atomic32 old_value,
57 Atomic32 new_value) {
glider@chromium.org86d0cc32012-10-03 01:28:23 +090058 Atomic32 cmp = old_value;
59 __tsan_atomic32_compare_exchange_strong(ptr, &cmp, new_value,
glider@chromium.orgdb27d262012-12-10 20:12:10 +090060 __tsan_memory_order_acquire, __tsan_memory_order_acquire);
glider@chromium.org86d0cc32012-10-03 01:28:23 +090061 return cmp;
62}
63
ctruta@blackberry.com83bafe82014-02-08 13:59:55 +090064inline Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr,
65 Atomic32 old_value,
66 Atomic32 new_value) {
glider@chromium.org86d0cc32012-10-03 01:28:23 +090067 Atomic32 cmp = old_value;
68 __tsan_atomic32_compare_exchange_strong(ptr, &cmp, new_value,
glider@chromium.orgdb27d262012-12-10 20:12:10 +090069 __tsan_memory_order_release, __tsan_memory_order_relaxed);
glider@chromium.org86d0cc32012-10-03 01:28:23 +090070 return cmp;
71}
72
ctruta@blackberry.com83bafe82014-02-08 13:59:55 +090073inline void NoBarrier_Store(volatile Atomic32* ptr, Atomic32 value) {
glider@chromium.org86d0cc32012-10-03 01:28:23 +090074 __tsan_atomic32_store(ptr, value, __tsan_memory_order_relaxed);
75}
76
ctruta@blackberry.com83bafe82014-02-08 13:59:55 +090077inline void Acquire_Store(volatile Atomic32* ptr, Atomic32 value) {
glider@chromium.org86d0cc32012-10-03 01:28:23 +090078 __tsan_atomic32_store(ptr, value, __tsan_memory_order_relaxed);
79 __tsan_atomic_thread_fence(__tsan_memory_order_seq_cst);
80}
81
ctruta@blackberry.com83bafe82014-02-08 13:59:55 +090082inline void Release_Store(volatile Atomic32* ptr, Atomic32 value) {
glider@chromium.org86d0cc32012-10-03 01:28:23 +090083 __tsan_atomic32_store(ptr, value, __tsan_memory_order_release);
84}
85
ctruta@blackberry.com83bafe82014-02-08 13:59:55 +090086inline Atomic32 NoBarrier_Load(volatile const Atomic32* ptr) {
glider@chromium.org86d0cc32012-10-03 01:28:23 +090087 return __tsan_atomic32_load(ptr, __tsan_memory_order_relaxed);
88}
89
ctruta@blackberry.com83bafe82014-02-08 13:59:55 +090090inline Atomic32 Acquire_Load(volatile const Atomic32* ptr) {
glider@chromium.org86d0cc32012-10-03 01:28:23 +090091 return __tsan_atomic32_load(ptr, __tsan_memory_order_acquire);
92}
93
ctruta@blackberry.com83bafe82014-02-08 13:59:55 +090094inline Atomic32 Release_Load(volatile const Atomic32* ptr) {
glider@chromium.org86d0cc32012-10-03 01:28:23 +090095 __tsan_atomic_thread_fence(__tsan_memory_order_seq_cst);
96 return __tsan_atomic32_load(ptr, __tsan_memory_order_relaxed);
97}
98
ctruta@blackberry.com83bafe82014-02-08 13:59:55 +090099inline Atomic64 NoBarrier_CompareAndSwap(volatile Atomic64* ptr,
100 Atomic64 old_value,
101 Atomic64 new_value) {
glider@chromium.org86d0cc32012-10-03 01:28:23 +0900102 Atomic64 cmp = old_value;
103 __tsan_atomic64_compare_exchange_strong(ptr, &cmp, new_value,
glider@chromium.orgdb27d262012-12-10 20:12:10 +0900104 __tsan_memory_order_relaxed, __tsan_memory_order_relaxed);
glider@chromium.org86d0cc32012-10-03 01:28:23 +0900105 return cmp;
106}
107
ctruta@blackberry.com83bafe82014-02-08 13:59:55 +0900108inline Atomic64 NoBarrier_AtomicExchange(volatile Atomic64* ptr,
109 Atomic64 new_value) {
glider@chromium.org86d0cc32012-10-03 01:28:23 +0900110 return __tsan_atomic64_exchange(ptr, new_value, __tsan_memory_order_relaxed);
111}
112
ctruta@blackberry.com83bafe82014-02-08 13:59:55 +0900113inline Atomic64 Acquire_AtomicExchange(volatile Atomic64* ptr,
114 Atomic64 new_value) {
glider@chromium.org86d0cc32012-10-03 01:28:23 +0900115 return __tsan_atomic64_exchange(ptr, new_value, __tsan_memory_order_acquire);
116}
117
ctruta@blackberry.com83bafe82014-02-08 13:59:55 +0900118inline Atomic64 Release_AtomicExchange(volatile Atomic64* ptr,
119 Atomic64 new_value) {
glider@chromium.org86d0cc32012-10-03 01:28:23 +0900120 return __tsan_atomic64_exchange(ptr, new_value, __tsan_memory_order_release);
121}
122
ctruta@blackberry.com83bafe82014-02-08 13:59:55 +0900123inline Atomic64 NoBarrier_AtomicIncrement(volatile Atomic64* ptr,
124 Atomic64 increment) {
glider@chromium.org86d0cc32012-10-03 01:28:23 +0900125 return increment + __tsan_atomic64_fetch_add(ptr, increment,
126 __tsan_memory_order_relaxed);
127}
128
ctruta@blackberry.com83bafe82014-02-08 13:59:55 +0900129inline Atomic64 Barrier_AtomicIncrement(volatile Atomic64* ptr,
130 Atomic64 increment) {
glider@chromium.org86d0cc32012-10-03 01:28:23 +0900131 return increment + __tsan_atomic64_fetch_add(ptr, increment,
132 __tsan_memory_order_acq_rel);
133}
134
ctruta@blackberry.com83bafe82014-02-08 13:59:55 +0900135inline void NoBarrier_Store(volatile Atomic64* ptr, Atomic64 value) {
glider@chromium.org86d0cc32012-10-03 01:28:23 +0900136 __tsan_atomic64_store(ptr, value, __tsan_memory_order_relaxed);
137}
138
ctruta@blackberry.com83bafe82014-02-08 13:59:55 +0900139inline void Acquire_Store(volatile Atomic64* ptr, Atomic64 value) {
glider@chromium.org86d0cc32012-10-03 01:28:23 +0900140 __tsan_atomic64_store(ptr, value, __tsan_memory_order_relaxed);
141 __tsan_atomic_thread_fence(__tsan_memory_order_seq_cst);
142}
143
ctruta@blackberry.com83bafe82014-02-08 13:59:55 +0900144inline void Release_Store(volatile Atomic64* ptr, Atomic64 value) {
glider@chromium.org86d0cc32012-10-03 01:28:23 +0900145 __tsan_atomic64_store(ptr, value, __tsan_memory_order_release);
146}
147
ctruta@blackberry.com83bafe82014-02-08 13:59:55 +0900148inline Atomic64 NoBarrier_Load(volatile const Atomic64* ptr) {
glider@chromium.org86d0cc32012-10-03 01:28:23 +0900149 return __tsan_atomic64_load(ptr, __tsan_memory_order_relaxed);
150}
151
ctruta@blackberry.com83bafe82014-02-08 13:59:55 +0900152inline Atomic64 Acquire_Load(volatile const Atomic64* ptr) {
glider@chromium.org86d0cc32012-10-03 01:28:23 +0900153 return __tsan_atomic64_load(ptr, __tsan_memory_order_acquire);
154}
155
ctruta@blackberry.com83bafe82014-02-08 13:59:55 +0900156inline Atomic64 Release_Load(volatile const Atomic64* ptr) {
glider@chromium.org86d0cc32012-10-03 01:28:23 +0900157 __tsan_atomic_thread_fence(__tsan_memory_order_seq_cst);
158 return __tsan_atomic64_load(ptr, __tsan_memory_order_relaxed);
159}
160
ctruta@blackberry.com83bafe82014-02-08 13:59:55 +0900161inline Atomic64 Acquire_CompareAndSwap(volatile Atomic64* ptr,
162 Atomic64 old_value,
163 Atomic64 new_value) {
glider@chromium.org86d0cc32012-10-03 01:28:23 +0900164 Atomic64 cmp = old_value;
165 __tsan_atomic64_compare_exchange_strong(ptr, &cmp, new_value,
glider@chromium.orgdb27d262012-12-10 20:12:10 +0900166 __tsan_memory_order_acquire, __tsan_memory_order_acquire);
glider@chromium.org86d0cc32012-10-03 01:28:23 +0900167 return cmp;
168}
169
ctruta@blackberry.com83bafe82014-02-08 13:59:55 +0900170inline Atomic64 Release_CompareAndSwap(volatile Atomic64* ptr,
171 Atomic64 old_value,
172 Atomic64 new_value) {
glider@chromium.org86d0cc32012-10-03 01:28:23 +0900173 Atomic64 cmp = old_value;
174 __tsan_atomic64_compare_exchange_strong(ptr, &cmp, new_value,
glider@chromium.orgdb27d262012-12-10 20:12:10 +0900175 __tsan_memory_order_release, __tsan_memory_order_relaxed);
glider@chromium.org86d0cc32012-10-03 01:28:23 +0900176 return cmp;
177}
178
179inline void MemoryBarrier() {
180 __tsan_atomic_thread_fence(__tsan_memory_order_seq_cst);
181}
182
183} // namespace base::subtle
184} // namespace base
185
glider@chromium.org86d0cc32012-10-03 01:28:23 +0900186#endif // BASE_ATOMICOPS_INTERNALS_TSAN_H_