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 7namespace base { 8namespace internal { 9 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 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 25bool 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 31WeakReference::Flag::~Flag() { 32} 33 34WeakReference::WeakReference() { 35} 36 37WeakReference::WeakReference(const Flag* flag) : flag_(flag) { 38} 39 40WeakReference::~WeakReference() { 41} 42 43bool WeakReference::is_valid() const { return flag_.get() && flag_->IsValid(); } 44 45WeakReferenceOwner::WeakReferenceOwner() { 46} 47 48WeakReferenceOwner::~WeakReferenceOwner() { 49 Invalidate(); 50} 51 52WeakReference 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 60void WeakReferenceOwner::Invalidate() { 61 if (flag_.get()) { 62 flag_->Invalidate(); 63 flag_ = NULL; 64 } 65} 66 67WeakPtrBase::WeakPtrBase() { 68} 69 70WeakPtrBase::~WeakPtrBase() { 71} 72 73WeakPtrBase::WeakPtrBase(const WeakReference& ref) : ref_(ref) { 74} 75 76} // namespace internal 77} // namespace base 78