Index: base/memory/weak_ptr.cc |
diff --git a/base/memory/weak_ptr.cc b/base/memory/weak_ptr.cc |
index 591b955136a3bafaa0f37720461f48e14c9b220a..393cfb8ee50b7534c156095feb4c9d56cb73e715 100644 |
--- a/base/memory/weak_ptr.cc |
+++ b/base/memory/weak_ptr.cc |
@@ -4,75 +4,53 @@ |
#include "base/memory/weak_ptr.h" |
+#include "base/debug/leak_annotations.h" |
+ |
namespace base { |
namespace internal { |
+static constexpr uintptr_t kTrueMask = ~static_cast<uintptr_t>(0); |
+ |
+WeakReference::Flag::Flag() : is_valid_(kTrueMask) { |
#if DCHECK_IS_ON() |
-WeakReference::NewFlag::NewFlag(WeakReference::NewFlag::NullFlagTag) |
- : is_valid_(false), ref_count_(1) { |
// Flags only become bound when checked for validity, or invalidated, |
// so that we can check that later validity/invalidation operations on |
// the same Flag take place on the same sequenced thread. |
sequence_checker_.DetachFromSequence(); |
-} |
-#else |
-constexpr WeakReference::NewFlag::NewFlag(WeakReference::NewFlag::NullFlagTag) |
- : is_valid_(false), ref_count_(1) {} |
#endif |
- |
-WeakReference::NewFlag WeakReference::NewFlag::g_null_flag( |
- WeakReference::NewFlag::kNullFlagTag); |
- |
-#if 0 |
-WeakReference::Flag::Flag() : is_valid_(true) { |
- // Flags only become bound when checked for validity, or invalidated, |
- // so that we can check that later validity/invalidation operations on |
- // the same Flag take place on the same sequenced thread. |
- sequence_checker_.DetachFromSequence(); |
} |
-void WeakReference::Flag::Invalidate() { |
- // The flag being invalidated with a single ref implies that there are no |
- // weak pointers in existence. Allow deletion on other thread in this case. |
- DCHECK(sequence_checker_.CalledOnValidSequence() || HasOneRef()) |
- << "WeakPtrs must be invalidated on the same sequenced thread."; |
- is_valid_ = false; |
-} |
+WeakReference::Flag::Flag(WeakReference::Flag::NullFlagTag) : is_valid_(false) { |
+ // There is no need for sequence_checker_.DetachFromSequence() because the |
+ // null flag doesn't participate in the sequence checks. |
-bool WeakReference::Flag::IsValid() const { |
- DCHECK(sequence_checker_.CalledOnValidSequence()) |
- << "WeakPtrs must be checked on the same sequenced thread."; |
- return is_valid_; |
+ AddRef(); // Stayin' alive. |
} |
-WeakReference::Flag::~Flag() { |
+WeakReference::Flag* WeakReference::Flag::nullFlag() { |
+ ANNOTATE_SCOPED_MEMORY_LEAK; |
+ static Flag* g_null_flag = new Flag(kNullFlagTag); |
+ return g_null_flag; |
} |
-#endif |
-WeakReference::WeakReference() : new_flag_(NewFlag::NullFlag()) { |
-} |
+WeakReference::Flag::~Flag() {} |
-WeakReference::WeakReference(/*const Flag* flag,*/ const NewFlag* newFlag) |
- : /*flag_(flag),*/ new_flag_(newFlag) {} |
+WeakReference::WeakReference() : flag_(Flag::nullFlag()) {} |
WeakReference::~WeakReference() { |
} |
-WeakReference::WeakReference(WeakReference&& other) : new_flag_(std::move(other.new_flag_)) { |
- other.new_flag_ = NewFlag::NullFlag(); |
+WeakReference::WeakReference(const Flag* flag) : flag_(flag) {} |
+ |
+WeakReference::WeakReference(WeakReference&& other) |
+ : flag_(std::move(other.flag_)) { |
+ other.flag_ = Flag::nullFlag(); |
} |
WeakReference::WeakReference(const WeakReference& other) = default; |
-#if 0 |
-bool WeakReference::is_valid() const { |
- //return flag_.get() && flag_->IsValid(); |
- return new_flag_->IsValid(); |
-} |
-#endif |
- |
-WeakReferenceOwner::WeakReferenceOwner() : new_flag_(WeakReference::NewFlag::NullFlag()) { |
-} |
+WeakReferenceOwner::WeakReferenceOwner() |
+ : flag_(WeakReference::Flag::nullFlag()) {} |
WeakReferenceOwner::~WeakReferenceOwner() { |
Invalidate(); |
@@ -80,36 +58,29 @@ WeakReferenceOwner::~WeakReferenceOwner() { |
WeakReference WeakReferenceOwner::GetRef() const { |
// If we hold the last reference to the Flag then create a new one. |
- if (!HasRefs()) { |
- //flag_ = new WeakReference::Flag(); |
- new_flag_ = new WeakReference::NewFlag(); |
- } |
+ if (!HasRefs()) |
+ flag_ = new WeakReference::Flag(); |
- return WeakReference(/*flag_.get(),*/ new_flag_.get()); |
+ return WeakReference(flag_.get()); |
} |
void WeakReferenceOwner::Invalidate() { |
-#if 0 |
- if (flag_.get()) { |
- flag_->Invalidate(); |
- flag_ = NULL; |
- } |
-#endif |
- new_flag_->Invalidate(); |
- new_flag_ = WeakReference::NewFlag::NullFlag(); |
+ flag_->Invalidate(); |
+ flag_ = WeakReference::Flag::nullFlag(); |
} |
-WeakPtrBase::WeakPtrBase() : ptr_(0) { } |
+WeakPtrBase::WeakPtrBase() : ptr_(0) {} |
-WeakPtrBase::~WeakPtrBase() { } |
+WeakPtrBase::~WeakPtrBase() {} |
WeakPtrBase::WeakPtrBase(const WeakReference& ref) : ref_(ref) { |
} |
-} // namespace internal |
- |
WeakPtrFactoryBase::WeakPtrFactoryBase(uintptr_t ptr) : ptr_(ptr) {} |
-WeakPtrFactoryBase::~WeakPtrFactoryBase() { ptr_ = 0; } |
+WeakPtrFactoryBase::~WeakPtrFactoryBase() { |
+ ptr_ = 0; |
+} |
+} // namespace internal |
} // namespace base |