Index: base/atomic_sequence_num.h |
diff --git a/base/atomic_sequence_num.h b/base/atomic_sequence_num.h |
index 11805a0ae501b37207342dd33fae76604569baae..e813c9bac8bcdfb59a2cd43ccf4fe9e31b090ef3 100644 |
--- a/base/atomic_sequence_num.h |
+++ b/base/atomic_sequence_num.h |
@@ -11,18 +11,48 @@ |
namespace base { |
-class AtomicSequenceNumber { |
+class AtomicSequenceNumber; |
+ |
+// 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: |
- AtomicSequenceNumber() : seq_(0) { } |
- explicit AtomicSequenceNumber(base::LinkerInitialized x) { /* seq_ is 0 */ } |
- |
- int GetNext() { |
+ 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); |
}; |