blob: 50c49895d4b97be6e150b3db575ee7d3c50dfab6 [file] [log] [blame]
tommi@webrtc.orge84373c2012-04-19 14:28:45 +00001/*
2 * Copyright (c) 2012 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
pbos@webrtc.orgacaf3a12013-05-27 15:07:45 +000011#include "webrtc/system_wrappers/interface/atomic32.h"
tommi@webrtc.orge84373c2012-04-19 14:28:45 +000012
13#include <assert.h>
14#include <windows.h>
15
kwiberg@webrtc.org3df38b42015-01-13 11:37:48 +000016#include "webrtc/base/compile_assert.h"
pbos@webrtc.orgacaf3a12013-05-27 15:07:45 +000017#include "webrtc/common_types.h"
tommi@webrtc.orge84373c2012-04-19 14:28:45 +000018
19namespace webrtc {
20
pbos@webrtc.org046deb92013-04-09 09:06:11 +000021Atomic32::Atomic32(int32_t initial_value)
phoglund@webrtc.org9cb9fc12012-11-09 08:57:25 +000022 : value_(initial_value) {
andrew@webrtc.org31628aa2013-10-22 12:50:00 +000023 COMPILE_ASSERT(sizeof(value_) == sizeof(LONG),
24 counter_variable_is_the_expected_size);
phoglund@webrtc.org9cb9fc12012-11-09 08:57:25 +000025 assert(Is32bitAligned());
tommi@webrtc.orge84373c2012-04-19 14:28:45 +000026}
27
phoglund@webrtc.org9cb9fc12012-11-09 08:57:25 +000028Atomic32::~Atomic32() {
tommi@webrtc.orge84373c2012-04-19 14:28:45 +000029}
30
pbos@webrtc.org046deb92013-04-09 09:06:11 +000031int32_t Atomic32::operator++() {
32 return static_cast<int32_t>(InterlockedIncrement(
phoglund@webrtc.org9cb9fc12012-11-09 08:57:25 +000033 reinterpret_cast<volatile LONG*>(&value_)));
tommi@webrtc.orge84373c2012-04-19 14:28:45 +000034}
35
pbos@webrtc.org046deb92013-04-09 09:06:11 +000036int32_t Atomic32::operator--() {
37 return static_cast<int32_t>(InterlockedDecrement(
phoglund@webrtc.org9cb9fc12012-11-09 08:57:25 +000038 reinterpret_cast<volatile LONG*>(&value_)));
tommi@webrtc.orge84373c2012-04-19 14:28:45 +000039}
40
pbos@webrtc.org046deb92013-04-09 09:06:11 +000041int32_t Atomic32::operator+=(int32_t value) {
phoglund@webrtc.org9cb9fc12012-11-09 08:57:25 +000042 return InterlockedExchangeAdd(reinterpret_cast<volatile LONG*>(&value_),
43 value);
tommi@webrtc.orge84373c2012-04-19 14:28:45 +000044}
45
pbos@webrtc.org046deb92013-04-09 09:06:11 +000046int32_t Atomic32::operator-=(int32_t value) {
phoglund@webrtc.org9cb9fc12012-11-09 08:57:25 +000047 return InterlockedExchangeAdd(reinterpret_cast<volatile LONG*>(&value_),
48 -value);
tommi@webrtc.orge84373c2012-04-19 14:28:45 +000049}
50
pbos@webrtc.org046deb92013-04-09 09:06:11 +000051bool Atomic32::CompareExchange(int32_t new_value, int32_t compare_value) {
phoglund@webrtc.org9cb9fc12012-11-09 08:57:25 +000052 const LONG old_value = InterlockedCompareExchange(
53 reinterpret_cast<volatile LONG*>(&value_),
54 new_value,
55 compare_value);
56
57 // If the old value and the compare value is the same an exchange happened.
58 return (old_value == compare_value);
tommi@webrtc.orge84373c2012-04-19 14:28:45 +000059}
60
tommi@webrtc.orge84373c2012-04-19 14:28:45 +000061} // namespace webrtc