15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file is an internal atomic implementation for compiler-based 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ThreadSanitizer. Use base/atomicops.h instead. 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef BASE_ATOMICOPS_INTERNALS_TSAN_H_ 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define BASE_ATOMICOPS_INTERNALS_TSAN_H_ 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/base_export.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This struct is not part of the public API of this module; clients may not 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// use it. (However, it's exported via BASE_EXPORT because clients implicitly 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// do use it at link time by inlining these functions.) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Features of this x86. Values may not be correct before main() is run, 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// but are set conservatively. 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct AtomicOps_x86CPUFeatureStruct { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool has_amd_lock_mb_bug; // Processor has AMD memory-barrier bug; do lfence 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // after acquire compare-and-swap. 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool has_sse2; // Processor has SSE2. 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BASE_EXPORT extern struct AtomicOps_x86CPUFeatureStruct 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AtomicOps_Internalx86CPUFeatures; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ATOMICOPS_COMPILER_BARRIER() __asm__ __volatile__("" : : : "memory") 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace subtle { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef TSAN_INTERFACE_ATOMIC_H 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define TSAN_INTERFACE_ATOMIC_H 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef __cplusplus 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern "C" { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef char __tsan_atomic8; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef short __tsan_atomic16; // NOLINT 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int __tsan_atomic32; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef long __tsan_atomic64; // NOLINT 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(__SIZEOF_INT128__) \ 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) || (__clang_major__ * 100 + __clang_minor__ >= 302) 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef __int128 __tsan_atomic128; 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define __TSAN_HAS_INT128 1 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef char __tsan_atomic128; 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define __TSAN_HAS_INT128 0 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef enum { 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __tsan_memory_order_relaxed, 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __tsan_memory_order_consume, 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __tsan_memory_order_acquire, 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __tsan_memory_order_release, 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __tsan_memory_order_acq_rel, 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __tsan_memory_order_seq_cst, 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} __tsan_memory_order; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)__tsan_atomic8 __tsan_atomic8_load(const volatile __tsan_atomic8 *a, 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __tsan_memory_order mo); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)__tsan_atomic16 __tsan_atomic16_load(const volatile __tsan_atomic16 *a, 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __tsan_memory_order mo); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)__tsan_atomic32 __tsan_atomic32_load(const volatile __tsan_atomic32 *a, 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __tsan_memory_order mo); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)__tsan_atomic64 __tsan_atomic64_load(const volatile __tsan_atomic64 *a, 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __tsan_memory_order mo); 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)__tsan_atomic128 __tsan_atomic128_load(const volatile __tsan_atomic128 *a, 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __tsan_memory_order mo); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void __tsan_atomic8_store(volatile __tsan_atomic8 *a, __tsan_atomic8 v, 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __tsan_memory_order mo); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void __tsan_atomic16_store(volatile __tsan_atomic16 *a, __tsan_atomic16 v, 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __tsan_memory_order mo); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void __tsan_atomic32_store(volatile __tsan_atomic32 *a, __tsan_atomic32 v, 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __tsan_memory_order mo); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void __tsan_atomic64_store(volatile __tsan_atomic64 *a, __tsan_atomic64 v, 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __tsan_memory_order mo); 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void __tsan_atomic128_store(volatile __tsan_atomic128 *a, __tsan_atomic128 v, 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __tsan_memory_order mo); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)__tsan_atomic8 __tsan_atomic8_exchange(volatile __tsan_atomic8 *a, 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __tsan_atomic8 v, __tsan_memory_order mo); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)__tsan_atomic16 __tsan_atomic16_exchange(volatile __tsan_atomic16 *a, 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __tsan_atomic16 v, __tsan_memory_order mo); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)__tsan_atomic32 __tsan_atomic32_exchange(volatile __tsan_atomic32 *a, 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __tsan_atomic32 v, __tsan_memory_order mo); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)__tsan_atomic64 __tsan_atomic64_exchange(volatile __tsan_atomic64 *a, 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __tsan_atomic64 v, __tsan_memory_order mo); 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)__tsan_atomic128 __tsan_atomic128_exchange(volatile __tsan_atomic128 *a, 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __tsan_atomic128 v, __tsan_memory_order mo); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)__tsan_atomic8 __tsan_atomic8_fetch_add(volatile __tsan_atomic8 *a, 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __tsan_atomic8 v, __tsan_memory_order mo); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)__tsan_atomic16 __tsan_atomic16_fetch_add(volatile __tsan_atomic16 *a, 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __tsan_atomic16 v, __tsan_memory_order mo); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)__tsan_atomic32 __tsan_atomic32_fetch_add(volatile __tsan_atomic32 *a, 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __tsan_atomic32 v, __tsan_memory_order mo); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)__tsan_atomic64 __tsan_atomic64_fetch_add(volatile __tsan_atomic64 *a, 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __tsan_atomic64 v, __tsan_memory_order mo); 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)__tsan_atomic128 __tsan_atomic128_fetch_add(volatile __tsan_atomic128 *a, 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __tsan_atomic128 v, __tsan_memory_order mo); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)__tsan_atomic8 __tsan_atomic8_fetch_and(volatile __tsan_atomic8 *a, 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __tsan_atomic8 v, __tsan_memory_order mo); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)__tsan_atomic16 __tsan_atomic16_fetch_and(volatile __tsan_atomic16 *a, 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __tsan_atomic16 v, __tsan_memory_order mo); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)__tsan_atomic32 __tsan_atomic32_fetch_and(volatile __tsan_atomic32 *a, 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __tsan_atomic32 v, __tsan_memory_order mo); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)__tsan_atomic64 __tsan_atomic64_fetch_and(volatile __tsan_atomic64 *a, 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __tsan_atomic64 v, __tsan_memory_order mo); 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)__tsan_atomic128 __tsan_atomic128_fetch_and(volatile __tsan_atomic128 *a, 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __tsan_atomic128 v, __tsan_memory_order mo); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)__tsan_atomic8 __tsan_atomic8_fetch_or(volatile __tsan_atomic8 *a, 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __tsan_atomic8 v, __tsan_memory_order mo); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)__tsan_atomic16 __tsan_atomic16_fetch_or(volatile __tsan_atomic16 *a, 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __tsan_atomic16 v, __tsan_memory_order mo); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)__tsan_atomic32 __tsan_atomic32_fetch_or(volatile __tsan_atomic32 *a, 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __tsan_atomic32 v, __tsan_memory_order mo); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)__tsan_atomic64 __tsan_atomic64_fetch_or(volatile __tsan_atomic64 *a, 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __tsan_atomic64 v, __tsan_memory_order mo); 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)__tsan_atomic128 __tsan_atomic128_fetch_or(volatile __tsan_atomic128 *a, 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __tsan_atomic128 v, __tsan_memory_order mo); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)__tsan_atomic8 __tsan_atomic8_fetch_xor(volatile __tsan_atomic8 *a, 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __tsan_atomic8 v, __tsan_memory_order mo); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)__tsan_atomic16 __tsan_atomic16_fetch_xor(volatile __tsan_atomic16 *a, 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __tsan_atomic16 v, __tsan_memory_order mo); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)__tsan_atomic32 __tsan_atomic32_fetch_xor(volatile __tsan_atomic32 *a, 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __tsan_atomic32 v, __tsan_memory_order mo); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)__tsan_atomic64 __tsan_atomic64_fetch_xor(volatile __tsan_atomic64 *a, 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __tsan_atomic64 v, __tsan_memory_order mo); 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)__tsan_atomic128 __tsan_atomic128_fetch_xor(volatile __tsan_atomic128 *a, 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __tsan_atomic128 v, __tsan_memory_order mo); 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)__tsan_atomic8 __tsan_atomic8_fetch_nand(volatile __tsan_atomic8 *a, 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __tsan_atomic8 v, __tsan_memory_order mo); 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)__tsan_atomic16 __tsan_atomic16_fetch_nand(volatile __tsan_atomic16 *a, 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __tsan_atomic16 v, __tsan_memory_order mo); 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)__tsan_atomic32 __tsan_atomic32_fetch_nand(volatile __tsan_atomic32 *a, 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __tsan_atomic32 v, __tsan_memory_order mo); 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)__tsan_atomic64 __tsan_atomic64_fetch_nand(volatile __tsan_atomic64 *a, 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __tsan_atomic64 v, __tsan_memory_order mo); 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)__tsan_atomic128 __tsan_atomic128_fetch_nand(volatile __tsan_atomic128 *a, 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __tsan_atomic128 v, __tsan_memory_order mo); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int __tsan_atomic8_compare_exchange_weak(volatile __tsan_atomic8 *a, 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __tsan_atomic8 *c, __tsan_atomic8 v, __tsan_memory_order mo, 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __tsan_memory_order fail_mo); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int __tsan_atomic16_compare_exchange_weak(volatile __tsan_atomic16 *a, 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __tsan_atomic16 *c, __tsan_atomic16 v, __tsan_memory_order mo, 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __tsan_memory_order fail_mo); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int __tsan_atomic32_compare_exchange_weak(volatile __tsan_atomic32 *a, 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __tsan_atomic32 *c, __tsan_atomic32 v, __tsan_memory_order mo, 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __tsan_memory_order fail_mo); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int __tsan_atomic64_compare_exchange_weak(volatile __tsan_atomic64 *a, 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __tsan_atomic64 *c, __tsan_atomic64 v, __tsan_memory_order mo, 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __tsan_memory_order fail_mo); 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int __tsan_atomic128_compare_exchange_weak(volatile __tsan_atomic128 *a, 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __tsan_atomic128 *c, __tsan_atomic128 v, __tsan_memory_order mo, 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __tsan_memory_order fail_mo); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int __tsan_atomic8_compare_exchange_strong(volatile __tsan_atomic8 *a, 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __tsan_atomic8 *c, __tsan_atomic8 v, __tsan_memory_order mo, 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __tsan_memory_order fail_mo); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int __tsan_atomic16_compare_exchange_strong(volatile __tsan_atomic16 *a, 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __tsan_atomic16 *c, __tsan_atomic16 v, __tsan_memory_order mo, 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __tsan_memory_order fail_mo); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int __tsan_atomic32_compare_exchange_strong(volatile __tsan_atomic32 *a, 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __tsan_atomic32 *c, __tsan_atomic32 v, __tsan_memory_order mo, 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __tsan_memory_order fail_mo); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int __tsan_atomic64_compare_exchange_strong(volatile __tsan_atomic64 *a, 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __tsan_atomic64 *c, __tsan_atomic64 v, __tsan_memory_order mo, 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __tsan_memory_order fail_mo); 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int __tsan_atomic128_compare_exchange_strong(volatile __tsan_atomic128 *a, 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __tsan_atomic128 *c, __tsan_atomic128 v, __tsan_memory_order mo, 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __tsan_memory_order fail_mo); 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)__tsan_atomic8 __tsan_atomic8_compare_exchange_val( 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) volatile __tsan_atomic8 *a, __tsan_atomic8 c, __tsan_atomic8 v, 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __tsan_memory_order mo, __tsan_memory_order fail_mo); 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)__tsan_atomic16 __tsan_atomic16_compare_exchange_val( 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) volatile __tsan_atomic16 *a, __tsan_atomic16 c, __tsan_atomic16 v, 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __tsan_memory_order mo, __tsan_memory_order fail_mo); 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)__tsan_atomic32 __tsan_atomic32_compare_exchange_val( 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) volatile __tsan_atomic32 *a, __tsan_atomic32 c, __tsan_atomic32 v, 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __tsan_memory_order mo, __tsan_memory_order fail_mo); 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)__tsan_atomic64 __tsan_atomic64_compare_exchange_val( 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) volatile __tsan_atomic64 *a, __tsan_atomic64 c, __tsan_atomic64 v, 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __tsan_memory_order mo, __tsan_memory_order fail_mo); 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)__tsan_atomic128 __tsan_atomic128_compare_exchange_val( 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) volatile __tsan_atomic128 *a, __tsan_atomic128 c, __tsan_atomic128 v, 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __tsan_memory_order mo, __tsan_memory_order fail_mo); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void __tsan_atomic_thread_fence(__tsan_memory_order mo); 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void __tsan_atomic_signal_fence(__tsan_memory_order mo); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef __cplusplus 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // extern "C" 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // #ifndef TSAN_INTERFACE_ATOMIC_H 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32 *ptr, 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Atomic32 old_value, 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Atomic32 new_value) { 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Atomic32 cmp = old_value; 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __tsan_atomic32_compare_exchange_strong(ptr, &cmp, new_value, 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __tsan_memory_order_relaxed, __tsan_memory_order_relaxed); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return cmp; 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic32 NoBarrier_AtomicExchange(volatile Atomic32 *ptr, 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Atomic32 new_value) { 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return __tsan_atomic32_exchange(ptr, new_value, 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __tsan_memory_order_relaxed); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic32 Acquire_AtomicExchange(volatile Atomic32 *ptr, 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Atomic32 new_value) { 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return __tsan_atomic32_exchange(ptr, new_value, 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __tsan_memory_order_acquire); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic32 Release_AtomicExchange(volatile Atomic32 *ptr, 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Atomic32 new_value) { 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return __tsan_atomic32_exchange(ptr, new_value, 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __tsan_memory_order_release); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32 *ptr, 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Atomic32 increment) { 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return increment + __tsan_atomic32_fetch_add(ptr, increment, 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __tsan_memory_order_relaxed); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic32 Barrier_AtomicIncrement(volatile Atomic32 *ptr, 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Atomic32 increment) { 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return increment + __tsan_atomic32_fetch_add(ptr, increment, 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __tsan_memory_order_acq_rel); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic32 Acquire_CompareAndSwap(volatile Atomic32 *ptr, 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Atomic32 old_value, 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Atomic32 new_value) { 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Atomic32 cmp = old_value; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __tsan_atomic32_compare_exchange_strong(ptr, &cmp, new_value, 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __tsan_memory_order_acquire, __tsan_memory_order_acquire); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return cmp; 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic32 Release_CompareAndSwap(volatile Atomic32 *ptr, 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Atomic32 old_value, 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Atomic32 new_value) { 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Atomic32 cmp = old_value; 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __tsan_atomic32_compare_exchange_strong(ptr, &cmp, new_value, 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __tsan_memory_order_release, __tsan_memory_order_relaxed); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return cmp; 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void NoBarrier_Store(volatile Atomic32 *ptr, Atomic32 value) { 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __tsan_atomic32_store(ptr, value, __tsan_memory_order_relaxed); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void Acquire_Store(volatile Atomic32 *ptr, Atomic32 value) { 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __tsan_atomic32_store(ptr, value, __tsan_memory_order_relaxed); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __tsan_atomic_thread_fence(__tsan_memory_order_seq_cst); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void Release_Store(volatile Atomic32 *ptr, Atomic32 value) { 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __tsan_atomic32_store(ptr, value, __tsan_memory_order_release); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic32 NoBarrier_Load(volatile const Atomic32 *ptr) { 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return __tsan_atomic32_load(ptr, __tsan_memory_order_relaxed); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic32 Acquire_Load(volatile const Atomic32 *ptr) { 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return __tsan_atomic32_load(ptr, __tsan_memory_order_acquire); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic32 Release_Load(volatile const Atomic32 *ptr) { 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __tsan_atomic_thread_fence(__tsan_memory_order_seq_cst); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return __tsan_atomic32_load(ptr, __tsan_memory_order_relaxed); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic64 NoBarrier_CompareAndSwap(volatile Atomic64 *ptr, 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Atomic64 old_value, 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Atomic64 new_value) { 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Atomic64 cmp = old_value; 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __tsan_atomic64_compare_exchange_strong(ptr, &cmp, new_value, 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __tsan_memory_order_relaxed, __tsan_memory_order_relaxed); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return cmp; 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic64 NoBarrier_AtomicExchange(volatile Atomic64 *ptr, 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Atomic64 new_value) { 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return __tsan_atomic64_exchange(ptr, new_value, __tsan_memory_order_relaxed); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic64 Acquire_AtomicExchange(volatile Atomic64 *ptr, 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Atomic64 new_value) { 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return __tsan_atomic64_exchange(ptr, new_value, __tsan_memory_order_acquire); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic64 Release_AtomicExchange(volatile Atomic64 *ptr, 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Atomic64 new_value) { 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return __tsan_atomic64_exchange(ptr, new_value, __tsan_memory_order_release); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic64 NoBarrier_AtomicIncrement(volatile Atomic64 *ptr, 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Atomic64 increment) { 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return increment + __tsan_atomic64_fetch_add(ptr, increment, 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __tsan_memory_order_relaxed); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic64 Barrier_AtomicIncrement(volatile Atomic64 *ptr, 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Atomic64 increment) { 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return increment + __tsan_atomic64_fetch_add(ptr, increment, 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __tsan_memory_order_acq_rel); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void NoBarrier_Store(volatile Atomic64 *ptr, Atomic64 value) { 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __tsan_atomic64_store(ptr, value, __tsan_memory_order_relaxed); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void Acquire_Store(volatile Atomic64 *ptr, Atomic64 value) { 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __tsan_atomic64_store(ptr, value, __tsan_memory_order_relaxed); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __tsan_atomic_thread_fence(__tsan_memory_order_seq_cst); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void Release_Store(volatile Atomic64 *ptr, Atomic64 value) { 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __tsan_atomic64_store(ptr, value, __tsan_memory_order_release); 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic64 NoBarrier_Load(volatile const Atomic64 *ptr) { 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return __tsan_atomic64_load(ptr, __tsan_memory_order_relaxed); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic64 Acquire_Load(volatile const Atomic64 *ptr) { 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return __tsan_atomic64_load(ptr, __tsan_memory_order_acquire); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic64 Release_Load(volatile const Atomic64 *ptr) { 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __tsan_atomic_thread_fence(__tsan_memory_order_seq_cst); 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return __tsan_atomic64_load(ptr, __tsan_memory_order_relaxed); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic64 Acquire_CompareAndSwap(volatile Atomic64 *ptr, 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Atomic64 old_value, 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Atomic64 new_value) { 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Atomic64 cmp = old_value; 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __tsan_atomic64_compare_exchange_strong(ptr, &cmp, new_value, 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __tsan_memory_order_acquire, __tsan_memory_order_acquire); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return cmp; 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic64 Release_CompareAndSwap(volatile Atomic64 *ptr, 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Atomic64 old_value, 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Atomic64 new_value) { 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Atomic64 cmp = old_value; 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __tsan_atomic64_compare_exchange_strong(ptr, &cmp, new_value, 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) __tsan_memory_order_release, __tsan_memory_order_relaxed); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return cmp; 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void MemoryBarrier() { 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) __tsan_atomic_thread_fence(__tsan_memory_order_seq_cst); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace base::subtle 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace base 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef ATOMICOPS_COMPILER_BARRIER 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // BASE_ATOMICOPS_INTERNALS_TSAN_H_ 379