1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*
2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Use of this source code is governed by a BSD-style license
5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  that can be found in the LICENSE file in the root of the source
6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  tree. An additional intellectual property rights grant can be found
7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  in the file PATENTS.  All contributing project authors may
8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */
10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
11c6d6fed3c0a82bb7a09095381b974e8e5eebcb35pbos@webrtc.org#include "webrtc/system_wrappers/interface/atomic32.h"
12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <assert.h>
14b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <inttypes.h>
15b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <malloc.h>
16b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
17c6d6fed3c0a82bb7a09095381b974e8e5eebcb35pbos@webrtc.org#include "webrtc/common_types.h"
18b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
19b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc {
20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
21c0231afbbf1d7bac40b77da5933715dc63c88144pbos@webrtc.orgAtomic32::Atomic32(int32_t initial_value)
229ca84f7da9bd4aa00015b9c5eadf6d21e6ddfd01phoglund@webrtc.org    : value_(initial_value) {
239ca84f7da9bd4aa00015b9c5eadf6d21e6ddfd01phoglund@webrtc.org  assert(Is32bitAligned());
24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
269ca84f7da9bd4aa00015b9c5eadf6d21e6ddfd01phoglund@webrtc.orgAtomic32::~Atomic32() {
27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
29c0231afbbf1d7bac40b77da5933715dc63c88144pbos@webrtc.orgint32_t Atomic32::operator++() {
309ca84f7da9bd4aa00015b9c5eadf6d21e6ddfd01phoglund@webrtc.org  return __sync_fetch_and_add(&value_, 1) + 1;
31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
33c0231afbbf1d7bac40b77da5933715dc63c88144pbos@webrtc.orgint32_t Atomic32::operator--() {
349ca84f7da9bd4aa00015b9c5eadf6d21e6ddfd01phoglund@webrtc.org  return __sync_fetch_and_sub(&value_, 1) - 1;
35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
37c0231afbbf1d7bac40b77da5933715dc63c88144pbos@webrtc.orgint32_t Atomic32::operator+=(int32_t value) {
38c0231afbbf1d7bac40b77da5933715dc63c88144pbos@webrtc.org  int32_t return_value = __sync_fetch_and_add(&value_, value);
399ca84f7da9bd4aa00015b9c5eadf6d21e6ddfd01phoglund@webrtc.org  return_value += value;
409ca84f7da9bd4aa00015b9c5eadf6d21e6ddfd01phoglund@webrtc.org  return return_value;
41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
43c0231afbbf1d7bac40b77da5933715dc63c88144pbos@webrtc.orgint32_t Atomic32::operator-=(int32_t value) {
44c0231afbbf1d7bac40b77da5933715dc63c88144pbos@webrtc.org  int32_t return_value = __sync_fetch_and_sub(&value_, value);
459ca84f7da9bd4aa00015b9c5eadf6d21e6ddfd01phoglund@webrtc.org  return_value -= value;
469ca84f7da9bd4aa00015b9c5eadf6d21e6ddfd01phoglund@webrtc.org  return return_value;
47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
49c0231afbbf1d7bac40b77da5933715dc63c88144pbos@webrtc.orgbool Atomic32::CompareExchange(int32_t new_value, int32_t compare_value) {
509ca84f7da9bd4aa00015b9c5eadf6d21e6ddfd01phoglund@webrtc.org  return __sync_bool_compare_and_swap(&value_, compare_value, new_value);
51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
533b89e10f31160da35b408fd00cb8f89d2b08862dpbos@webrtc.org}  // namespace webrtc
54