blob: bf8febcdb53cdf57c82ef5a52e979950f094d379 [file] [log] [blame]
niklase@google.comf0779a22011-05-30 11:39:38 +00001/*
2 * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11// Atomic system independant 32-bit signed integer.
12// Mac implementation.
13#ifndef WEBRTC_SYSTEM_WRAPPERS_SOURCE_ATOMIC32_MAC_H_
14#define WEBRTC_SYSTEM_WRAPPERS_SOURCE_ATOMIC32_MAC_H_
15
16#include <stdlib.h>
17#include <libkern/OSAtomic.h>
18
19#include "common_types.h"
20
21namespace webrtc {
22class Atomic32Impl
23{
24public:
25 inline Atomic32Impl(WebRtc_Word32 initialValue);
26 inline ~Atomic32Impl();
27
28 inline WebRtc_Word32 operator++();
29 inline WebRtc_Word32 operator--();
30
31 inline Atomic32Impl& operator=(const Atomic32Impl& rhs);
32 inline Atomic32Impl& operator=(WebRtc_Word32 rhs);
33 inline WebRtc_Word32 operator+=(WebRtc_Word32 rhs);
34 inline WebRtc_Word32 operator-=(WebRtc_Word32 rhs);
35
36 inline bool CompareExchange(WebRtc_Word32 newValue,
37 WebRtc_Word32 compareValue);
38
39 inline WebRtc_Word32 Value() const;
40private:
41 void* _ptrMemory;
42 // Volatile ensures full memory barriers.
43 volatile WebRtc_Word32* _value;
44};
45
46// TODO (hellner) use aligned_malloc instead of doing it manually.
47inline Atomic32Impl::Atomic32Impl(WebRtc_Word32 initialValue)
48 :
49 _ptrMemory(NULL),
50 _value(NULL)
51{ // Align the memory associated with _value on a 32-bit boundary. This is a
52 // requirement for the used Mac APIs to be atomic.
53 // Keep _ptrMemory to be able to reclaim memory.
54 _ptrMemory = malloc(sizeof(WebRtc_Word32)*2);
55 _value = (WebRtc_Word32*) (((uintptr_t)_ptrMemory+3)&(~0x3));
56 *_value = initialValue;
57}
58
59inline Atomic32Impl::~Atomic32Impl()
60{
61 if(_ptrMemory != NULL)
62 {
63 free(_ptrMemory);
64 }
65}
66
67inline WebRtc_Word32 Atomic32Impl::operator++()
68{
69 return OSAtomicIncrement32Barrier(
70 reinterpret_cast<volatile int32_t*>(_value));
71}
72
73inline WebRtc_Word32 Atomic32Impl::operator--()
74{
75 return OSAtomicDecrement32Barrier(
76 reinterpret_cast<volatile int32_t*>(_value));
77}
78
79inline Atomic32Impl& Atomic32Impl::operator=(const Atomic32Impl& rhs)
80{
81 *_value = *rhs._value;
82 return *this;
83}
84
85inline Atomic32Impl& Atomic32Impl::operator=(WebRtc_Word32 rhs)
86{
87 *_value = rhs;
88 return *this;
89}
90
91inline WebRtc_Word32 Atomic32Impl::operator+=(WebRtc_Word32 rhs)
92{
93 return OSAtomicAdd32Barrier(rhs,
94 reinterpret_cast<volatile int32_t*>(_value));
95}
96
97inline WebRtc_Word32 Atomic32Impl::operator-=(WebRtc_Word32 rhs)
98{
99 return OSAtomicAdd32Barrier(-rhs,
100 reinterpret_cast<volatile int32_t*>(_value));
101}
102
103inline bool Atomic32Impl::CompareExchange(WebRtc_Word32 newValue,
104 WebRtc_Word32 compareValue)
105{
106 return OSAtomicCompareAndSwap32Barrier(
107 compareValue,
108 newValue,
109 reinterpret_cast<volatile int32_t*>(_value));
110}
111
112inline WebRtc_Word32 Atomic32Impl::Value() const
113{
114 return *_value;
115}
116} // namespace webrtc
117#endif // WEBRTC_SYSTEM_WRAPPERS_SOURCE_ATOMIC32_MAC_H_