1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/weak_ptr.h" 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace base { 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace internal { 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochWeakReference::Flag::Flag(Flag** handle) : handle_(handle) { 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid WeakReference::Flag::Invalidate() { 14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(thread_checker_.CalledOnValidThread()); 15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen handle_ = NULL; 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool WeakReference::Flag::IsValid() const { 19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(thread_checker_.CalledOnValidThread()); 20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return handle_ != NULL; 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenWeakReference::Flag::~Flag() { 24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (handle_) 25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen *handle_ = NULL; 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochWeakReference::WeakReference() { 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochWeakReference::WeakReference(Flag* flag) : flag_(flag) { 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochWeakReference::~WeakReference() { 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool WeakReference::is_valid() const { 38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return flag_ && flag_->IsValid(); 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochWeakReferenceOwner::WeakReferenceOwner() : flag_(NULL) { 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochWeakReferenceOwner::~WeakReferenceOwner() { 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Invalidate(); 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochWeakReference WeakReferenceOwner::GetRef() const { 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!flag_) 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch flag_ = new WeakReference::Flag(&flag_); 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return WeakReference(flag_); 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid WeakReferenceOwner::Invalidate() { 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (flag_) { 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch flag_->Invalidate(); 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch flag_ = NULL; 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochWeakPtrBase::WeakPtrBase() { 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 6472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenWeakPtrBase::~WeakPtrBase() { 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 6772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenWeakPtrBase::WeakPtrBase(const WeakReference& ref) : ref_(ref) { 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // namespace internal 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // namespace base 72