1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker // Weak pointers are pointers to an object that do not affect its lifetime, 6*6777b538SAndroid Build Coastguard Worker // and which may be invalidated (i.e. reset to nullptr) by the object, or its 7*6777b538SAndroid Build Coastguard Worker // owner, at any time, most commonly when the object is about to be deleted. 8*6777b538SAndroid Build Coastguard Worker 9*6777b538SAndroid Build Coastguard Worker // Weak pointers are useful when an object needs to be accessed safely by one 10*6777b538SAndroid Build Coastguard Worker // or more objects other than its owner, and those callers can cope with the 11*6777b538SAndroid Build Coastguard Worker // object vanishing and e.g. tasks posted to it being silently dropped. 12*6777b538SAndroid Build Coastguard Worker // Reference-counting such an object would complicate the ownership graph and 13*6777b538SAndroid Build Coastguard Worker // make it harder to reason about the object's lifetime. 14*6777b538SAndroid Build Coastguard Worker 15*6777b538SAndroid Build Coastguard Worker // EXAMPLE: 16*6777b538SAndroid Build Coastguard Worker // 17*6777b538SAndroid Build Coastguard Worker // class Controller { 18*6777b538SAndroid Build Coastguard Worker // public: 19*6777b538SAndroid Build Coastguard Worker // void SpawnWorker() { Worker::StartNew(weak_factory_.GetWeakPtr()); } 20*6777b538SAndroid Build Coastguard Worker // void WorkComplete(const Result& result) { ... } 21*6777b538SAndroid Build Coastguard Worker // private: 22*6777b538SAndroid Build Coastguard Worker // // Member variables should appear before the WeakPtrFactory, to ensure 23*6777b538SAndroid Build Coastguard Worker // // that any WeakPtrs to Controller are invalidated before its members 24*6777b538SAndroid Build Coastguard Worker // // variable's destructors are executed, rendering them invalid. 25*6777b538SAndroid Build Coastguard Worker // WeakPtrFactory<Controller> weak_factory_{this}; 26*6777b538SAndroid Build Coastguard Worker // }; 27*6777b538SAndroid Build Coastguard Worker // 28*6777b538SAndroid Build Coastguard Worker // class Worker { 29*6777b538SAndroid Build Coastguard Worker // public: 30*6777b538SAndroid Build Coastguard Worker // static void StartNew(WeakPtr<Controller> controller) { 31*6777b538SAndroid Build Coastguard Worker // // Move WeakPtr when possible to avoid atomic refcounting churn on its 32*6777b538SAndroid Build Coastguard Worker // // internal state. 33*6777b538SAndroid Build Coastguard Worker // Worker* worker = new Worker(std::move(controller)); 34*6777b538SAndroid Build Coastguard Worker // // Kick off asynchronous processing... 35*6777b538SAndroid Build Coastguard Worker // } 36*6777b538SAndroid Build Coastguard Worker // private: 37*6777b538SAndroid Build Coastguard Worker // Worker(WeakPtr<Controller> controller) 38*6777b538SAndroid Build Coastguard Worker // : controller_(std::move(controller)) {} 39*6777b538SAndroid Build Coastguard Worker // void DidCompleteAsynchronousProcessing(const Result& result) { 40*6777b538SAndroid Build Coastguard Worker // if (controller_) 41*6777b538SAndroid Build Coastguard Worker // controller_->WorkComplete(result); 42*6777b538SAndroid Build Coastguard Worker // } 43*6777b538SAndroid Build Coastguard Worker // WeakPtr<Controller> controller_; 44*6777b538SAndroid Build Coastguard Worker // }; 45*6777b538SAndroid Build Coastguard Worker // 46*6777b538SAndroid Build Coastguard Worker // With this implementation a caller may use SpawnWorker() to dispatch multiple 47*6777b538SAndroid Build Coastguard Worker // Workers and subsequently delete the Controller, without waiting for all 48*6777b538SAndroid Build Coastguard Worker // Workers to have completed. 49*6777b538SAndroid Build Coastguard Worker 50*6777b538SAndroid Build Coastguard Worker // ------------------------- IMPORTANT: Thread-safety ------------------------- 51*6777b538SAndroid Build Coastguard Worker 52*6777b538SAndroid Build Coastguard Worker // Weak pointers may be passed safely between sequences, but must always be 53*6777b538SAndroid Build Coastguard Worker // dereferenced and invalidated on the same SequencedTaskRunner otherwise 54*6777b538SAndroid Build Coastguard Worker // checking the pointer would be racey. 55*6777b538SAndroid Build Coastguard Worker // 56*6777b538SAndroid Build Coastguard Worker // To ensure correct use, the first time a WeakPtr issued by a WeakPtrFactory 57*6777b538SAndroid Build Coastguard Worker // is dereferenced, the factory and its WeakPtrs become bound to the calling 58*6777b538SAndroid Build Coastguard Worker // sequence or current SequencedWorkerPool token, and cannot be dereferenced or 59*6777b538SAndroid Build Coastguard Worker // invalidated on any other task runner. Bound WeakPtrs can still be handed 60*6777b538SAndroid Build Coastguard Worker // off to other task runners, e.g. to use to post tasks back to object on the 61*6777b538SAndroid Build Coastguard Worker // bound sequence. 62*6777b538SAndroid Build Coastguard Worker // 63*6777b538SAndroid Build Coastguard Worker // If all WeakPtr objects are destroyed or invalidated then the factory is 64*6777b538SAndroid Build Coastguard Worker // unbound from the SequencedTaskRunner/Thread. The WeakPtrFactory may then be 65*6777b538SAndroid Build Coastguard Worker // destroyed, or new WeakPtr objects may be used, from a different sequence. 66*6777b538SAndroid Build Coastguard Worker // 67*6777b538SAndroid Build Coastguard Worker // Thus, at least one WeakPtr object must exist and have been dereferenced on 68*6777b538SAndroid Build Coastguard Worker // the correct sequence to enforce that other WeakPtr objects will enforce they 69*6777b538SAndroid Build Coastguard Worker // are used on the desired sequence. 70*6777b538SAndroid Build Coastguard Worker 71*6777b538SAndroid Build Coastguard Worker #ifndef BASE_MEMORY_WEAK_PTR_H_ 72*6777b538SAndroid Build Coastguard Worker #define BASE_MEMORY_WEAK_PTR_H_ 73*6777b538SAndroid Build Coastguard Worker 74*6777b538SAndroid Build Coastguard Worker #include <cstddef> 75*6777b538SAndroid Build Coastguard Worker #include <type_traits> 76*6777b538SAndroid Build Coastguard Worker #include <utility> 77*6777b538SAndroid Build Coastguard Worker 78*6777b538SAndroid Build Coastguard Worker #include "base/base_export.h" 79*6777b538SAndroid Build Coastguard Worker #include "base/check.h" 80*6777b538SAndroid Build Coastguard Worker #include "base/compiler_specific.h" 81*6777b538SAndroid Build Coastguard Worker #include "base/dcheck_is_on.h" 82*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h" 83*6777b538SAndroid Build Coastguard Worker #include "base/memory/ref_counted.h" 84*6777b538SAndroid Build Coastguard Worker #include "base/memory/safe_ref_traits.h" 85*6777b538SAndroid Build Coastguard Worker #include "base/sequence_checker.h" 86*6777b538SAndroid Build Coastguard Worker #include "base/synchronization/atomic_flag.h" 87*6777b538SAndroid Build Coastguard Worker 88*6777b538SAndroid Build Coastguard Worker namespace performance_manager { 89*6777b538SAndroid Build Coastguard Worker class FrameNodeImpl; 90*6777b538SAndroid Build Coastguard Worker class PageNodeImpl; 91*6777b538SAndroid Build Coastguard Worker class ProcessNodeImpl; 92*6777b538SAndroid Build Coastguard Worker class WorkerNodeImpl; 93*6777b538SAndroid Build Coastguard Worker } // namespace performance_manager 94*6777b538SAndroid Build Coastguard Worker 95*6777b538SAndroid Build Coastguard Worker namespace base { 96*6777b538SAndroid Build Coastguard Worker 97*6777b538SAndroid Build Coastguard Worker namespace sequence_manager::internal { 98*6777b538SAndroid Build Coastguard Worker class TaskQueueImpl; 99*6777b538SAndroid Build Coastguard Worker } 100*6777b538SAndroid Build Coastguard Worker 101*6777b538SAndroid Build Coastguard Worker template <typename T> class SupportsWeakPtr; 102*6777b538SAndroid Build Coastguard Worker template <typename T> class WeakPtr; 103*6777b538SAndroid Build Coastguard Worker 104*6777b538SAndroid Build Coastguard Worker namespace internal { 105*6777b538SAndroid Build Coastguard Worker // These classes are part of the WeakPtr implementation. 106*6777b538SAndroid Build Coastguard Worker // DO NOT USE THESE CLASSES DIRECTLY YOURSELF. 107*6777b538SAndroid Build Coastguard Worker 108*6777b538SAndroid Build Coastguard Worker class BASE_EXPORT TRIVIAL_ABI WeakReference { 109*6777b538SAndroid Build Coastguard Worker public: 110*6777b538SAndroid Build Coastguard Worker // Although Flag is bound to a specific SequencedTaskRunner, it may be 111*6777b538SAndroid Build Coastguard Worker // deleted from another via base::WeakPtr::~WeakPtr(). 112*6777b538SAndroid Build Coastguard Worker class BASE_EXPORT Flag : public RefCountedThreadSafe<Flag> { 113*6777b538SAndroid Build Coastguard Worker public: 114*6777b538SAndroid Build Coastguard Worker Flag(); 115*6777b538SAndroid Build Coastguard Worker 116*6777b538SAndroid Build Coastguard Worker void Invalidate(); 117*6777b538SAndroid Build Coastguard Worker bool IsValid() const; 118*6777b538SAndroid Build Coastguard Worker 119*6777b538SAndroid Build Coastguard Worker bool MaybeValid() const; 120*6777b538SAndroid Build Coastguard Worker 121*6777b538SAndroid Build Coastguard Worker #if DCHECK_IS_ON() 122*6777b538SAndroid Build Coastguard Worker void DetachFromSequence(); 123*6777b538SAndroid Build Coastguard Worker void BindToCurrentSequence(); 124*6777b538SAndroid Build Coastguard Worker #endif 125*6777b538SAndroid Build Coastguard Worker 126*6777b538SAndroid Build Coastguard Worker private: 127*6777b538SAndroid Build Coastguard Worker friend class base::RefCountedThreadSafe<Flag>; 128*6777b538SAndroid Build Coastguard Worker 129*6777b538SAndroid Build Coastguard Worker ~Flag(); 130*6777b538SAndroid Build Coastguard Worker 131*6777b538SAndroid Build Coastguard Worker SEQUENCE_CHECKER(sequence_checker_); 132*6777b538SAndroid Build Coastguard Worker AtomicFlag invalidated_; 133*6777b538SAndroid Build Coastguard Worker }; 134*6777b538SAndroid Build Coastguard Worker 135*6777b538SAndroid Build Coastguard Worker WeakReference(); 136*6777b538SAndroid Build Coastguard Worker explicit WeakReference(const scoped_refptr<Flag>& flag); 137*6777b538SAndroid Build Coastguard Worker ~WeakReference(); 138*6777b538SAndroid Build Coastguard Worker 139*6777b538SAndroid Build Coastguard Worker WeakReference(const WeakReference& other); 140*6777b538SAndroid Build Coastguard Worker WeakReference& operator=(const WeakReference& other); 141*6777b538SAndroid Build Coastguard Worker 142*6777b538SAndroid Build Coastguard Worker WeakReference(WeakReference&& other) noexcept; 143*6777b538SAndroid Build Coastguard Worker WeakReference& operator=(WeakReference&& other) noexcept; 144*6777b538SAndroid Build Coastguard Worker 145*6777b538SAndroid Build Coastguard Worker void Reset(); 146*6777b538SAndroid Build Coastguard Worker // Returns whether the WeakReference is valid, meaning the WeakPtrFactory has 147*6777b538SAndroid Build Coastguard Worker // not invalidated the pointer. Unlike, RefIsMaybeValid(), this may only be 148*6777b538SAndroid Build Coastguard Worker // called from the same sequence as where the WeakPtr was created. 149*6777b538SAndroid Build Coastguard Worker bool IsValid() const; 150*6777b538SAndroid Build Coastguard Worker // Returns false if the WeakReference is confirmed to be invalid. This call is 151*6777b538SAndroid Build Coastguard Worker // safe to make from any thread, e.g. to optimize away unnecessary work, but 152*6777b538SAndroid Build Coastguard Worker // RefIsValid() must always be called, on the correct sequence, before 153*6777b538SAndroid Build Coastguard Worker // actually using the pointer. 154*6777b538SAndroid Build Coastguard Worker // 155*6777b538SAndroid Build Coastguard Worker // Warning: as with any object, this call is only thread-safe if the WeakPtr 156*6777b538SAndroid Build Coastguard Worker // instance isn't being re-assigned or reset() racily with this call. 157*6777b538SAndroid Build Coastguard Worker bool MaybeValid() const; 158*6777b538SAndroid Build Coastguard Worker 159*6777b538SAndroid Build Coastguard Worker private: 160*6777b538SAndroid Build Coastguard Worker scoped_refptr<const Flag> flag_; 161*6777b538SAndroid Build Coastguard Worker }; 162*6777b538SAndroid Build Coastguard Worker 163*6777b538SAndroid Build Coastguard Worker class BASE_EXPORT WeakReferenceOwner { 164*6777b538SAndroid Build Coastguard Worker public: 165*6777b538SAndroid Build Coastguard Worker WeakReferenceOwner(); 166*6777b538SAndroid Build Coastguard Worker ~WeakReferenceOwner(); 167*6777b538SAndroid Build Coastguard Worker 168*6777b538SAndroid Build Coastguard Worker WeakReference GetRef() const; 169*6777b538SAndroid Build Coastguard Worker HasRefs()170*6777b538SAndroid Build Coastguard Worker bool HasRefs() const { return !flag_->HasOneRef(); } 171*6777b538SAndroid Build Coastguard Worker 172*6777b538SAndroid Build Coastguard Worker void Invalidate(); 173*6777b538SAndroid Build Coastguard Worker void BindToCurrentSequence(); 174*6777b538SAndroid Build Coastguard Worker 175*6777b538SAndroid Build Coastguard Worker private: 176*6777b538SAndroid Build Coastguard Worker scoped_refptr<WeakReference::Flag> flag_; 177*6777b538SAndroid Build Coastguard Worker }; 178*6777b538SAndroid Build Coastguard Worker 179*6777b538SAndroid Build Coastguard Worker // This class provides a common implementation of common functions that would 180*6777b538SAndroid Build Coastguard Worker // otherwise get instantiated separately for each distinct instantiation of 181*6777b538SAndroid Build Coastguard Worker // SupportsWeakPtr<>. 182*6777b538SAndroid Build Coastguard Worker class SupportsWeakPtrBase { 183*6777b538SAndroid Build Coastguard Worker public: 184*6777b538SAndroid Build Coastguard Worker // A safe static downcast of a WeakPtr<Base> to WeakPtr<Derived>. This 185*6777b538SAndroid Build Coastguard Worker // conversion will only compile if Derived singly inherits from 186*6777b538SAndroid Build Coastguard Worker // SupportsWeakPtr<Base>. See base::AsWeakPtr() below for a helper function 187*6777b538SAndroid Build Coastguard Worker // that makes calling this easier. 188*6777b538SAndroid Build Coastguard Worker // 189*6777b538SAndroid Build Coastguard Worker // Precondition: t != nullptr 190*6777b538SAndroid Build Coastguard Worker template<typename Derived> StaticAsWeakPtr(Derived * t)191*6777b538SAndroid Build Coastguard Worker static WeakPtr<Derived> StaticAsWeakPtr(Derived* t) { 192*6777b538SAndroid Build Coastguard Worker static_assert(std::is_base_of_v<internal::SupportsWeakPtrBase, Derived>, 193*6777b538SAndroid Build Coastguard Worker "AsWeakPtr argument must inherit from SupportsWeakPtr"); 194*6777b538SAndroid Build Coastguard Worker using Base = typename decltype(ExtractSinglyInheritedBase(t))::Base; 195*6777b538SAndroid Build Coastguard Worker // Ensure SupportsWeakPtr<Base>::AsWeakPtr() is called even if the subclass 196*6777b538SAndroid Build Coastguard Worker // hides or overloads it. 197*6777b538SAndroid Build Coastguard Worker WeakPtr<Base> weak = static_cast<SupportsWeakPtr<Base>*>(t)->AsWeakPtr(); 198*6777b538SAndroid Build Coastguard Worker return WeakPtr<Derived>(weak.CloneWeakReference(), 199*6777b538SAndroid Build Coastguard Worker static_cast<Derived*>(weak.ptr_)); 200*6777b538SAndroid Build Coastguard Worker } 201*6777b538SAndroid Build Coastguard Worker 202*6777b538SAndroid Build Coastguard Worker private: 203*6777b538SAndroid Build Coastguard Worker // This class can only be instantiated if the constructor argument inherits 204*6777b538SAndroid Build Coastguard Worker // from SupportsWeakPtr<T> in exactly one way. 205*6777b538SAndroid Build Coastguard Worker template <typename T> 206*6777b538SAndroid Build Coastguard Worker struct ExtractSinglyInheritedBase; 207*6777b538SAndroid Build Coastguard Worker template <typename T> 208*6777b538SAndroid Build Coastguard Worker struct ExtractSinglyInheritedBase<SupportsWeakPtr<T>> { 209*6777b538SAndroid Build Coastguard Worker using Base = T; 210*6777b538SAndroid Build Coastguard Worker explicit ExtractSinglyInheritedBase(SupportsWeakPtr<T>*); 211*6777b538SAndroid Build Coastguard Worker }; 212*6777b538SAndroid Build Coastguard Worker template <typename T> 213*6777b538SAndroid Build Coastguard Worker ExtractSinglyInheritedBase(SupportsWeakPtr<T>*) 214*6777b538SAndroid Build Coastguard Worker -> ExtractSinglyInheritedBase<SupportsWeakPtr<T>>; 215*6777b538SAndroid Build Coastguard Worker }; 216*6777b538SAndroid Build Coastguard Worker 217*6777b538SAndroid Build Coastguard Worker // Forward declaration from safe_ptr.h. 218*6777b538SAndroid Build Coastguard Worker template <typename T> 219*6777b538SAndroid Build Coastguard Worker SafeRef<T> MakeSafeRefFromWeakPtrInternals(internal::WeakReference&& ref, 220*6777b538SAndroid Build Coastguard Worker T* ptr); 221*6777b538SAndroid Build Coastguard Worker 222*6777b538SAndroid Build Coastguard Worker } // namespace internal 223*6777b538SAndroid Build Coastguard Worker 224*6777b538SAndroid Build Coastguard Worker template <typename T> class WeakPtrFactory; 225*6777b538SAndroid Build Coastguard Worker 226*6777b538SAndroid Build Coastguard Worker // The WeakPtr class holds a weak reference to |T*|. 227*6777b538SAndroid Build Coastguard Worker // 228*6777b538SAndroid Build Coastguard Worker // This class is designed to be used like a normal pointer. You should always 229*6777b538SAndroid Build Coastguard Worker // null-test an object of this class before using it or invoking a method that 230*6777b538SAndroid Build Coastguard Worker // may result in the underlying object being destroyed. 231*6777b538SAndroid Build Coastguard Worker // 232*6777b538SAndroid Build Coastguard Worker // EXAMPLE: 233*6777b538SAndroid Build Coastguard Worker // 234*6777b538SAndroid Build Coastguard Worker // class Foo { ... }; 235*6777b538SAndroid Build Coastguard Worker // WeakPtr<Foo> foo; 236*6777b538SAndroid Build Coastguard Worker // if (foo) 237*6777b538SAndroid Build Coastguard Worker // foo->method(); 238*6777b538SAndroid Build Coastguard Worker // 239*6777b538SAndroid Build Coastguard Worker template <typename T> 240*6777b538SAndroid Build Coastguard Worker class TRIVIAL_ABI WeakPtr { 241*6777b538SAndroid Build Coastguard Worker public: 242*6777b538SAndroid Build Coastguard Worker WeakPtr() = default; 243*6777b538SAndroid Build Coastguard Worker // NOLINTNEXTLINE(google-explicit-constructor) 244*6777b538SAndroid Build Coastguard Worker WeakPtr(std::nullptr_t) {} 245*6777b538SAndroid Build Coastguard Worker 246*6777b538SAndroid Build Coastguard Worker // Allow conversion from U to T provided U "is a" T. Note that this 247*6777b538SAndroid Build Coastguard Worker // is separate from the (implicit) copy and move constructors. 248*6777b538SAndroid Build Coastguard Worker template <typename U> 249*6777b538SAndroid Build Coastguard Worker requires(std::convertible_to<U*, T*>) 250*6777b538SAndroid Build Coastguard Worker // NOLINTNEXTLINE(google-explicit-constructor) 251*6777b538SAndroid Build Coastguard Worker WeakPtr(const WeakPtr<U>& other) : ref_(other.ref_), ptr_(other.ptr_) {} 252*6777b538SAndroid Build Coastguard Worker template <typename U> 253*6777b538SAndroid Build Coastguard Worker requires(std::convertible_to<U*, T*>) 254*6777b538SAndroid Build Coastguard Worker // NOLINTNEXTLINE(google-explicit-constructor) 255*6777b538SAndroid Build Coastguard Worker WeakPtr& operator=(const WeakPtr<U>& other) { 256*6777b538SAndroid Build Coastguard Worker ref_ = other.ref_; 257*6777b538SAndroid Build Coastguard Worker ptr_ = other.ptr_; 258*6777b538SAndroid Build Coastguard Worker return *this; 259*6777b538SAndroid Build Coastguard Worker } 260*6777b538SAndroid Build Coastguard Worker 261*6777b538SAndroid Build Coastguard Worker template <typename U> 262*6777b538SAndroid Build Coastguard Worker requires(std::convertible_to<U*, T*>) 263*6777b538SAndroid Build Coastguard Worker // NOLINTNEXTLINE(google-explicit-constructor) 264*6777b538SAndroid Build Coastguard Worker WeakPtr(WeakPtr<U>&& other) 265*6777b538SAndroid Build Coastguard Worker : ref_(std::move(other.ref_)), ptr_(std::move(other.ptr_)) {} 266*6777b538SAndroid Build Coastguard Worker template <typename U> 267*6777b538SAndroid Build Coastguard Worker requires(std::convertible_to<U*, T*>) 268*6777b538SAndroid Build Coastguard Worker // NOLINTNEXTLINE(google-explicit-constructor) 269*6777b538SAndroid Build Coastguard Worker WeakPtr& operator=(WeakPtr<U>&& other) { 270*6777b538SAndroid Build Coastguard Worker ref_ = std::move(other.ref_); 271*6777b538SAndroid Build Coastguard Worker ptr_ = std::move(other.ptr_); 272*6777b538SAndroid Build Coastguard Worker return *this; 273*6777b538SAndroid Build Coastguard Worker } 274*6777b538SAndroid Build Coastguard Worker 275*6777b538SAndroid Build Coastguard Worker T* get() const { return ref_.IsValid() ? ptr_ : nullptr; } 276*6777b538SAndroid Build Coastguard Worker 277*6777b538SAndroid Build Coastguard Worker // Provide access to the underlying T as a reference. Will CHECK() if the T 278*6777b538SAndroid Build Coastguard Worker // pointee is no longer alive. 279*6777b538SAndroid Build Coastguard Worker T& operator*() const { 280*6777b538SAndroid Build Coastguard Worker CHECK(ref_.IsValid()); 281*6777b538SAndroid Build Coastguard Worker return *ptr_; 282*6777b538SAndroid Build Coastguard Worker } 283*6777b538SAndroid Build Coastguard Worker 284*6777b538SAndroid Build Coastguard Worker // Used to call methods on the underlying T. Will CHECK() if the T pointee is 285*6777b538SAndroid Build Coastguard Worker // no longer alive. 286*6777b538SAndroid Build Coastguard Worker T* operator->() const { 287*6777b538SAndroid Build Coastguard Worker CHECK(ref_.IsValid()); 288*6777b538SAndroid Build Coastguard Worker return ptr_; 289*6777b538SAndroid Build Coastguard Worker } 290*6777b538SAndroid Build Coastguard Worker 291*6777b538SAndroid Build Coastguard Worker // Allow conditionals to test validity, e.g. if (weak_ptr) {...}; 292*6777b538SAndroid Build Coastguard Worker explicit operator bool() const { return get() != nullptr; } 293*6777b538SAndroid Build Coastguard Worker 294*6777b538SAndroid Build Coastguard Worker // Resets the WeakPtr to hold nothing. 295*6777b538SAndroid Build Coastguard Worker // 296*6777b538SAndroid Build Coastguard Worker // The `get()` method will return `nullptr` thereafter, and `MaybeValid()` 297*6777b538SAndroid Build Coastguard Worker // will be `false`. 298*6777b538SAndroid Build Coastguard Worker void reset() { 299*6777b538SAndroid Build Coastguard Worker ref_.Reset(); 300*6777b538SAndroid Build Coastguard Worker ptr_ = nullptr; 301*6777b538SAndroid Build Coastguard Worker } 302*6777b538SAndroid Build Coastguard Worker 303*6777b538SAndroid Build Coastguard Worker // Do not use this method. Almost all callers should instead use operator 304*6777b538SAndroid Build Coastguard Worker // bool(). 305*6777b538SAndroid Build Coastguard Worker // 306*6777b538SAndroid Build Coastguard Worker // There are a few rare cases where the caller intentionally needs to check 307*6777b538SAndroid Build Coastguard Worker // validity of a base::WeakPtr on a sequence different from the bound sequence 308*6777b538SAndroid Build Coastguard Worker // as an unavoidable performance optimization. This is the only valid use-case 309*6777b538SAndroid Build Coastguard Worker // for this method. See 310*6777b538SAndroid Build Coastguard Worker // https://docs.google.com/document/d/1IGzq9Nx69GS_2iynGmPWo5sFAD2DcCyBY1zIvZwF7k8 311*6777b538SAndroid Build Coastguard Worker // for details. 312*6777b538SAndroid Build Coastguard Worker // 313*6777b538SAndroid Build Coastguard Worker // Returns false if the WeakPtr is confirmed to be invalid. This call is safe 314*6777b538SAndroid Build Coastguard Worker // to make from any thread, e.g. to optimize away unnecessary work, but 315*6777b538SAndroid Build Coastguard Worker // RefIsValid() must always be called, on the correct sequence, before 316*6777b538SAndroid Build Coastguard Worker // actually using the pointer. 317*6777b538SAndroid Build Coastguard Worker // 318*6777b538SAndroid Build Coastguard Worker // Warning: as with any object, this call is only thread-safe if the WeakPtr 319*6777b538SAndroid Build Coastguard Worker // instance isn't being re-assigned or reset() racily with this call. 320*6777b538SAndroid Build Coastguard Worker bool MaybeValid() const { return ref_.MaybeValid(); } 321*6777b538SAndroid Build Coastguard Worker 322*6777b538SAndroid Build Coastguard Worker // Returns whether the object |this| points to has been invalidated. This can 323*6777b538SAndroid Build Coastguard Worker // be used to distinguish a WeakPtr to a destroyed object from one that has 324*6777b538SAndroid Build Coastguard Worker // been explicitly set to null. 325*6777b538SAndroid Build Coastguard Worker bool WasInvalidated() const { return ptr_ && !ref_.IsValid(); } 326*6777b538SAndroid Build Coastguard Worker 327*6777b538SAndroid Build Coastguard Worker private: 328*6777b538SAndroid Build Coastguard Worker friend class internal::SupportsWeakPtrBase; 329*6777b538SAndroid Build Coastguard Worker template <typename U> friend class WeakPtr; 330*6777b538SAndroid Build Coastguard Worker friend class SupportsWeakPtr<T>; 331*6777b538SAndroid Build Coastguard Worker friend class WeakPtrFactory<T>; 332*6777b538SAndroid Build Coastguard Worker friend class WeakPtrFactory<std::remove_const_t<T>>; 333*6777b538SAndroid Build Coastguard Worker 334*6777b538SAndroid Build Coastguard Worker WeakPtr(internal::WeakReference&& ref, T* ptr) 335*6777b538SAndroid Build Coastguard Worker : ref_(std::move(ref)), ptr_(ptr) { 336*6777b538SAndroid Build Coastguard Worker DCHECK(ptr); 337*6777b538SAndroid Build Coastguard Worker } 338*6777b538SAndroid Build Coastguard Worker 339*6777b538SAndroid Build Coastguard Worker internal::WeakReference CloneWeakReference() const { return ref_; } 340*6777b538SAndroid Build Coastguard Worker 341*6777b538SAndroid Build Coastguard Worker internal::WeakReference ref_; 342*6777b538SAndroid Build Coastguard Worker 343*6777b538SAndroid Build Coastguard Worker // This pointer is only valid when ref_.is_valid() is true. Otherwise, its 344*6777b538SAndroid Build Coastguard Worker // value is undefined (as opposed to nullptr). The pointer is allowed to 345*6777b538SAndroid Build Coastguard Worker // dangle as we verify its liveness through `ref_` before allowing access to 346*6777b538SAndroid Build Coastguard Worker // the pointee. We don't use raw_ptr<T> here to prevent WeakPtr from keeping 347*6777b538SAndroid Build Coastguard Worker // the memory allocation in quarantine, as it can't be accessed through the 348*6777b538SAndroid Build Coastguard Worker // WeakPtr. 349*6777b538SAndroid Build Coastguard Worker RAW_PTR_EXCLUSION T* ptr_ = nullptr; 350*6777b538SAndroid Build Coastguard Worker }; 351*6777b538SAndroid Build Coastguard Worker 352*6777b538SAndroid Build Coastguard Worker // Allow callers to compare WeakPtrs against nullptr to test validity. 353*6777b538SAndroid Build Coastguard Worker template <class T> 354*6777b538SAndroid Build Coastguard Worker bool operator!=(const WeakPtr<T>& weak_ptr, std::nullptr_t) { 355*6777b538SAndroid Build Coastguard Worker return !(weak_ptr == nullptr); 356*6777b538SAndroid Build Coastguard Worker } 357*6777b538SAndroid Build Coastguard Worker template <class T> 358*6777b538SAndroid Build Coastguard Worker bool operator!=(std::nullptr_t, const WeakPtr<T>& weak_ptr) { 359*6777b538SAndroid Build Coastguard Worker return weak_ptr != nullptr; 360*6777b538SAndroid Build Coastguard Worker } 361*6777b538SAndroid Build Coastguard Worker template <class T> 362*6777b538SAndroid Build Coastguard Worker bool operator==(const WeakPtr<T>& weak_ptr, std::nullptr_t) { 363*6777b538SAndroid Build Coastguard Worker return weak_ptr.get() == nullptr; 364*6777b538SAndroid Build Coastguard Worker } 365*6777b538SAndroid Build Coastguard Worker template <class T> 366*6777b538SAndroid Build Coastguard Worker bool operator==(std::nullptr_t, const WeakPtr<T>& weak_ptr) { 367*6777b538SAndroid Build Coastguard Worker return weak_ptr == nullptr; 368*6777b538SAndroid Build Coastguard Worker } 369*6777b538SAndroid Build Coastguard Worker 370*6777b538SAndroid Build Coastguard Worker namespace internal { 371*6777b538SAndroid Build Coastguard Worker class BASE_EXPORT WeakPtrFactoryBase { 372*6777b538SAndroid Build Coastguard Worker protected: 373*6777b538SAndroid Build Coastguard Worker WeakPtrFactoryBase(uintptr_t ptr); 374*6777b538SAndroid Build Coastguard Worker ~WeakPtrFactoryBase(); 375*6777b538SAndroid Build Coastguard Worker internal::WeakReferenceOwner weak_reference_owner_; 376*6777b538SAndroid Build Coastguard Worker uintptr_t ptr_; 377*6777b538SAndroid Build Coastguard Worker }; 378*6777b538SAndroid Build Coastguard Worker } // namespace internal 379*6777b538SAndroid Build Coastguard Worker 380*6777b538SAndroid Build Coastguard Worker namespace subtle { 381*6777b538SAndroid Build Coastguard Worker 382*6777b538SAndroid Build Coastguard Worker // Restricts access to WeakPtrFactory::BindToCurrentSequence() to authorized 383*6777b538SAndroid Build Coastguard Worker // callers. 384*6777b538SAndroid Build Coastguard Worker class BASE_EXPORT BindWeakPtrFactoryPassKey { 385*6777b538SAndroid Build Coastguard Worker private: 386*6777b538SAndroid Build Coastguard Worker // Avoid =default to disallow creation by uniform initialization. 387*6777b538SAndroid Build Coastguard Worker BindWeakPtrFactoryPassKey() {} 388*6777b538SAndroid Build Coastguard Worker 389*6777b538SAndroid Build Coastguard Worker friend class BindWeakPtrFactoryForTesting; 390*6777b538SAndroid Build Coastguard Worker friend class performance_manager::FrameNodeImpl; 391*6777b538SAndroid Build Coastguard Worker friend class performance_manager::PageNodeImpl; 392*6777b538SAndroid Build Coastguard Worker friend class performance_manager::ProcessNodeImpl; 393*6777b538SAndroid Build Coastguard Worker friend class performance_manager::WorkerNodeImpl; 394*6777b538SAndroid Build Coastguard Worker friend class sequence_manager::internal::TaskQueueImpl; 395*6777b538SAndroid Build Coastguard Worker }; 396*6777b538SAndroid Build Coastguard Worker 397*6777b538SAndroid Build Coastguard Worker } // namespace subtle 398*6777b538SAndroid Build Coastguard Worker 399*6777b538SAndroid Build Coastguard Worker // A class may be composed of a WeakPtrFactory and thereby 400*6777b538SAndroid Build Coastguard Worker // control how it exposes weak pointers to itself. This is helpful if you only 401*6777b538SAndroid Build Coastguard Worker // need weak pointers within the implementation of a class. This class is also 402*6777b538SAndroid Build Coastguard Worker // useful when working with primitive types. For example, you could have a 403*6777b538SAndroid Build Coastguard Worker // WeakPtrFactory<bool> that is used to pass around a weak reference to a bool. 404*6777b538SAndroid Build Coastguard Worker template <class T> 405*6777b538SAndroid Build Coastguard Worker class WeakPtrFactory : public internal::WeakPtrFactoryBase { 406*6777b538SAndroid Build Coastguard Worker public: 407*6777b538SAndroid Build Coastguard Worker WeakPtrFactory() = delete; 408*6777b538SAndroid Build Coastguard Worker 409*6777b538SAndroid Build Coastguard Worker explicit WeakPtrFactory(T* ptr) 410*6777b538SAndroid Build Coastguard Worker : WeakPtrFactoryBase(reinterpret_cast<uintptr_t>(ptr)) {} 411*6777b538SAndroid Build Coastguard Worker 412*6777b538SAndroid Build Coastguard Worker WeakPtrFactory(const WeakPtrFactory&) = delete; 413*6777b538SAndroid Build Coastguard Worker WeakPtrFactory& operator=(const WeakPtrFactory&) = delete; 414*6777b538SAndroid Build Coastguard Worker 415*6777b538SAndroid Build Coastguard Worker ~WeakPtrFactory() = default; 416*6777b538SAndroid Build Coastguard Worker 417*6777b538SAndroid Build Coastguard Worker WeakPtr<const T> GetWeakPtr() const { 418*6777b538SAndroid Build Coastguard Worker return WeakPtr<const T>(weak_reference_owner_.GetRef(), 419*6777b538SAndroid Build Coastguard Worker reinterpret_cast<const T*>(ptr_)); 420*6777b538SAndroid Build Coastguard Worker } 421*6777b538SAndroid Build Coastguard Worker 422*6777b538SAndroid Build Coastguard Worker WeakPtr<T> GetWeakPtr() 423*6777b538SAndroid Build Coastguard Worker requires(!std::is_const_v<T>) 424*6777b538SAndroid Build Coastguard Worker { 425*6777b538SAndroid Build Coastguard Worker return WeakPtr<T>(weak_reference_owner_.GetRef(), 426*6777b538SAndroid Build Coastguard Worker reinterpret_cast<T*>(ptr_)); 427*6777b538SAndroid Build Coastguard Worker } 428*6777b538SAndroid Build Coastguard Worker 429*6777b538SAndroid Build Coastguard Worker WeakPtr<T> GetMutableWeakPtr() const 430*6777b538SAndroid Build Coastguard Worker requires(!std::is_const_v<T>) 431*6777b538SAndroid Build Coastguard Worker { 432*6777b538SAndroid Build Coastguard Worker return WeakPtr<T>(weak_reference_owner_.GetRef(), 433*6777b538SAndroid Build Coastguard Worker reinterpret_cast<T*>(ptr_)); 434*6777b538SAndroid Build Coastguard Worker } 435*6777b538SAndroid Build Coastguard Worker 436*6777b538SAndroid Build Coastguard Worker // Returns a smart pointer that is valid until the WeakPtrFactory is 437*6777b538SAndroid Build Coastguard Worker // invalidated. Unlike WeakPtr, this smart pointer cannot be null, and cannot 438*6777b538SAndroid Build Coastguard Worker // be checked to see if the WeakPtrFactory is invalidated. It's intended to 439*6777b538SAndroid Build Coastguard Worker // express that the pointer will not (intentionally) outlive the `T` object it 440*6777b538SAndroid Build Coastguard Worker // points to, and to crash safely in the case of a bug instead of causing a 441*6777b538SAndroid Build Coastguard Worker // use-after-free. This type provides an alternative to WeakPtr to prevent 442*6777b538SAndroid Build Coastguard Worker // use-after-free bugs without also introducing "fuzzy lifetimes" that can be 443*6777b538SAndroid Build Coastguard Worker // checked for at runtime. 444*6777b538SAndroid Build Coastguard Worker SafeRef<T> GetSafeRef() const { 445*6777b538SAndroid Build Coastguard Worker return internal::MakeSafeRefFromWeakPtrInternals( 446*6777b538SAndroid Build Coastguard Worker weak_reference_owner_.GetRef(), reinterpret_cast<T*>(ptr_)); 447*6777b538SAndroid Build Coastguard Worker } 448*6777b538SAndroid Build Coastguard Worker 449*6777b538SAndroid Build Coastguard Worker // Call this method to invalidate all existing weak pointers. 450*6777b538SAndroid Build Coastguard Worker void InvalidateWeakPtrs() { 451*6777b538SAndroid Build Coastguard Worker DCHECK(ptr_); 452*6777b538SAndroid Build Coastguard Worker weak_reference_owner_.Invalidate(); 453*6777b538SAndroid Build Coastguard Worker } 454*6777b538SAndroid Build Coastguard Worker 455*6777b538SAndroid Build Coastguard Worker // Call this method to determine if any weak pointers exist. 456*6777b538SAndroid Build Coastguard Worker bool HasWeakPtrs() const { 457*6777b538SAndroid Build Coastguard Worker DCHECK(ptr_); 458*6777b538SAndroid Build Coastguard Worker return weak_reference_owner_.HasRefs(); 459*6777b538SAndroid Build Coastguard Worker } 460*6777b538SAndroid Build Coastguard Worker 461*6777b538SAndroid Build Coastguard Worker // Rebind the factory to the current sequence. This allows creating an object 462*6777b538SAndroid Build Coastguard Worker // and associated weak pointers on a different thread from the one they are 463*6777b538SAndroid Build Coastguard Worker // used on. 464*6777b538SAndroid Build Coastguard Worker void BindToCurrentSequence(subtle::BindWeakPtrFactoryPassKey) { 465*6777b538SAndroid Build Coastguard Worker weak_reference_owner_.BindToCurrentSequence(); 466*6777b538SAndroid Build Coastguard Worker } 467*6777b538SAndroid Build Coastguard Worker }; 468*6777b538SAndroid Build Coastguard Worker 469*6777b538SAndroid Build Coastguard Worker // A class may extend from SupportsWeakPtr to let others take weak pointers to 470*6777b538SAndroid Build Coastguard Worker // it. This avoids the class itself implementing boilerplate to dispense weak 471*6777b538SAndroid Build Coastguard Worker // pointers. However, since SupportsWeakPtr's destructor won't invalidate 472*6777b538SAndroid Build Coastguard Worker // weak pointers to the class until after the derived class' members have been 473*6777b538SAndroid Build Coastguard Worker // destroyed, its use can lead to subtle use-after-destroy issues. 474*6777b538SAndroid Build Coastguard Worker template <class T> 475*6777b538SAndroid Build Coastguard Worker class SupportsWeakPtr : public internal::SupportsWeakPtrBase { 476*6777b538SAndroid Build Coastguard Worker public: 477*6777b538SAndroid Build Coastguard Worker SupportsWeakPtr() = default; 478*6777b538SAndroid Build Coastguard Worker 479*6777b538SAndroid Build Coastguard Worker SupportsWeakPtr(const SupportsWeakPtr&) = delete; 480*6777b538SAndroid Build Coastguard Worker SupportsWeakPtr& operator=(const SupportsWeakPtr&) = delete; 481*6777b538SAndroid Build Coastguard Worker 482*6777b538SAndroid Build Coastguard Worker WeakPtr<T> AsWeakPtr() { 483*6777b538SAndroid Build Coastguard Worker return WeakPtr<T>(weak_reference_owner_.GetRef(), static_cast<T*>(this)); 484*6777b538SAndroid Build Coastguard Worker } 485*6777b538SAndroid Build Coastguard Worker 486*6777b538SAndroid Build Coastguard Worker protected: 487*6777b538SAndroid Build Coastguard Worker ~SupportsWeakPtr() = default; 488*6777b538SAndroid Build Coastguard Worker 489*6777b538SAndroid Build Coastguard Worker private: 490*6777b538SAndroid Build Coastguard Worker internal::WeakReferenceOwner weak_reference_owner_; 491*6777b538SAndroid Build Coastguard Worker }; 492*6777b538SAndroid Build Coastguard Worker 493*6777b538SAndroid Build Coastguard Worker // Helper function that uses type deduction to safely return a WeakPtr<Derived> 494*6777b538SAndroid Build Coastguard Worker // when Derived doesn't directly extend SupportsWeakPtr<Derived>, instead it 495*6777b538SAndroid Build Coastguard Worker // extends a Base that extends SupportsWeakPtr<Base>. 496*6777b538SAndroid Build Coastguard Worker // 497*6777b538SAndroid Build Coastguard Worker // EXAMPLE: 498*6777b538SAndroid Build Coastguard Worker // class Base : public base::SupportsWeakPtr<Producer> {}; 499*6777b538SAndroid Build Coastguard Worker // class Derived : public Base {}; 500*6777b538SAndroid Build Coastguard Worker // 501*6777b538SAndroid Build Coastguard Worker // Derived derived; 502*6777b538SAndroid Build Coastguard Worker // base::WeakPtr<Derived> ptr = base::AsWeakPtr(&derived); 503*6777b538SAndroid Build Coastguard Worker // 504*6777b538SAndroid Build Coastguard Worker // Note that the following doesn't work (invalid type conversion) since 505*6777b538SAndroid Build Coastguard Worker // Derived::AsWeakPtr() is WeakPtr<Base> SupportsWeakPtr<Base>::AsWeakPtr(), 506*6777b538SAndroid Build Coastguard Worker // and there's no way to safely cast WeakPtr<Base> to WeakPtr<Derived> at 507*6777b538SAndroid Build Coastguard Worker // the caller. 508*6777b538SAndroid Build Coastguard Worker // 509*6777b538SAndroid Build Coastguard Worker // base::WeakPtr<Derived> ptr = derived.AsWeakPtr(); // Fails. 510*6777b538SAndroid Build Coastguard Worker 511*6777b538SAndroid Build Coastguard Worker template <typename Derived> 512*6777b538SAndroid Build Coastguard Worker WeakPtr<Derived> AsWeakPtr(Derived* t) { 513*6777b538SAndroid Build Coastguard Worker return internal::SupportsWeakPtrBase::StaticAsWeakPtr<Derived>(t); 514*6777b538SAndroid Build Coastguard Worker } 515*6777b538SAndroid Build Coastguard Worker 516*6777b538SAndroid Build Coastguard Worker } // namespace base 517*6777b538SAndroid Build Coastguard Worker 518*6777b538SAndroid Build Coastguard Worker #endif // BASE_MEMORY_WEAK_PTR_H_ 519