Avi Drissman | e4622aa | 2022-09-08 20:36:06 | [diff] [blame] | 1 | // Copyright 2012 The Chromium Authors |
license.bot | bf09a50 | 2008-08-24 00:55:55 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style license that can be |
3 | // found in the LICENSE file. | ||||
[email protected] | 611dbe0 | 2008-08-05 09:57:36 | [diff] [blame] | 4 | |
5 | #ifndef BASE_ATOMIC_SEQUENCE_NUM_H_ | ||||
6 | #define BASE_ATOMIC_SEQUENCE_NUM_H_ | ||||
7 | |||||
tzik | ad6d8a9b | 2017-07-12 09:54:21 | [diff] [blame] | 8 | #include <atomic> |
9 | |||||
[email protected] | 611dbe0 | 2008-08-05 09:57:36 | [diff] [blame] | 10 | namespace base { |
11 | |||||
tzik | ad6d8a9b | 2017-07-12 09:54:21 | [diff] [blame] | 12 | // AtomicSequenceNumber is a thread safe increasing sequence number generator. |
13 | // Its constructor doesn't emit a static initializer, so it's safe to use as a | ||||
14 | // global variable or static member. | ||||
[email protected] | 8a8443f | 2012-03-13 12:07:19 | [diff] [blame] | 15 | class AtomicSequenceNumber { |
16 | public: | ||||
Chris Watkins | 091d629 | 2017-12-13 04:25:58 | [diff] [blame] | 17 | constexpr AtomicSequenceNumber() = default; |
David Bienvenu | b4b441e | 2020-09-23 05:49:57 | [diff] [blame] | 18 | AtomicSequenceNumber(const AtomicSequenceNumber&) = delete; |
19 | AtomicSequenceNumber& operator=(const AtomicSequenceNumber&) = delete; | ||||
[email protected] | 8a8443f | 2012-03-13 12:07:19 | [diff] [blame] | 20 | |
tzik | ad6d8a9b | 2017-07-12 09:54:21 | [diff] [blame] | 21 | // Returns an increasing sequence number starts from 0 for each call. |
22 | // This function can be called from any thread without data race. | ||||
23 | inline int GetNext() { return seq_.fetch_add(1, std::memory_order_relaxed); } | ||||
[email protected] | 8a8443f | 2012-03-13 12:07:19 | [diff] [blame] | 24 | |
25 | private: | ||||
tzik | ad6d8a9b | 2017-07-12 09:54:21 | [diff] [blame] | 26 | std::atomic_int seq_{0}; |
[email protected] | 611dbe0 | 2008-08-05 09:57:36 | [diff] [blame] | 27 | }; |
28 | |||||
29 | } // namespace base | ||||
30 | |||||
31 | #endif // BASE_ATOMIC_SEQUENCE_NUM_H_ |