Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3398)

Unified Diff: base/memory/weak_ptr.cc

Issue 7677028: Make WeakPtr thread-safe, i.e. allow cross-thread copying of WeakPtr (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: address comments Created 9 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: base/memory/weak_ptr.cc
diff --git a/base/memory/weak_ptr.cc b/base/memory/weak_ptr.cc
index 30c777c00cf1b373e17b6c811e9aaf71fab86f11..14afd335d49ed049017c9bbf24cf7e8e87da9ce6 100644
--- a/base/memory/weak_ptr.cc
+++ b/base/memory/weak_ptr.cc
@@ -7,28 +7,26 @@
namespace base {
namespace internal {
-WeakReference::Flag::Flag(Flag** handle) : handle_(handle) {
+WeakReference::Flag::Flag() : is_valid_(true) {
}
void WeakReference::Flag::Invalidate() {
DCHECK(thread_checker_.CalledOnValidThread());
- handle_ = NULL;
+ is_valid_ = false;
}
bool WeakReference::Flag::IsValid() const {
DCHECK(thread_checker_.CalledOnValidThread());
- return handle_ != NULL;
+ return is_valid_;
}
WeakReference::Flag::~Flag() {
- if (handle_)
- *handle_ = NULL;
}
WeakReference::WeakReference() {
}
-WeakReference::WeakReference(Flag* flag) : flag_(flag) {
+WeakReference::WeakReference(const Flag* flag) : flag_(flag) {
}
WeakReference::~WeakReference() {
@@ -38,7 +36,7 @@ bool WeakReference::is_valid() const {
return flag_ && flag_->IsValid();
}
-WeakReferenceOwner::WeakReferenceOwner() : flag_(NULL) {
+WeakReferenceOwner::WeakReferenceOwner() {
}
WeakReferenceOwner::~WeakReferenceOwner() {
@@ -46,8 +44,10 @@ WeakReferenceOwner::~WeakReferenceOwner() {
}
WeakReference WeakReferenceOwner::GetRef() const {
- if (!flag_)
- flag_ = new WeakReference::Flag(&flag_);
+ // We also want to reattach to the current thread if all previous references
+ // have gone away.
+ if (!HasRefs())
+ flag_ = new WeakReference::Flag();
return WeakReference(flag_);
}

Powered by Google App Engine
This is Rietveld 408576698