Index: base/memory/weak_ptr.cc |
diff --git a/base/memory/weak_ptr.cc b/base/memory/weak_ptr.cc |
index 30c777c00cf1b373e17b6c811e9aaf71fab86f11..e667c6f78b2d31b0b92bc22f6e87bb1e74b40c95 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 (!flag_ || !HasRefs()) |
darin (slow to review)
2011/08/18 20:29:52
HasRefs() already null checks flag_, right?
|
+ flag_ = new WeakReference::Flag(); |
return WeakReference(flag_); |
} |