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