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