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