Index: src/atomic-utils.h |
diff --git a/src/atomic-utils.h b/src/atomic-utils.h |
deleted file mode 100644 |
index 34e1cb0269ac37cce1392db05ffd578aae8340b4..0000000000000000000000000000000000000000 |
--- a/src/atomic-utils.h |
+++ /dev/null |
@@ -1,175 +0,0 @@ |
-// Copyright 2015 the V8 project authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#ifndef V8_ATOMIC_UTILS_H_ |
-#define V8_ATOMIC_UTILS_H_ |
- |
-#include <limits.h> |
- |
-#include "src/base/atomicops.h" |
-#include "src/base/macros.h" |
- |
-namespace v8 { |
-namespace internal { |
- |
-template <class T> |
-class AtomicNumber { |
- public: |
- AtomicNumber() : value_(0) {} |
- explicit AtomicNumber(T initial) : value_(initial) {} |
- |
- // Returns the newly set value. |
- V8_INLINE T Increment(T increment) { |
- return static_cast<T>(base::Barrier_AtomicIncrement( |
- &value_, static_cast<base::AtomicWord>(increment))); |
- } |
- |
- V8_INLINE T Value() { return static_cast<T>(base::Acquire_Load(&value_)); } |
- |
- V8_INLINE void SetValue(T new_value) { |
- base::Release_Store(&value_, static_cast<base::AtomicWord>(new_value)); |
- } |
- |
- V8_INLINE T operator=(T value) { |
- SetValue(value); |
- return value; |
- } |
- |
- private: |
- STATIC_ASSERT(sizeof(T) <= sizeof(base::AtomicWord)); |
- |
- base::AtomicWord value_; |
-}; |
- |
- |
-// Flag using T atomically. Also accepts void* as T. |
-template <typename T> |
-class AtomicValue { |
- public: |
- AtomicValue() : value_(0) {} |
- |
- explicit AtomicValue(T initial) |
- : value_(cast_helper<T>::to_storage_type(initial)) {} |
- |
- V8_INLINE T Value() { |
- return cast_helper<T>::to_return_type(base::Acquire_Load(&value_)); |
- } |
- |
- V8_INLINE bool TrySetValue(T old_value, T new_value) { |
- return base::Release_CompareAndSwap( |
- &value_, cast_helper<T>::to_storage_type(old_value), |
- cast_helper<T>::to_storage_type(new_value)) == |
- cast_helper<T>::to_storage_type(old_value); |
- } |
- |
- V8_INLINE void SetValue(T new_value) { |
- base::Release_Store(&value_, cast_helper<T>::to_storage_type(new_value)); |
- } |
- |
- private: |
- STATIC_ASSERT(sizeof(T) <= sizeof(base::AtomicWord)); |
- |
- template <typename S> |
- struct cast_helper { |
- static base::AtomicWord to_storage_type(S value) { |
- return static_cast<base::AtomicWord>(value); |
- } |
- static S to_return_type(base::AtomicWord value) { |
- return static_cast<S>(value); |
- } |
- }; |
- |
- template <typename S> |
- struct cast_helper<S*> { |
- static base::AtomicWord to_storage_type(S* value) { |
- return reinterpret_cast<base::AtomicWord>(value); |
- } |
- static S* to_return_type(base::AtomicWord value) { |
- return reinterpret_cast<S*>(value); |
- } |
- }; |
- |
- base::AtomicWord value_; |
-}; |
- |
- |
-// See utils.h for EnumSet. Storage is always base::AtomicWord. |
-// Requirements on E: |
-// - No explicit values. |
-// - E::kLastValue defined to be the last actually used value. |
-// |
-// Example: |
-// enum E { kA, kB, kC, kLastValue = kC }; |
-template <class E> |
-class AtomicEnumSet { |
- public: |
- explicit AtomicEnumSet(base::AtomicWord bits = 0) : bits_(bits) {} |
- |
- bool IsEmpty() const { return ToIntegral() == 0; } |
- |
- bool Contains(E element) const { return (ToIntegral() & Mask(element)) != 0; } |
- bool ContainsAnyOf(const AtomicEnumSet& set) const { |
- return (ToIntegral() & set.ToIntegral()) != 0; |
- } |
- |
- void RemoveAll() { base::Release_Store(&bits_, 0); } |
- |
- bool operator==(const AtomicEnumSet& set) const { |
- return ToIntegral() == set.ToIntegral(); |
- } |
- |
- bool operator!=(const AtomicEnumSet& set) const { |
- return ToIntegral() != set.ToIntegral(); |
- } |
- |
- AtomicEnumSet<E> operator|(const AtomicEnumSet& set) const { |
- return AtomicEnumSet<E>(ToIntegral() | set.ToIntegral()); |
- } |
- |
-// The following operations modify the underlying storage. |
- |
-#define ATOMIC_SET_WRITE(OP, NEW_VAL) \ |
- do { \ |
- base::AtomicWord old; \ |
- do { \ |
- old = base::Acquire_Load(&bits_); \ |
- } while (base::Release_CompareAndSwap(&bits_, old, old OP NEW_VAL) != \ |
- old); \ |
- } while (false) |
- |
- void Add(E element) { ATOMIC_SET_WRITE(|, Mask(element)); } |
- |
- void Add(const AtomicEnumSet& set) { ATOMIC_SET_WRITE(|, set.ToIntegral()); } |
- |
- void Remove(E element) { ATOMIC_SET_WRITE(&, ~Mask(element)); } |
- |
- void Remove(const AtomicEnumSet& set) { |
- ATOMIC_SET_WRITE(&, ~set.ToIntegral()); |
- } |
- |
- void Intersect(const AtomicEnumSet& set) { |
- ATOMIC_SET_WRITE(&, set.ToIntegral()); |
- } |
- |
-#undef ATOMIC_SET_OP |
- |
- private: |
- // Check whether there's enough storage to hold E. |
- STATIC_ASSERT(E::kLastValue < (sizeof(base::AtomicWord) * CHAR_BIT)); |
- |
- V8_INLINE base::AtomicWord ToIntegral() const { |
- return base::Acquire_Load(&bits_); |
- } |
- |
- V8_INLINE base::AtomicWord Mask(E element) const { |
- return static_cast<base::AtomicWord>(1) << element; |
- } |
- |
- base::AtomicWord bits_; |
-}; |
- |
-} // namespace internal |
-} // namespace v8 |
- |
-#endif // #define V8_ATOMIC_UTILS_H_ |