diff options
author | pliard@chromium.org <pliard@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-03-13 12:07:19 +0000 |
---|---|---|
committer | pliard@chromium.org <pliard@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-03-13 12:07:19 +0000 |
commit | 8a8443ffbbf0b31a2feaa843d253ede348bd9abd (patch) | |
tree | 06bee987425255252e4d1530c0aadb4880160b96 /base/atomic_sequence_num.h | |
parent | 62308c2a12a7d804203cea272abfdd539d65a1dc (diff) | |
download | chromium_src-8a8443ffbbf0b31a2feaa843d253ede348bd9abd.zip chromium_src-8a8443ffbbf0b31a2feaa843d253ede348bd9abd.tar.gz chromium_src-8a8443ffbbf0b31a2feaa843d253ede348bd9abd.tar.bz2 |
Add base::StaticAtomicSequenceNumber.
This patch also replaces the global AtomicSequenceNumber variables with
StaticAtomicSequenceNumber in order to remove static initializers.
BUG=94925
Review URL: http://codereview.chromium.org/9415039
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@126376 0039d316-1c4b-4281-b951-d872f2087c98
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); }; |