blob: 8633e26362237f5a8377ab94c5cef1acd6003042 [file] [log] [blame]
tommi@webrtc.orge84373c2012-04-19 14:28:45 +00001/*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11// Atomic, system independent 32-bit integer. Unless you know what you're
12// doing, use locks instead! :-)
13//
tommi@webrtc.orge84373c2012-04-19 14:28:45 +000014// Note: assumes 32-bit (or higher) system
15#ifndef WEBRTC_SYSTEM_WRAPPERS_INTERFACE_ATOMIC32_H_
16#define WEBRTC_SYSTEM_WRAPPERS_INTERFACE_ATOMIC32_H_
17
pbos@webrtc.org12dc1a32013-08-05 16:22:53 +000018#include <stddef.h>
tommi@webrtc.orge84373c2012-04-19 14:28:45 +000019
henrike@webrtc.org88fbb2d2014-05-21 21:18:46 +000020#include "webrtc/base/constructormagic.h"
pbos@webrtc.orgacaf3a12013-05-27 15:07:45 +000021#include "webrtc/common_types.h"
tommi@webrtc.orge84373c2012-04-19 14:28:45 +000022
23namespace webrtc {
24
25// 32 bit atomic variable. Note that this class relies on the compiler to
26// align the 32 bit value correctly (on a 32 bit boundary), so as long as you're
27// not doing things like reinterpret_cast over some custom allocated memory
28// without being careful with alignment, you should be fine.
phoglund@webrtc.org9cb9fc12012-11-09 08:57:25 +000029class Atomic32 {
30 public:
pbos@webrtc.org046deb92013-04-09 09:06:11 +000031 Atomic32(int32_t initial_value = 0);
phoglund@webrtc.org9cb9fc12012-11-09 08:57:25 +000032 ~Atomic32();
tommi@webrtc.orge84373c2012-04-19 14:28:45 +000033
phoglund@webrtc.org9cb9fc12012-11-09 08:57:25 +000034 // Prefix operator!
pbos@webrtc.org046deb92013-04-09 09:06:11 +000035 int32_t operator++();
36 int32_t operator--();
tommi@webrtc.orge84373c2012-04-19 14:28:45 +000037
pbos@webrtc.org046deb92013-04-09 09:06:11 +000038 int32_t operator+=(int32_t value);
39 int32_t operator-=(int32_t value);
tommi@webrtc.orge84373c2012-04-19 14:28:45 +000040
phoglund@webrtc.org9cb9fc12012-11-09 08:57:25 +000041 // Sets the value atomically to new_value if the value equals compare value.
42 // The function returns true if the exchange happened.
pbos@webrtc.org046deb92013-04-09 09:06:11 +000043 bool CompareExchange(int32_t new_value, int32_t compare_value);
henrike@webrtc.org82f014a2013-09-10 18:24:07 +000044 int32_t Value() {
45 return *this += 0;
46 }
tommi@webrtc.orge84373c2012-04-19 14:28:45 +000047
phoglund@webrtc.org9cb9fc12012-11-09 08:57:25 +000048 private:
49 // Disable the + and - operator since it's unclear what these operations
50 // should do.
51 Atomic32 operator+(const Atomic32& other);
52 Atomic32 operator-(const Atomic32& other);
tommi@webrtc.orge84373c2012-04-19 14:28:45 +000053
phoglund@webrtc.org9cb9fc12012-11-09 08:57:25 +000054 // Checks if |_value| is 32bit aligned.
55 inline bool Is32bitAligned() const {
56 return (reinterpret_cast<ptrdiff_t>(&value_) & 3) == 0;
57 }
tommi@webrtc.orge84373c2012-04-19 14:28:45 +000058
phoglund@webrtc.org9cb9fc12012-11-09 08:57:25 +000059 DISALLOW_COPY_AND_ASSIGN(Atomic32);
tommi@webrtc.orge84373c2012-04-19 14:28:45 +000060
pbos@webrtc.org046deb92013-04-09 09:06:11 +000061 int32_t value_;
tommi@webrtc.orge84373c2012-04-19 14:28:45 +000062};
phoglund@webrtc.org9cb9fc12012-11-09 08:57:25 +000063
tommi@webrtc.orge84373c2012-04-19 14:28:45 +000064} // namespace webrtc
65
phoglund@webrtc.org9cb9fc12012-11-09 08:57:25 +000066#endif // WEBRTC_SYSTEM_WRAPPERS_INTERFACE_ATOMIC32_H_