diff options
Diffstat (limited to 'base/atomic_sequence_num.h')
-rw-r--r-- | base/atomic_sequence_num.h | 42 |
1 files changed, 36 insertions, 6 deletions
diff --git a/base/atomic_sequence_num.h b/base/atomic_sequence_num.h index 11805a0..7cfd4e8 100644 --- a/base/atomic_sequence_num.h +++ b/base/atomic_sequence_num.h @@ -1,4 +1,4 @@ -// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. +// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -11,18 +11,48 @@ namespace base { -class AtomicSequenceNumber { - public: - AtomicSequenceNumber() : seq_(0) { } - explicit AtomicSequenceNumber(base::LinkerInitialized x) { /* seq_ is 0 */ } +class AtomicSequenceNumber; - int GetNext() { +// Static (POD) AtomicSequenceNumber that MUST be used in global scope (or +// non-function scope) ONLY. This implementation does not generate any static +// initializer. Note that it does not implement any constructor which means +// that its fields are not initialized except when it is stored in the global +// data section (.data in ELF). If you want to allocate an atomic sequence +// number on the stack (or heap), please use the AtomicSequenceNumber class +// declared below. +class StaticAtomicSequenceNumber { + public: + inline int GetNext() { return static_cast<int>( base::subtle::NoBarrier_AtomicIncrement(&seq_, 1) - 1); } private: + friend class AtomicSequenceNumber; + + inline void Reset() { + base::subtle::Release_Store(&seq_, 0); + } + base::subtle::Atomic32 seq_; +}; + +// AtomicSequenceNumber that can be stored and used safely (i.e. its fields are +// always initialized as opposed to StaticAtomicSequenceNumber declared above). +// Please use StaticAtomicSequenceNumber if you want to declare an atomic +// sequence number in the global scope. +class AtomicSequenceNumber { + public: + AtomicSequenceNumber() { + seq_.Reset(); + } + + inline int GetNext() { + return seq_.GetNext(); + } + + private: + StaticAtomicSequenceNumber seq_; DISALLOW_COPY_AND_ASSIGN(AtomicSequenceNumber); }; |