1a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin/* 2a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin * 4a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin * Use of this source code is governed by a BSD-style license 5a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin * that can be found in the LICENSE file in the root of the source 6a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin * tree. An additional intellectual property rights grant can be found 7a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin * in the file PATENTS. All contributing project authors may 8a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin * be found in the AUTHORS file in the root of the source tree. 9a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin */ 10a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 11a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#include "atomic32.h" 12a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 13a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#include <assert.h> 14a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#include <windows.h> 15a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 16a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#include "common_types.h" 17a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#include "compile_assert.h" 18a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 19a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkinnamespace webrtc { 20a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 21a6451827d543eb00824bc95097e47d0aac51ae93Alexander GutkinAtomic32::Atomic32(WebRtc_Word32 initialValue) : _value(initialValue) 22a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin{ 23a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin // Make sure that the counter variable we're using is of the same size 24a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin // as what the API expects. 25a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin COMPILE_ASSERT(sizeof(_value) == sizeof(LONG)); 26a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin assert(Is32bitAligned()); 27a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin} 28a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 29a6451827d543eb00824bc95097e47d0aac51ae93Alexander GutkinAtomic32::~Atomic32() 30a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin{ 31a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin} 32a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 33a6451827d543eb00824bc95097e47d0aac51ae93Alexander GutkinWebRtc_Word32 Atomic32::operator++() 34a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin{ 35a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin return static_cast<WebRtc_Word32>(InterlockedIncrement( 36a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin reinterpret_cast<volatile LONG*>(&_value))); 37a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin} 38a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 39a6451827d543eb00824bc95097e47d0aac51ae93Alexander GutkinWebRtc_Word32 Atomic32::operator--() 40a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin{ 41a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin return static_cast<WebRtc_Word32>(InterlockedDecrement( 42a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin reinterpret_cast<volatile LONG*>(&_value))); 43a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin} 44a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 45a6451827d543eb00824bc95097e47d0aac51ae93Alexander GutkinWebRtc_Word32 Atomic32::operator+=(WebRtc_Word32 value) 46a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin{ 47a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin return InterlockedExchangeAdd(reinterpret_cast<volatile LONG*>(&_value), 48a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin value); 49a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin} 50a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 51a6451827d543eb00824bc95097e47d0aac51ae93Alexander GutkinWebRtc_Word32 Atomic32::operator-=(WebRtc_Word32 value) 52a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin{ 53a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin return InterlockedExchangeAdd(reinterpret_cast<volatile LONG*>(&_value), 54a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin -value); 55a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin} 56a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 57a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkinbool Atomic32::CompareExchange(WebRtc_Word32 newValue, 58a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin WebRtc_Word32 compareValue) 59a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin{ 60a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin const LONG oldValue = InterlockedCompareExchange( 61a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin reinterpret_cast<volatile LONG*>(&_value), 62a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin newValue, 63a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin compareValue); 64a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin // If the old value and the compare value is the same an exchange happened. 65a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin return (oldValue == compareValue); 66a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin} 67a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 68a6451827d543eb00824bc95097e47d0aac51ae93Alexander GutkinWebRtc_Word32 Atomic32::Value() const 69a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin{ 70a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin return _value; 71a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin} 72a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin} // namespace webrtc 73