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