1b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Use of this source code is governed by a BSD-style license that can be 3b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// found in the LICENSE file. 4b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 5b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/memory/weak_ptr.h" 6b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 7b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratnamespace base { 8b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratnamespace internal { 9b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 10b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratWeakReference::Flag::Flag() : is_valid_(true) { 11b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Flags only become bound when checked for validity, or invalidated, 12b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // so that we can check that later validity/invalidation operations on 13b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // the same Flag take place on the same sequenced thread. 14b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat sequence_checker_.DetachFromSequence(); 15b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 16b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 17b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratvoid WeakReference::Flag::Invalidate() { 18b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // The flag being invalidated with a single ref implies that there are no 19b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // weak pointers in existence. Allow deletion on other thread in this case. 20b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat DCHECK(sequence_checker_.CalledOnValidSequencedThread() || HasOneRef()) 21b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat << "WeakPtrs must be invalidated on the same sequenced thread."; 22b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat is_valid_ = false; 23b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 24b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 25b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratbool WeakReference::Flag::IsValid() const { 26b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat DCHECK(sequence_checker_.CalledOnValidSequencedThread()) 27b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat << "WeakPtrs must be checked on the same sequenced thread."; 28b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return is_valid_; 29b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 30b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 31b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratWeakReference::Flag::~Flag() { 32b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 33b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 34b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratWeakReference::WeakReference() { 35b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 36b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 37b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratWeakReference::WeakReference(const Flag* flag) : flag_(flag) { 38b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 39b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 40b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratWeakReference::~WeakReference() { 41b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 42b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 430c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezWeakReference::WeakReference(WeakReference&& other) = default; 440c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 450c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezWeakReference::WeakReference(const WeakReference& other) = default; 460c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez 47b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratbool WeakReference::is_valid() const { return flag_.get() && flag_->IsValid(); } 48b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 49b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratWeakReferenceOwner::WeakReferenceOwner() { 50b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 51b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 52b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratWeakReferenceOwner::~WeakReferenceOwner() { 53b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Invalidate(); 54b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 55b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 56b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratWeakReference WeakReferenceOwner::GetRef() const { 57b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // If we hold the last reference to the Flag then create a new one. 58b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat if (!HasRefs()) 59b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat flag_ = new WeakReference::Flag(); 60b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 61b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return WeakReference(flag_.get()); 62b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 63b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 64b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratvoid WeakReferenceOwner::Invalidate() { 65b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat if (flag_.get()) { 66b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat flag_->Invalidate(); 67b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat flag_ = NULL; 68b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 69b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 70b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 71b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratWeakPtrBase::WeakPtrBase() { 72b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 73b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 74b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratWeakPtrBase::~WeakPtrBase() { 75b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 76b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 77b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratWeakPtrBase::WeakPtrBase(const WeakReference& ref) : ref_(ref) { 78b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 79b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 80b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} // namespace internal 81b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} // namespace base 82