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 <inttypes.h> 15a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#include <malloc.h> 16a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 17a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin#include "common_types.h" 18a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 19a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkinnamespace webrtc { 20a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 21a6451827d543eb00824bc95097e47d0aac51ae93Alexander GutkinAtomic32::Atomic32(WebRtc_Word32 initialValue) : _value(initialValue) 22a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin{ 23a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin assert(Is32bitAligned()); 24a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin} 25a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 26a6451827d543eb00824bc95097e47d0aac51ae93Alexander GutkinAtomic32::~Atomic32() 27a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin{ 28a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin} 29a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 30a6451827d543eb00824bc95097e47d0aac51ae93Alexander GutkinWebRtc_Word32 Atomic32::operator++() 31a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin{ 32a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin return __sync_fetch_and_add(&_value, 1) + 1; 33a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin} 34a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 35a6451827d543eb00824bc95097e47d0aac51ae93Alexander GutkinWebRtc_Word32 Atomic32::operator--() 36a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin{ 37a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin return __sync_fetch_and_sub(&_value, 1) - 1; 38a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin} 39a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 40a6451827d543eb00824bc95097e47d0aac51ae93Alexander GutkinWebRtc_Word32 Atomic32::operator+=(WebRtc_Word32 value) 41a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin{ 42a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin WebRtc_Word32 returnValue = __sync_fetch_and_add(&_value, value); 43a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin returnValue += value; 44a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin return returnValue; 45a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin} 46a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 47a6451827d543eb00824bc95097e47d0aac51ae93Alexander GutkinWebRtc_Word32 Atomic32::operator-=(WebRtc_Word32 value) 48a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin{ 49a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin WebRtc_Word32 returnValue = __sync_fetch_and_sub(&_value, value); 50a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin returnValue -= value; 51a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin return returnValue; 52a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin} 53a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 54a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkinbool Atomic32::CompareExchange(WebRtc_Word32 newValue, 55a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin WebRtc_Word32 compareValue) 56a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin{ 57a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin return __sync_bool_compare_and_swap(&_value, compareValue, newValue); 58a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin} 59a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin 60a6451827d543eb00824bc95097e47d0aac51ae93Alexander GutkinWebRtc_Word32 Atomic32::Value() const 61a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin{ 62a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin return _value; 63a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin} 64a6451827d543eb00824bc95097e47d0aac51ae93Alexander Gutkin} // namespace webrtc 65