1*635a8641SAndroid Build Coastguard Worker // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file. 4*635a8641SAndroid Build Coastguard Worker 5*635a8641SAndroid Build Coastguard Worker #ifndef BASE_ATOMIC_SEQUENCE_NUM_H_ 6*635a8641SAndroid Build Coastguard Worker #define BASE_ATOMIC_SEQUENCE_NUM_H_ 7*635a8641SAndroid Build Coastguard Worker 8*635a8641SAndroid Build Coastguard Worker #include <atomic> 9*635a8641SAndroid Build Coastguard Worker 10*635a8641SAndroid Build Coastguard Worker #include "base/macros.h" 11*635a8641SAndroid Build Coastguard Worker 12*635a8641SAndroid Build Coastguard Worker namespace base { 13*635a8641SAndroid Build Coastguard Worker 14*635a8641SAndroid Build Coastguard Worker // AtomicSequenceNumber is a thread safe increasing sequence number generator. 15*635a8641SAndroid Build Coastguard Worker // Its constructor doesn't emit a static initializer, so it's safe to use as a 16*635a8641SAndroid Build Coastguard Worker // global variable or static member. 17*635a8641SAndroid Build Coastguard Worker class AtomicSequenceNumber { 18*635a8641SAndroid Build Coastguard Worker public: 19*635a8641SAndroid Build Coastguard Worker constexpr AtomicSequenceNumber() = default; 20*635a8641SAndroid Build Coastguard Worker 21*635a8641SAndroid Build Coastguard Worker // Returns an increasing sequence number starts from 0 for each call. 22*635a8641SAndroid Build Coastguard Worker // This function can be called from any thread without data race. GetNext()23*635a8641SAndroid Build Coastguard Worker inline int GetNext() { return seq_.fetch_add(1, std::memory_order_relaxed); } 24*635a8641SAndroid Build Coastguard Worker 25*635a8641SAndroid Build Coastguard Worker private: 26*635a8641SAndroid Build Coastguard Worker std::atomic_int seq_{0}; 27*635a8641SAndroid Build Coastguard Worker 28*635a8641SAndroid Build Coastguard Worker DISALLOW_COPY_AND_ASSIGN(AtomicSequenceNumber); 29*635a8641SAndroid Build Coastguard Worker }; 30*635a8641SAndroid Build Coastguard Worker 31*635a8641SAndroid Build Coastguard Worker } // namespace base 32*635a8641SAndroid Build Coastguard Worker 33*635a8641SAndroid Build Coastguard Worker #endif // BASE_ATOMIC_SEQUENCE_NUM_H_ 34