1*6777b538SAndroid Build Coastguard Worker // Copyright 2011 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef BASE_SYNCHRONIZATION_ATOMIC_FLAG_H_ 6*6777b538SAndroid Build Coastguard Worker #define BASE_SYNCHRONIZATION_ATOMIC_FLAG_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <stdint.h> 9*6777b538SAndroid Build Coastguard Worker 10*6777b538SAndroid Build Coastguard Worker #include <atomic> 11*6777b538SAndroid Build Coastguard Worker 12*6777b538SAndroid Build Coastguard Worker #include "base/base_export.h" 13*6777b538SAndroid Build Coastguard Worker #include "base/sequence_checker.h" 14*6777b538SAndroid Build Coastguard Worker 15*6777b538SAndroid Build Coastguard Worker namespace base { 16*6777b538SAndroid Build Coastguard Worker 17*6777b538SAndroid Build Coastguard Worker // A flag that can safely be set from one thread and read from other threads. 18*6777b538SAndroid Build Coastguard Worker // 19*6777b538SAndroid Build Coastguard Worker // This class IS NOT intended for synchronization between threads. 20*6777b538SAndroid Build Coastguard Worker class BASE_EXPORT AtomicFlag { 21*6777b538SAndroid Build Coastguard Worker public: 22*6777b538SAndroid Build Coastguard Worker AtomicFlag(); 23*6777b538SAndroid Build Coastguard Worker 24*6777b538SAndroid Build Coastguard Worker AtomicFlag(const AtomicFlag&) = delete; 25*6777b538SAndroid Build Coastguard Worker AtomicFlag& operator=(const AtomicFlag&) = delete; 26*6777b538SAndroid Build Coastguard Worker 27*6777b538SAndroid Build Coastguard Worker ~AtomicFlag(); 28*6777b538SAndroid Build Coastguard Worker 29*6777b538SAndroid Build Coastguard Worker // Set the flag. Must always be called from the same sequence. 30*6777b538SAndroid Build Coastguard Worker void Set(); 31*6777b538SAndroid Build Coastguard Worker 32*6777b538SAndroid Build Coastguard Worker // Returns true iff the flag was set. If this returns true, the current thread 33*6777b538SAndroid Build Coastguard Worker // is guaranteed to be synchronized with all memory operations on the sequence 34*6777b538SAndroid Build Coastguard Worker // which invoked Set() up until at least the first call to Set() on it. IsSet()35*6777b538SAndroid Build Coastguard Worker bool IsSet() const { 36*6777b538SAndroid Build Coastguard Worker // Inline here: this has a measurable performance impact on base::WeakPtr. 37*6777b538SAndroid Build Coastguard Worker return flag_.load(std::memory_order_acquire) != 0; 38*6777b538SAndroid Build Coastguard Worker } 39*6777b538SAndroid Build Coastguard Worker 40*6777b538SAndroid Build Coastguard Worker // Resets the flag. Be careful when using this: callers might not expect 41*6777b538SAndroid Build Coastguard Worker // IsSet() to return false after returning true once. 42*6777b538SAndroid Build Coastguard Worker void UnsafeResetForTesting(); 43*6777b538SAndroid Build Coastguard Worker 44*6777b538SAndroid Build Coastguard Worker private: 45*6777b538SAndroid Build Coastguard Worker std::atomic<uint_fast8_t> flag_{0}; 46*6777b538SAndroid Build Coastguard Worker SEQUENCE_CHECKER(set_sequence_checker_); 47*6777b538SAndroid Build Coastguard Worker }; 48*6777b538SAndroid Build Coastguard Worker 49*6777b538SAndroid Build Coastguard Worker } // namespace base 50*6777b538SAndroid Build Coastguard Worker 51*6777b538SAndroid Build Coastguard Worker #endif // BASE_SYNCHRONIZATION_ATOMIC_FLAG_H_ 52