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