1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Use of this source code is governed by a BSD-style license that can be 3ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// found in the LICENSE file. 4ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 5ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// This file is an internal atomic implementation, use base/atomicops.h instead. 6ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 7ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#ifndef BASE_ATOMICOPS_INTERNALS_ATOMICWORD_COMPAT_H_ 8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#define BASE_ATOMICOPS_INTERNALS_ATOMICWORD_COMPAT_H_ 9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#pragma once 10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// AtomicWord is a synonym for intptr_t, and Atomic32 is a synonym for int32, 12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// which in turn means int. On some LP32 platforms, intptr_t is an int, but 13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// on others, it's a long. When AtomicWord and Atomic32 are based on different 14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// fundamental types, their pointers are incompatible. 15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// 16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// This file defines function overloads to allow both AtomicWord and Atomic32 17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// data to be used with this interface. 18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// 19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// On LP64 platforms, AtomicWord and Atomic64 are both always long, 20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// so this problem doesn't occur. 21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#if !defined(ARCH_CPU_64_BITS) 23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsennamespace base { 25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsennamespace subtle { 26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monseninline AtomicWord NoBarrier_CompareAndSwap(volatile AtomicWord* ptr, 28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AtomicWord old_value, 29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AtomicWord new_value) { 30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return NoBarrier_CompareAndSwap( 31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen reinterpret_cast<volatile Atomic32*>(ptr), old_value, new_value); 32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 34ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monseninline AtomicWord NoBarrier_AtomicExchange(volatile AtomicWord* ptr, 35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AtomicWord new_value) { 36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return NoBarrier_AtomicExchange( 37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen reinterpret_cast<volatile Atomic32*>(ptr), new_value); 38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monseninline AtomicWord NoBarrier_AtomicIncrement(volatile AtomicWord* ptr, 41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AtomicWord increment) { 42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return NoBarrier_AtomicIncrement( 43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen reinterpret_cast<volatile Atomic32*>(ptr), increment); 44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monseninline AtomicWord Barrier_AtomicIncrement(volatile AtomicWord* ptr, 47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AtomicWord increment) { 48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return Barrier_AtomicIncrement( 49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen reinterpret_cast<volatile Atomic32*>(ptr), increment); 50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monseninline AtomicWord Acquire_CompareAndSwap(volatile AtomicWord* ptr, 53ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AtomicWord old_value, 54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AtomicWord new_value) { 55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return base::subtle::Acquire_CompareAndSwap( 56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen reinterpret_cast<volatile Atomic32*>(ptr), old_value, new_value); 57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monseninline AtomicWord Release_CompareAndSwap(volatile AtomicWord* ptr, 60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AtomicWord old_value, 61ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AtomicWord new_value) { 62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return base::subtle::Release_CompareAndSwap( 63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen reinterpret_cast<volatile Atomic32*>(ptr), old_value, new_value); 64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monseninline void NoBarrier_Store(volatile AtomicWord *ptr, AtomicWord value) { 67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NoBarrier_Store( 68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen reinterpret_cast<volatile Atomic32*>(ptr), value); 69ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monseninline void Acquire_Store(volatile AtomicWord* ptr, AtomicWord value) { 72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return base::subtle::Acquire_Store( 73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen reinterpret_cast<volatile Atomic32*>(ptr), value); 74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monseninline void Release_Store(volatile AtomicWord* ptr, AtomicWord value) { 77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return base::subtle::Release_Store( 78ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen reinterpret_cast<volatile Atomic32*>(ptr), value); 79ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 80ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monseninline AtomicWord NoBarrier_Load(volatile const AtomicWord *ptr) { 82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return NoBarrier_Load( 83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen reinterpret_cast<volatile const Atomic32*>(ptr)); 84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 85ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monseninline AtomicWord Acquire_Load(volatile const AtomicWord* ptr) { 87ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return base::subtle::Acquire_Load( 88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen reinterpret_cast<volatile const Atomic32*>(ptr)); 89ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 90ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monseninline AtomicWord Release_Load(volatile const AtomicWord* ptr) { 92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return base::subtle::Release_Load( 93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen reinterpret_cast<volatile const Atomic32*>(ptr)); 94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} // namespace base::subtle 97ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} // namespace base 98ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 99ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#endif // !defined(ARCH_CPU_64_BITS) 100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#endif // BASE_ATOMICOPS_INTERNALS_ATOMICWORD_COMPAT_H_ 102