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