[email protected] | 3b63f8f4 | 2011-03-28 01:54:15 | [diff] [blame] | 1 | // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
[email protected] | 3a3d4747 | 2010-07-15 21:03:54 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style license that can be |
3 | // found in the LICENSE file. | ||||
4 | |||||
[email protected] | 3b63f8f4 | 2011-03-28 01:54:15 | [diff] [blame] | 5 | #include "base/memory/weak_ptr.h" |
[email protected] | 3a3d4747 | 2010-07-15 21:03:54 | [diff] [blame] | 6 | |
7 | namespace base { | ||||
8 | namespace internal { | ||||
9 | |||||
Hans Wennborg | 4cfa301 | 2017-08-08 03:33:38 | [diff] [blame] | 10 | WeakReference::Flag::Flag() : is_valid_(true) { |
[email protected] | ed3f6734 | 2013-05-29 08:04:32 | [diff] [blame] | 11 | // Flags only become bound when checked for validity, or invalidated, |
12 | // so that we can check that later validity/invalidation operations on | ||||
[email protected] | d52426c | 2013-07-30 19:26:40 | [diff] [blame] | 13 | // the same Flag take place on the same sequenced thread. |
Olivier Li | c3c5c50 | 2018-04-27 20:17:47 | [diff] [blame] | 14 | DETACH_FROM_SEQUENCE(sequence_checker_); |
[email protected] | 3a3d4747 | 2010-07-15 21:03:54 | [diff] [blame] | 15 | } |
16 | |||||
hans | 24046fd | 2017-06-29 22:07:42 | [diff] [blame] | 17 | void WeakReference::Flag::Invalidate() { |
18 | // The flag being invalidated with a single ref implies that there are no | ||||
Hans Wennborg | 4cfa301 | 2017-08-08 03:33:38 | [diff] [blame] | 19 | // weak pointers in existence. Allow deletion on other thread in this case. |
Olivier Li | c3c5c50 | 2018-04-27 20:17:47 | [diff] [blame] | 20 | #if DCHECK_IS_ON() |
hans | 24046fd | 2017-06-29 22:07:42 | [diff] [blame] | 21 | DCHECK(sequence_checker_.CalledOnValidSequence() || HasOneRef()) |
22 | << "WeakPtrs must be invalidated on the same sequenced thread."; | ||||
Olivier Li | c3c5c50 | 2018-04-27 20:17:47 | [diff] [blame] | 23 | #endif |
Hans Wennborg | 4cfa301 | 2017-08-08 03:33:38 | [diff] [blame] | 24 | is_valid_ = false; |
[email protected] | 6aacd8d | 2011-03-10 19:56:53 | [diff] [blame] | 25 | } |
26 | |||||
Hans Wennborg | 4cfa301 | 2017-08-08 03:33:38 | [diff] [blame] | 27 | bool WeakReference::Flag::IsValid() const { |
Olivier Li | c3c5c50 | 2018-04-27 20:17:47 | [diff] [blame] | 28 | DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_) |
Hans Wennborg | 4cfa301 | 2017-08-08 03:33:38 | [diff] [blame] | 29 | << "WeakPtrs must be checked on the same sequenced thread."; |
30 | return is_valid_; | ||||
[email protected] | 20136647 | 2010-07-16 17:22:49 | [diff] [blame] | 31 | } |
32 | |||||
Chris Watkins | bb7211c | 2017-11-29 07:16:38 | [diff] [blame] | 33 | WeakReference::Flag::~Flag() = default; |
Hans Wennborg | 4cfa301 | 2017-08-08 03:33:38 | [diff] [blame] | 34 | |
Chris Watkins | bb7211c | 2017-11-29 07:16:38 | [diff] [blame] | 35 | WeakReference::WeakReference() = default; |
Hans Wennborg | 4cfa301 | 2017-08-08 03:33:38 | [diff] [blame] | 36 | |
Wez | 7eedd9e | 2018-01-23 00:27:05 | [diff] [blame] | 37 | WeakReference::WeakReference(const scoped_refptr<Flag>& flag) : flag_(flag) {} |
Hans Wennborg | 4cfa301 | 2017-08-08 03:33:38 | [diff] [blame] | 38 | |
Chris Watkins | bb7211c | 2017-11-29 07:16:38 | [diff] [blame] | 39 | WeakReference::~WeakReference() = default; |
Hans Wennborg | 4cfa301 | 2017-08-08 03:33:38 | [diff] [blame] | 40 | |
41 | WeakReference::WeakReference(WeakReference&& other) = default; | ||||
42 | |||||
mek | 7901681 | 2016-06-24 21:29:04 | [diff] [blame] | 43 | WeakReference::WeakReference(const WeakReference& other) = default; |
44 | |||||
Wez | 7eedd9e | 2018-01-23 00:27:05 | [diff] [blame] | 45 | bool WeakReference::is_valid() const { |
46 | return flag_ && flag_->IsValid(); | ||||
47 | } | ||||
Hans Wennborg | 4cfa301 | 2017-08-08 03:33:38 | [diff] [blame] | 48 | |
Chris Watkins | bb7211c | 2017-11-29 07:16:38 | [diff] [blame] | 49 | WeakReferenceOwner::WeakReferenceOwner() = default; |
[email protected] | 3a3d4747 | 2010-07-15 21:03:54 | [diff] [blame] | 50 | |
51 | WeakReferenceOwner::~WeakReferenceOwner() { | ||||
52 | Invalidate(); | ||||
53 | } | ||||
54 | |||||
55 | WeakReference WeakReferenceOwner::GetRef() const { | ||||
[email protected] | ed3f6734 | 2013-05-29 08:04:32 | [diff] [blame] | 56 | // If we hold the last reference to the Flag then create a new one. |
[email protected] | 1edefc4 | 2011-08-26 17:32:29 | [diff] [blame] | 57 | if (!HasRefs()) |
58 | flag_ = new WeakReference::Flag(); | ||||
[email protected] | ed3f6734 | 2013-05-29 08:04:32 | [diff] [blame] | 59 | |
Wez | 7eedd9e | 2018-01-23 00:27:05 | [diff] [blame] | 60 | return WeakReference(flag_); |
[email protected] | 3a3d4747 | 2010-07-15 21:03:54 | [diff] [blame] | 61 | } |
62 | |||||
63 | void WeakReferenceOwner::Invalidate() { | ||||
Wez | 7eedd9e | 2018-01-23 00:27:05 | [diff] [blame] | 64 | if (flag_) { |
hans | 24046fd | 2017-06-29 22:07:42 | [diff] [blame] | 65 | flag_->Invalidate(); |
Ivan Kotenkov | a16212a5 | 2017-11-08 12:37:33 | [diff] [blame] | 66 | flag_ = nullptr; |
hans | 24046fd | 2017-06-29 22:07:42 | [diff] [blame] | 67 | } |
[email protected] | 3a3d4747 | 2010-07-15 21:03:54 | [diff] [blame] | 68 | } |
69 | |||||
Olivier Li | c3c5c50 | 2018-04-27 20:17:47 | [diff] [blame] | 70 | WeakPtrBase::WeakPtrBase() = default; |
[email protected] | 3a3d4747 | 2010-07-15 21:03:54 | [diff] [blame] | 71 | |
Chris Watkins | bb7211c | 2017-11-29 07:16:38 | [diff] [blame] | 72 | WeakPtrBase::~WeakPtrBase() = default; |
[email protected] | 3a3d4747 | 2010-07-15 21:03:54 | [diff] [blame] | 73 | |
hans | cc65b299 | 2017-06-29 20:35:28 | [diff] [blame] | 74 | WeakPtrBase::WeakPtrBase(const WeakReference& ref, uintptr_t ptr) |
75 | : ref_(ref), ptr_(ptr) {} | ||||
[email protected] | 20136647 | 2010-07-16 17:22:49 | [diff] [blame] | 76 | |
hans | d2a722f | 2017-06-28 21:12:54 | [diff] [blame] | 77 | WeakPtrFactoryBase::WeakPtrFactoryBase(uintptr_t ptr) : ptr_(ptr) {} |
78 | |||||
79 | WeakPtrFactoryBase::~WeakPtrFactoryBase() { | ||||
80 | ptr_ = 0; | ||||
81 | } | ||||
82 | |||||
[email protected] | 3a3d4747 | 2010-07-15 21:03:54 | [diff] [blame] | 83 | } // namespace internal |
84 | } // namespace base |