1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 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_ATOMIC_SEQUENCE_NUM_H_ 6*6777b538SAndroid Build Coastguard Worker #define BASE_ATOMIC_SEQUENCE_NUM_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <atomic> 9*6777b538SAndroid Build Coastguard Worker 10*6777b538SAndroid Build Coastguard Worker namespace base { 11*6777b538SAndroid Build Coastguard Worker 12*6777b538SAndroid Build Coastguard Worker // AtomicSequenceNumber is a thread safe increasing sequence number generator. 13*6777b538SAndroid Build Coastguard Worker // Its constructor doesn't emit a static initializer, so it's safe to use as a 14*6777b538SAndroid Build Coastguard Worker // global variable or static member. 15*6777b538SAndroid Build Coastguard Worker class AtomicSequenceNumber { 16*6777b538SAndroid Build Coastguard Worker public: 17*6777b538SAndroid Build Coastguard Worker constexpr AtomicSequenceNumber() = default; 18*6777b538SAndroid Build Coastguard Worker AtomicSequenceNumber(const AtomicSequenceNumber&) = delete; 19*6777b538SAndroid Build Coastguard Worker AtomicSequenceNumber& operator=(const AtomicSequenceNumber&) = delete; 20*6777b538SAndroid Build Coastguard Worker 21*6777b538SAndroid Build Coastguard Worker // Returns an increasing sequence number starts from 0 for each call. 22*6777b538SAndroid Build Coastguard Worker // This function can be called from any thread without data race. GetNext()23*6777b538SAndroid Build Coastguard Worker inline int GetNext() { return seq_.fetch_add(1, std::memory_order_relaxed); } 24*6777b538SAndroid Build Coastguard Worker 25*6777b538SAndroid Build Coastguard Worker private: 26*6777b538SAndroid Build Coastguard Worker std::atomic_int seq_{0}; 27*6777b538SAndroid Build Coastguard Worker }; 28*6777b538SAndroid Build Coastguard Worker 29*6777b538SAndroid Build Coastguard Worker } // namespace base 30*6777b538SAndroid Build Coastguard Worker 31*6777b538SAndroid Build Coastguard Worker #endif // BASE_ATOMIC_SEQUENCE_NUM_H_ 32