Import Cobalt 19.master.0.205881
diff --git a/src/base/memory/weak_ptr.cc b/src/base/memory/weak_ptr.cc
index 9dec8fd..c993fcb 100644
--- a/src/base/memory/weak_ptr.cc
+++ b/src/base/memory/weak_ptr.cc
@@ -7,66 +7,89 @@
namespace base {
namespace internal {
-WeakReference::Flag::Flag() : is_valid_(true) {
+WeakReference::Flag::Flag() {
+ // 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.
+ DETACH_FROM_SEQUENCE(sequence_checker_);
}
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(thread_checker_.CalledOnValidThread() || HasOneRef());
- is_valid_ = false;
+#if DCHECK_IS_ON()
+ DCHECK(sequence_checker_.CalledOnValidSequence() || HasOneRef())
+ << "WeakPtrs must be invalidated on the same sequenced thread.";
+#endif
+ invalidated_.Set();
}
bool WeakReference::Flag::IsValid() const {
- DCHECK(thread_checker_.CalledOnValidThread());
- return is_valid_;
+ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_)
+ << "WeakPtrs must be checked on the same sequenced thread.";
+ return !invalidated_.IsSet();
}
-WeakReference::Flag::~Flag() {
+bool WeakReference::Flag::MaybeValid() const {
+ return !invalidated_.IsSet();
}
-WeakReference::WeakReference() {
-}
+WeakReference::Flag::~Flag() = default;
-WeakReference::WeakReference(const Flag* flag) : flag_(flag) {
-}
+WeakReference::WeakReference() = default;
-WeakReference::~WeakReference() {
-}
+WeakReference::WeakReference(const scoped_refptr<Flag>& flag) : flag_(flag) {}
-bool WeakReference::is_valid() const {
+WeakReference::~WeakReference() = default;
+
+WeakReference::WeakReference(WeakReference&& other) = default;
+
+WeakReference::WeakReference(const WeakReference& other) = default;
+
+bool WeakReference::IsValid() const {
return flag_ && flag_->IsValid();
}
-WeakReferenceOwner::WeakReferenceOwner() {
+bool WeakReference::MaybeValid() const {
+ return flag_ && flag_->MaybeValid();
}
+WeakReferenceOwner::WeakReferenceOwner() = default;
+
WeakReferenceOwner::~WeakReferenceOwner() {
Invalidate();
}
WeakReference WeakReferenceOwner::GetRef() const {
- // We also want to reattach to the current thread if all previous references
- // have gone away.
+ // If we hold the last reference to the Flag then create a new one.
if (!HasRefs())
flag_ = new WeakReference::Flag();
+
return WeakReference(flag_);
}
void WeakReferenceOwner::Invalidate() {
if (flag_) {
flag_->Invalidate();
- flag_ = NULL;
+ flag_ = nullptr;
}
}
-WeakPtrBase::WeakPtrBase() {
+WeakPtrBase::WeakPtrBase() : ptr_(0) {}
+
+WeakPtrBase::~WeakPtrBase() = default;
+
+WeakPtrBase::WeakPtrBase(const WeakReference& ref, uintptr_t ptr)
+ : ref_(ref), ptr_(ptr) {
+ DCHECK(ptr_);
}
-WeakPtrBase::~WeakPtrBase() {
+WeakPtrFactoryBase::WeakPtrFactoryBase(uintptr_t ptr) : ptr_(ptr) {
+ DCHECK(ptr_);
}
-WeakPtrBase::WeakPtrBase(const WeakReference& ref) : ref_(ref) {
+WeakPtrFactoryBase::~WeakPtrFactoryBase() {
+ ptr_ = 0;
}
} // namespace internal