15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 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, use base/atomicops.h instead. 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef BASE_ATOMICOPS_INTERNALS_ATOMICWORD_COMPAT_H_ 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define BASE_ATOMICOPS_INTERNALS_ATOMICWORD_COMPAT_H_ 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// AtomicWord is a synonym for intptr_t, and Atomic32 is a synonym for int32, 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// which in turn means int. On some LP32 platforms, intptr_t is an int, but 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// on others, it's a long. When AtomicWord and Atomic32 are based on different 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// fundamental types, their pointers are incompatible. 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file defines function overloads to allow both AtomicWord and Atomic32 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// data to be used with this interface. 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// On LP64 platforms, AtomicWord and Atomic64 are both always long, 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// so this problem doesn't occur. 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(ARCH_CPU_64_BITS) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace subtle { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline AtomicWord NoBarrier_CompareAndSwap(volatile AtomicWord* ptr, 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AtomicWord old_value, 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AtomicWord new_value) { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NoBarrier_CompareAndSwap( 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<volatile Atomic32*>(ptr), old_value, new_value); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline AtomicWord NoBarrier_AtomicExchange(volatile AtomicWord* ptr, 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AtomicWord new_value) { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NoBarrier_AtomicExchange( 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<volatile Atomic32*>(ptr), new_value); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline AtomicWord NoBarrier_AtomicIncrement(volatile AtomicWord* ptr, 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AtomicWord increment) { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NoBarrier_AtomicIncrement( 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<volatile Atomic32*>(ptr), increment); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline AtomicWord Barrier_AtomicIncrement(volatile AtomicWord* ptr, 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AtomicWord increment) { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Barrier_AtomicIncrement( 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<volatile Atomic32*>(ptr), increment); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline AtomicWord Acquire_CompareAndSwap(volatile AtomicWord* ptr, 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AtomicWord old_value, 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AtomicWord new_value) { 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return base::subtle::Acquire_CompareAndSwap( 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<volatile Atomic32*>(ptr), old_value, new_value); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline AtomicWord Release_CompareAndSwap(volatile AtomicWord* ptr, 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AtomicWord old_value, 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AtomicWord new_value) { 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return base::subtle::Release_CompareAndSwap( 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<volatile Atomic32*>(ptr), old_value, new_value); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void NoBarrier_Store(volatile AtomicWord *ptr, AtomicWord value) { 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NoBarrier_Store( 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<volatile Atomic32*>(ptr), value); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void Acquire_Store(volatile AtomicWord* ptr, AtomicWord value) { 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return base::subtle::Acquire_Store( 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<volatile Atomic32*>(ptr), value); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void Release_Store(volatile AtomicWord* ptr, AtomicWord value) { 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return base::subtle::Release_Store( 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<volatile Atomic32*>(ptr), value); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline AtomicWord NoBarrier_Load(volatile const AtomicWord *ptr) { 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NoBarrier_Load( 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<volatile const Atomic32*>(ptr)); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline AtomicWord Acquire_Load(volatile const AtomicWord* ptr) { 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return base::subtle::Acquire_Load( 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<volatile const Atomic32*>(ptr)); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline AtomicWord Release_Load(volatile const AtomicWord* ptr) { 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return base::subtle::Release_Load( 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<volatile const Atomic32*>(ptr)); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace base::subtle 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace base 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // !defined(ARCH_CPU_64_BITS) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // BASE_ATOMICOPS_INTERNALS_ATOMICWORD_COMPAT_H_ 101