blob: d6a5eca0c1acdbd02a440fc6805904c82f16b3f7 [file] [log] [blame]
[email protected]3b63f8f42011-03-28 01:54:151// Copyright (c) 2011 The Chromium Authors. All rights reserved.
[email protected]3a3d47472010-07-15 21:03:542// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
[email protected]3b63f8f42011-03-28 01:54:155#include "base/memory/weak_ptr.h"
[email protected]3a3d47472010-07-15 21:03:546
7namespace base {
8namespace internal {
9
Hans Wennborg4cfa3012017-08-08 03:33:3810WeakReference::Flag::Flag() : is_valid_(true) {
[email protected]ed3f67342013-05-29 08:04:3211 // Flags only become bound when checked for validity, or invalidated,
12 // so that we can check that later validity/invalidation operations on
[email protected]d52426c2013-07-30 19:26:4013 // the same Flag take place on the same sequenced thread.
Olivier Lic3c5c502018-04-27 20:17:4714 DETACH_FROM_SEQUENCE(sequence_checker_);
[email protected]3a3d47472010-07-15 21:03:5415}
16
hans24046fd2017-06-29 22:07:4217void WeakReference::Flag::Invalidate() {
18 // The flag being invalidated with a single ref implies that there are no
Hans Wennborg4cfa3012017-08-08 03:33:3819 // weak pointers in existence. Allow deletion on other thread in this case.
Olivier Lic3c5c502018-04-27 20:17:4720#if DCHECK_IS_ON()
hans24046fd2017-06-29 22:07:4221 DCHECK(sequence_checker_.CalledOnValidSequence() || HasOneRef())
22 << "WeakPtrs must be invalidated on the same sequenced thread.";
Olivier Lic3c5c502018-04-27 20:17:4723#endif
Hans Wennborg4cfa3012017-08-08 03:33:3824 is_valid_ = false;
[email protected]6aacd8d2011-03-10 19:56:5325}
26
Hans Wennborg4cfa3012017-08-08 03:33:3827bool WeakReference::Flag::IsValid() const {
Olivier Lic3c5c502018-04-27 20:17:4728 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_)
Hans Wennborg4cfa3012017-08-08 03:33:3829 << "WeakPtrs must be checked on the same sequenced thread.";
30 return is_valid_;
[email protected]201366472010-07-16 17:22:4931}
32
Chris Watkinsbb7211c2017-11-29 07:16:3833WeakReference::Flag::~Flag() = default;
Hans Wennborg4cfa3012017-08-08 03:33:3834
Chris Watkinsbb7211c2017-11-29 07:16:3835WeakReference::WeakReference() = default;
Hans Wennborg4cfa3012017-08-08 03:33:3836
Wez7eedd9e2018-01-23 00:27:0537WeakReference::WeakReference(const scoped_refptr<Flag>& flag) : flag_(flag) {}
Hans Wennborg4cfa3012017-08-08 03:33:3838
Chris Watkinsbb7211c2017-11-29 07:16:3839WeakReference::~WeakReference() = default;
Hans Wennborg4cfa3012017-08-08 03:33:3840
41WeakReference::WeakReference(WeakReference&& other) = default;
42
mek79016812016-06-24 21:29:0443WeakReference::WeakReference(const WeakReference& other) = default;
44
Wez7eedd9e2018-01-23 00:27:0545bool WeakReference::is_valid() const {
46 return flag_ && flag_->IsValid();
47}
Hans Wennborg4cfa3012017-08-08 03:33:3848
Chris Watkinsbb7211c2017-11-29 07:16:3849WeakReferenceOwner::WeakReferenceOwner() = default;
[email protected]3a3d47472010-07-15 21:03:5450
51WeakReferenceOwner::~WeakReferenceOwner() {
52 Invalidate();
53}
54
55WeakReference WeakReferenceOwner::GetRef() const {
[email protected]ed3f67342013-05-29 08:04:3256 // If we hold the last reference to the Flag then create a new one.
[email protected]1edefc42011-08-26 17:32:2957 if (!HasRefs())
58 flag_ = new WeakReference::Flag();
[email protected]ed3f67342013-05-29 08:04:3259
Wez7eedd9e2018-01-23 00:27:0560 return WeakReference(flag_);
[email protected]3a3d47472010-07-15 21:03:5461}
62
63void WeakReferenceOwner::Invalidate() {
Wez7eedd9e2018-01-23 00:27:0564 if (flag_) {
hans24046fd2017-06-29 22:07:4265 flag_->Invalidate();
Ivan Kotenkova16212a52017-11-08 12:37:3366 flag_ = nullptr;
hans24046fd2017-06-29 22:07:4267 }
[email protected]3a3d47472010-07-15 21:03:5468}
69
Olivier Lic3c5c502018-04-27 20:17:4770WeakPtrBase::WeakPtrBase() = default;
[email protected]3a3d47472010-07-15 21:03:5471
Chris Watkinsbb7211c2017-11-29 07:16:3872WeakPtrBase::~WeakPtrBase() = default;
[email protected]3a3d47472010-07-15 21:03:5473
hanscc65b2992017-06-29 20:35:2874WeakPtrBase::WeakPtrBase(const WeakReference& ref, uintptr_t ptr)
75 : ref_(ref), ptr_(ptr) {}
[email protected]201366472010-07-16 17:22:4976
hansd2a722f2017-06-28 21:12:5477WeakPtrFactoryBase::WeakPtrFactoryBase(uintptr_t ptr) : ptr_(ptr) {}
78
79WeakPtrFactoryBase::~WeakPtrFactoryBase() {
80 ptr_ = 0;
81}
82
[email protected]3a3d47472010-07-15 21:03:5483} // namespace internal
84} // namespace base