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 11b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Atomic, system independent 32-bit integer. Unless you know what you're 12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// doing, use locks instead! :-) 13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// 14b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Note: assumes 32-bit (or higher) system 15b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifndef WEBRTC_SYSTEM_WRAPPERS_INTERFACE_ATOMIC32_H_ 16b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_SYSTEM_WRAPPERS_INTERFACE_ATOMIC32_H_ 17b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 183f45c2e0ac4cb280f941efa3a3476895795e3dd6pbos@webrtc.org#include <stddef.h> 19b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 20774b3d38a4a0f1a8ec08972a3c543cb5d607ce13henrike@webrtc.org#include "webrtc/base/constructormagic.h" 21c6d6fed3c0a82bb7a09095381b974e8e5eebcb35pbos@webrtc.org#include "webrtc/common_types.h" 22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc { 24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// 32 bit atomic variable. Note that this class relies on the compiler to 26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// align the 32 bit value correctly (on a 32 bit boundary), so as long as you're 27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// not doing things like reinterpret_cast over some custom allocated memory 28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// without being careful with alignment, you should be fine. 299ca84f7da9bd4aa00015b9c5eadf6d21e6ddfd01phoglund@webrtc.orgclass Atomic32 { 309ca84f7da9bd4aa00015b9c5eadf6d21e6ddfd01phoglund@webrtc.org public: 31c0231afbbf1d7bac40b77da5933715dc63c88144pbos@webrtc.org Atomic32(int32_t initial_value = 0); 329ca84f7da9bd4aa00015b9c5eadf6d21e6ddfd01phoglund@webrtc.org ~Atomic32(); 33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 349ca84f7da9bd4aa00015b9c5eadf6d21e6ddfd01phoglund@webrtc.org // Prefix operator! 35c0231afbbf1d7bac40b77da5933715dc63c88144pbos@webrtc.org int32_t operator++(); 36c0231afbbf1d7bac40b77da5933715dc63c88144pbos@webrtc.org int32_t operator--(); 37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 38c0231afbbf1d7bac40b77da5933715dc63c88144pbos@webrtc.org int32_t operator+=(int32_t value); 39c0231afbbf1d7bac40b77da5933715dc63c88144pbos@webrtc.org int32_t operator-=(int32_t value); 40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 419ca84f7da9bd4aa00015b9c5eadf6d21e6ddfd01phoglund@webrtc.org // Sets the value atomically to new_value if the value equals compare value. 429ca84f7da9bd4aa00015b9c5eadf6d21e6ddfd01phoglund@webrtc.org // The function returns true if the exchange happened. 43c0231afbbf1d7bac40b77da5933715dc63c88144pbos@webrtc.org bool CompareExchange(int32_t new_value, int32_t compare_value); 44f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org int32_t Value() { 45f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org return *this += 0; 46f46fff61745ab9bf19a7075a105e5d96308c5526henrike@webrtc.org } 47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 489ca84f7da9bd4aa00015b9c5eadf6d21e6ddfd01phoglund@webrtc.org private: 499ca84f7da9bd4aa00015b9c5eadf6d21e6ddfd01phoglund@webrtc.org // Disable the + and - operator since it's unclear what these operations 509ca84f7da9bd4aa00015b9c5eadf6d21e6ddfd01phoglund@webrtc.org // should do. 519ca84f7da9bd4aa00015b9c5eadf6d21e6ddfd01phoglund@webrtc.org Atomic32 operator+(const Atomic32& other); 529ca84f7da9bd4aa00015b9c5eadf6d21e6ddfd01phoglund@webrtc.org Atomic32 operator-(const Atomic32& other); 53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 549ca84f7da9bd4aa00015b9c5eadf6d21e6ddfd01phoglund@webrtc.org // Checks if |_value| is 32bit aligned. 559ca84f7da9bd4aa00015b9c5eadf6d21e6ddfd01phoglund@webrtc.org inline bool Is32bitAligned() const { 569ca84f7da9bd4aa00015b9c5eadf6d21e6ddfd01phoglund@webrtc.org return (reinterpret_cast<ptrdiff_t>(&value_) & 3) == 0; 579ca84f7da9bd4aa00015b9c5eadf6d21e6ddfd01phoglund@webrtc.org } 58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 599ca84f7da9bd4aa00015b9c5eadf6d21e6ddfd01phoglund@webrtc.org DISALLOW_COPY_AND_ASSIGN(Atomic32); 60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 61c0231afbbf1d7bac40b77da5933715dc63c88144pbos@webrtc.org int32_t value_; 62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}; 639ca84f7da9bd4aa00015b9c5eadf6d21e6ddfd01phoglund@webrtc.org 64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} // namespace webrtc 65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 669ca84f7da9bd4aa00015b9c5eadf6d21e6ddfd01phoglund@webrtc.org#endif // WEBRTC_SYSTEM_WRAPPERS_INTERFACE_ATOMIC32_H_ 67