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 | |
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')
-rw-r--r-- | base/atomic_sequence_num.h | 42 | ||||
-rw-r--r-- | base/lazy_instance_unittest.cc | 4 | ||||
-rw-r--r-- | base/message_loop_proxy_unittest.cc | 4 |
3 files changed, 40 insertions, 10 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); }; diff --git a/base/lazy_instance_unittest.cc b/base/lazy_instance_unittest.cc index 01ce8e5..b3106a4 100644 --- a/base/lazy_instance_unittest.cc +++ b/base/lazy_instance_unittest.cc @@ -11,8 +11,8 @@ namespace { -base::AtomicSequenceNumber constructed_seq_(base::LINKER_INITIALIZED); -base::AtomicSequenceNumber destructed_seq_(base::LINKER_INITIALIZED); +base::StaticAtomicSequenceNumber constructed_seq_; +base::StaticAtomicSequenceNumber destructed_seq_; class ConstructAndDestructLogger { public: diff --git a/base/message_loop_proxy_unittest.cc b/base/message_loop_proxy_unittest.cc index 738a336..2fdef13 100644 --- a/base/message_loop_proxy_unittest.cc +++ b/base/message_loop_proxy_unittest.cc @@ -95,7 +95,7 @@ class MessageLoopProxyTest : public testing::Test { thread_sync_.Wait(); } - static AtomicSequenceNumber g_order; + static StaticAtomicSequenceNumber g_order; scoped_ptr<MessageLoop> current_loop_; Thread task_thread_; @@ -104,7 +104,7 @@ class MessageLoopProxyTest : public testing::Test { base::WaitableEvent thread_sync_; }; -AtomicSequenceNumber MessageLoopProxyTest::g_order(LINKER_INITIALIZED); +StaticAtomicSequenceNumber MessageLoopProxyTest::g_order; TEST_F(MessageLoopProxyTest, PostTaskAndReply_Basic) { MessageLoop* task_run_on = NULL; |