15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Copyright (c) 2006, Google Inc.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * All rights reserved.
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * modification, are permitted provided that the following conditions are
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * met:
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     * Redistributions of source code must retain the above copyright
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * notice, this list of conditions and the following disclaimer.
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     * Redistributions in binary form must reproduce the above
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * in the documentation and/or other materials provided with the
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * distribution.
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     * Neither the name of Google Inc. nor the names of its
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * contributors may be used to endorse or promote products derived from
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * this software without specific prior written permission.
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ---
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Author: Sanjay Ghemawat
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// For atomic operations on statistics counters, see atomic_stats_counter.h.
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// For atomic operations on sequence numbers, see atomic_sequence_num.h.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// For atomic operations on reference counts, see atomic_refcount.h.
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Some fast atomic operations -- typically with machine-dependent
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// implementations.  This file may need editing as Google code is
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ported to different architectures.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The routines exported by this module are subtle.  If you use them, even if
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// you get the code right, it will depend on careful reasoning about atomicity
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and memory ordering; it will be less readable, and harder to maintain.  If
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// you plan to use these routines, you should have a good reason, such as solid
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// evidence that performance would otherwise suffer, or there being no
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// alternative.  You should assume only properties explicitly guaranteed by the
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// specifications in this file.  You are almost certainly _not_ writing code
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// just for the x86; if you assume x86 semantics, x86 hardware bugs and
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// implementations on other archtectures will cause your code to break.  If you
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// do not know what you are doing, avoid these routines, and use a Mutex.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// It is incorrect to make direct assignments to/from an atomic variable.
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// You should use one of the Load or Store routines.  The NoBarrier
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// versions are provided when no barriers are needed:
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   NoBarrier_Store()
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   NoBarrier_Load()
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Although there are currently no compiler enforcement, you are encouraged
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to use these.  Moreover, if you choose to use base::subtle::Atomic64 type,
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// you MUST use one of the Load or Store routines to get correct behavior
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// on 32-bit platforms.
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The intent is eventually to put all of these routines in namespace
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// base::subtle
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef THREAD_ATOMICOPS_H_
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define THREAD_ATOMICOPS_H_
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <config.h>
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_STDINT_H
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdint.h>
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ------------------------------------------------------------------------
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Include the platform specific implementations of the types
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and operations listed below.  Implementations are to provide Atomic32
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and Atomic64 operations. If there is a mismatch between intptr_t and
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the Atomic32 or Atomic64 types for a platform, the platform-specific header
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// should define the macro, AtomicWordCastType in a clause similar to the
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// following:
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// #if ...pointers are 64 bits...
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// # define AtomicWordCastType base::subtle::Atomic64
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// #else
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// # define AtomicWordCastType Atomic32
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// #endif
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(csilvers): figure out ARCH_PIII/ARCH_K8 (perhaps via ./configure?)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ------------------------------------------------------------------------
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/arm_instruction_set_select.h"
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(csilvers): match piii, not just __i386.  Also, match k8
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(__MACH__) && defined(__APPLE__)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/atomicops-internals-macosx.h"
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(__GNUC__) && defined(ARMV6)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/atomicops-internals-arm-v6plus.h"
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(ARMV3)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/atomicops-internals-arm-generic.h"
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(_WIN32)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/atomicops-internals-windows.h"
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(__GNUC__) && (defined(__i386) || defined(__x86_64__))
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/atomicops-internals-x86.h"
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(__linux__) && defined(__PPC__)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/atomicops-internals-linuxppc.h"
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Assume x86 for now.  If you need to support a new architecture and
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// don't know how to implement atomic ops, you can probably get away
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// with using pthreads, since atomicops is only used by spinlock.h/cc
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//#error You need to implement atomic operations for this architecture
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/atomicops-internals-x86.h"
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Signed type that can hold a pointer and supports the atomic ops below, as
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// well as atomic loads and stores.  Instances must be naturally-aligned.
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef intptr_t AtomicWord;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef AtomicWordCastType
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ------------------------------------------------------------------------
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This section is needed only when explicit type casting is required to
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// cast AtomicWord to one of the basic atomic types (Atomic64 or Atomic32).
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// It also serves to document the AtomicWord interface.
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ------------------------------------------------------------------------
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace subtle {
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Atomically execute:
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//      result = *ptr;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//      if (*ptr == old_value)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//        *ptr = new_value;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//      return result;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// I.e., replace "*ptr" with "new_value" if "*ptr" used to be "old_value".
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Always return the old value of "*ptr"
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This routine implies no memory barriers.
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline AtomicWord NoBarrier_CompareAndSwap(volatile AtomicWord* ptr,
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           AtomicWord old_value,
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           AtomicWord new_value) {
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NoBarrier_CompareAndSwap(
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reinterpret_cast<volatile AtomicWordCastType*>(ptr),
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      old_value, new_value);
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Atomically store new_value into *ptr, returning the previous value held in
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// *ptr.  This routine implies no memory barriers.
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline AtomicWord NoBarrier_AtomicExchange(volatile AtomicWord* ptr,
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           AtomicWord new_value) {
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NoBarrier_AtomicExchange(
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reinterpret_cast<volatile AtomicWordCastType*>(ptr), new_value);
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Atomically increment *ptr by "increment".  Returns the new value of
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// *ptr with the increment applied.  This routine implies no memory
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// barriers.
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline AtomicWord NoBarrier_AtomicIncrement(volatile AtomicWord* ptr,
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            AtomicWord increment) {
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NoBarrier_AtomicIncrement(
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reinterpret_cast<volatile AtomicWordCastType*>(ptr), increment);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline AtomicWord Barrier_AtomicIncrement(volatile AtomicWord* ptr,
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          AtomicWord increment) {
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return Barrier_AtomicIncrement(
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reinterpret_cast<volatile AtomicWordCastType*>(ptr), increment);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ------------------------------------------------------------------------
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// These following lower-level operations are typically useful only to people
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// implementing higher-level synchronization operations like spinlocks,
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// mutexes, and condition-variables.  They combine CompareAndSwap(), a load, or
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a store with appropriate memory-ordering instructions.  "Acquire" operations
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ensure that no later memory access can be reordered ahead of the operation.
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "Release" operations ensure that no previous memory access can be reordered
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// after the operation.  "Barrier" operations have both "Acquire" and "Release"
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// semantics.   A MemoryBarrier() has "Barrier" semantics, but does no memory
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// access.
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ------------------------------------------------------------------------
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline AtomicWord Acquire_CompareAndSwap(volatile AtomicWord* ptr,
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         AtomicWord old_value,
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         AtomicWord new_value) {
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base::subtle::Acquire_CompareAndSwap(
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reinterpret_cast<volatile AtomicWordCastType*>(ptr),
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      old_value, new_value);
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline AtomicWord Release_CompareAndSwap(volatile AtomicWord* ptr,
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         AtomicWord old_value,
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         AtomicWord new_value) {
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base::subtle::Release_CompareAndSwap(
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reinterpret_cast<volatile AtomicWordCastType*>(ptr),
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      old_value, new_value);
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void NoBarrier_Store(volatile AtomicWord *ptr, AtomicWord value) {
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NoBarrier_Store(
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reinterpret_cast<volatile AtomicWordCastType*>(ptr), value);
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void Acquire_Store(volatile AtomicWord* ptr, AtomicWord value) {
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base::subtle::Acquire_Store(
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reinterpret_cast<volatile AtomicWordCastType*>(ptr), value);
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void Release_Store(volatile AtomicWord* ptr, AtomicWord value) {
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base::subtle::Release_Store(
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reinterpret_cast<volatile AtomicWordCastType*>(ptr), value);
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline AtomicWord NoBarrier_Load(volatile const AtomicWord *ptr) {
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NoBarrier_Load(
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reinterpret_cast<volatile const AtomicWordCastType*>(ptr));
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline AtomicWord Acquire_Load(volatile const AtomicWord* ptr) {
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base::subtle::Acquire_Load(
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reinterpret_cast<volatile const AtomicWordCastType*>(ptr));
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline AtomicWord Release_Load(volatile const AtomicWord* ptr) {
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base::subtle::Release_Load(
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reinterpret_cast<volatile const AtomicWordCastType*>(ptr));
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace base::subtle
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace base
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // AtomicWordCastType
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ------------------------------------------------------------------------
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Commented out type definitions and method declarations for documentation
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// of the interface provided by this module.
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ------------------------------------------------------------------------
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Signed 32-bit type that supports the atomic ops below, as well as atomic
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// loads and stores.  Instances must be naturally aligned.  This type differs
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// from AtomicWord in 64-bit binaries where AtomicWord is 64-bits.
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int32_t Atomic32;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Corresponding operations on Atomic32
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace subtle {
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Signed 64-bit type that supports the atomic ops below, as well as atomic
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// loads and stores.  Instances must be naturally aligned.  This type differs
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// from AtomicWord in 32-bit binaries where AtomicWord is 32-bits.
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int64_t Atomic64;
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr,
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  Atomic32 old_value,
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  Atomic32 new_value);
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr, Atomic32 new_value);
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32* ptr, Atomic32 increment);
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Atomic32 Barrier_AtomicIncrement(volatile Atomic32* ptr,
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 Atomic32 increment);
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr,
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                Atomic32 old_value,
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                Atomic32 new_value);
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr,
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                Atomic32 old_value,
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                Atomic32 new_value);
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NoBarrier_Store(volatile Atomic32* ptr, Atomic32 value);
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Acquire_Store(volatile Atomic32* ptr, Atomic32 value);
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Release_Store(volatile Atomic32* ptr, Atomic32 value);
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Atomic32 NoBarrier_Load(volatile const Atomic32* ptr);
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Atomic32 Acquire_Load(volatile const Atomic32* ptr);
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Atomic32 Release_Load(volatile const Atomic32* ptr);
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Corresponding operations on Atomic64
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Atomic64 NoBarrier_CompareAndSwap(volatile Atomic64* ptr,
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  Atomic64 old_value,
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  Atomic64 new_value);
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Atomic64 NoBarrier_AtomicExchange(volatile Atomic64* ptr, Atomic64 new_value);
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Atomic64 NoBarrier_AtomicIncrement(volatile Atomic64* ptr, Atomic64 increment);
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Atomic64 Barrier_AtomicIncrement(volatile Atomic64* ptr, Atomic64 increment);
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Atomic64 Acquire_CompareAndSwap(volatile Atomic64* ptr,
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                Atomic64 old_value,
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                Atomic64 new_value);
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Atomic64 Release_CompareAndSwap(volatile Atomic64* ptr,
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                Atomic64 old_value,
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                Atomic64 new_value);
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NoBarrier_Store(volatile Atomic64* ptr, Atomic64 value);
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Acquire_Store(volatile Atomic64* ptr, Atomic64 value);
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Release_Store(volatile Atomic64* ptr, Atomic64 value);
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Atomic64 NoBarrier_Load(volatile const Atomic64* ptr);
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Atomic64 Acquire_Load(volatile const Atomic64* ptr);
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Atomic64 Release_Load(volatile const Atomic64* ptr);
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace base::subtle
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace base
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MemoryBarrier();
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // 0
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ------------------------------------------------------------------------
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The following are to be deprecated when all uses have been changed to
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// use the base::subtle namespace.
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ------------------------------------------------------------------------
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef AtomicWordCastType
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// AtomicWord versions to be deprecated
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline AtomicWord Acquire_CompareAndSwap(volatile AtomicWord* ptr,
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         AtomicWord old_value,
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         AtomicWord new_value) {
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base::subtle::Acquire_CompareAndSwap(ptr, old_value, new_value);
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline AtomicWord Release_CompareAndSwap(volatile AtomicWord* ptr,
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         AtomicWord old_value,
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         AtomicWord new_value) {
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base::subtle::Release_CompareAndSwap(ptr, old_value, new_value);
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void Acquire_Store(volatile AtomicWord* ptr, AtomicWord value) {
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base::subtle::Acquire_Store(ptr, value);
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void Release_Store(volatile AtomicWord* ptr, AtomicWord value) {
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base::subtle::Release_Store(ptr, value);
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline AtomicWord Acquire_Load(volatile const AtomicWord* ptr) {
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base::subtle::Acquire_Load(ptr);
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline AtomicWord Release_Load(volatile const AtomicWord* ptr) {
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base::subtle::Release_Load(ptr);
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // AtomicWordCastType
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 32-bit Acquire/Release operations to be deprecated.
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr,
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       Atomic32 old_value,
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       Atomic32 new_value) {
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base::subtle::Acquire_CompareAndSwap(ptr, old_value, new_value);
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr,
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       Atomic32 old_value,
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       Atomic32 new_value) {
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base::subtle::Release_CompareAndSwap(ptr, old_value, new_value);
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void Acquire_Store(volatile Atomic32* ptr, Atomic32 value) {
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::subtle::Acquire_Store(ptr, value);
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void Release_Store(volatile Atomic32* ptr, Atomic32 value) {
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base::subtle::Release_Store(ptr, value);
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic32 Acquire_Load(volatile const Atomic32* ptr) {
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base::subtle::Acquire_Load(ptr);
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic32 Release_Load(volatile const Atomic32* ptr) {
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base::subtle::Release_Load(ptr);
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef BASE_HAS_ATOMIC64
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 64-bit Acquire/Release operations to be deprecated.
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline base::subtle::Atomic64 Acquire_CompareAndSwap(
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    volatile base::subtle::Atomic64* ptr,
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::subtle::Atomic64 old_value, base::subtle::Atomic64 new_value) {
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base::subtle::Acquire_CompareAndSwap(ptr, old_value, new_value);
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline base::subtle::Atomic64 Release_CompareAndSwap(
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    volatile base::subtle::Atomic64* ptr,
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::subtle::Atomic64 old_value, base::subtle::Atomic64 new_value) {
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base::subtle::Release_CompareAndSwap(ptr, old_value, new_value);
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void Acquire_Store(
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    volatile base::subtle::Atomic64* ptr, base::subtle::Atomic64 value) {
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::subtle::Acquire_Store(ptr, value);
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void Release_Store(
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    volatile base::subtle::Atomic64* ptr, base::subtle::Atomic64 value) {
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base::subtle::Release_Store(ptr, value);
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline base::subtle::Atomic64 Acquire_Load(
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    volatile const base::subtle::Atomic64* ptr) {
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base::subtle::Acquire_Load(ptr);
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline base::subtle::Atomic64 Release_Load(
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    volatile const base::subtle::Atomic64* ptr) {
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base::subtle::Release_Load(ptr);
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // BASE_HAS_ATOMIC64
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // THREAD_ATOMICOPS_H_
392