1e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent/*
2e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *
4e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *  Use of this source code is governed by a BSD-style license
5e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *  that can be found in the LICENSE file in the root of the source
6e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *  tree. An additional intellectual property rights grant can be found
7e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *  in the file PATENTS.  All contributing project authors may
8e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *  be found in the AUTHORS file in the root of the source tree.
9e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent */
10e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
11e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#include "atomic32_wrapper.h"
12e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
13e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#if defined(_WIN32)
14c55a96383497a772a307b346368133960b02ad03Eric Laurent    #include "atomic32_win.h"
15e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#elif defined(WEBRTC_LINUX)
16e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    #include "atomic32_linux.h"
17e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#elif defined(WEBRTC_MAC)
18e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    #include "atomic32_mac.h"
19e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#else
20e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    #error unsupported os!
21e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#endif
22e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
23e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentnamespace webrtc {
24e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentAtomic32Wrapper::Atomic32Wrapper(WebRtc_Word32 initialValue)
25e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    : _impl(*new Atomic32Impl(initialValue))
26e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{
27e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
28e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
29e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentAtomic32Wrapper::~Atomic32Wrapper()
30e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{
31e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    delete &_impl;
32e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
33e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
34e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentWebRtc_Word32 Atomic32Wrapper::operator++()
35e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{
36e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    return ++_impl;
37e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
38e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
39e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentWebRtc_Word32 Atomic32Wrapper::operator--()
40e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{
41e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    return --_impl;
42e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
43e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
44e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent// Read and write to properly aligned variables are atomic operations.
45e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent// Ex reference (for Windows): http://msdn.microsoft.com/en-us/library/ms684122(v=VS.85).aspx
46e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent// TODO (hellner) operator= and Atomic32Wrapper::Value() can be fully
47e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent// implemented here.
48e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentAtomic32Wrapper& Atomic32Wrapper::operator=(const Atomic32Wrapper& rhs)
49e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{
50e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    if(this == &rhs)
51e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    {
52e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        return *this;
53e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    }
54e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    _impl = rhs._impl;
55e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    return *this;
56e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
57e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
58e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentAtomic32Wrapper& Atomic32Wrapper::operator=(WebRtc_Word32 rhs)
59e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{
60e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    _impl = rhs;
61e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    return *this;
62e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
63e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
64e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentWebRtc_Word32 Atomic32Wrapper::operator+=(WebRtc_Word32 rhs)
65e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{
66e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    return _impl += rhs;
67e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
68e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
69e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentWebRtc_Word32 Atomic32Wrapper::operator-=(WebRtc_Word32 rhs)
70e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{
71e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    return _impl -= rhs;
72e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
73e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
74e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentbool Atomic32Wrapper::CompareExchange(WebRtc_Word32 newValue,
75e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                                      WebRtc_Word32 compareValue)
76e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{
77e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    return _impl.CompareExchange(newValue,compareValue);
78e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
79e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
80e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentWebRtc_Word32 Atomic32Wrapper::Value() const
81e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{
82e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    return _impl.Value();
83e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
84e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} // namespace webrtc
85