@@ -65,8 +65,6 @@ class WeakPtr {
6565 flag_ (std::move(r.flag_)),
6666 checker_(r.checker_) {}
6767
68- virtual ~WeakPtr () = default ;
69-
7068 // The following methods are thread-friendly, in the sense that they may be
7169 // called subject to additional synchronization.
7270
@@ -107,7 +105,7 @@ class WeakPtr {
107105 explicit WeakPtr (T* ptr, fml::RefPtr<fml::internal::WeakPtrFlag>&& flag)
108106 : ptr_(ptr), flag_(std::move(flag)) {}
109107
110- virtual void CheckThreadSafety () const {
108+ void CheckThreadSafety () const {
111109 FML_DCHECK_CREATION_THREAD_IS_CURRENT (checker_.checker );
112110 }
113111
@@ -137,23 +135,25 @@ class TaskRunnerAffineWeakPtrFactory;
137135//
138136// It is still not in general thread safe as |WeakPtr|.
139137template <typename T>
140- class TaskRunnerAffineWeakPtr : public WeakPtr <T> {
138+ class TaskRunnerAffineWeakPtr {
141139 public:
142- TaskRunnerAffineWeakPtr () : WeakPtr<T>( ) {}
140+ TaskRunnerAffineWeakPtr () : ptr_( nullptr ) {}
143141
144142 TaskRunnerAffineWeakPtr (const TaskRunnerAffineWeakPtr<T>& r) = default ;
145143
146144 template <typename U>
147145 // NOLINTNEXTLINE(google-explicit-constructor)
148146 TaskRunnerAffineWeakPtr (const TaskRunnerAffineWeakPtr<U>& r)
149- : WeakPtr<T >(r), checker_(r.checker_) {}
147+ : ptr_( static_cast <T* >(r.ptr_)), flag_(r.flag_ ), checker_(r.checker_) {}
150148
151149 TaskRunnerAffineWeakPtr (TaskRunnerAffineWeakPtr<T>&& r) = default ;
152150
153151 template <typename U>
154152 // NOLINTNEXTLINE(google-explicit-constructor)
155153 TaskRunnerAffineWeakPtr (TaskRunnerAffineWeakPtr<U>&& r)
156- : WeakPtr<T>(r), checker_(r.checker_) {}
154+ : ptr_(static_cast <T*>(r.ptr_)),
155+ flag_ (std::move(r.flag_)),
156+ checker_(r.checker_) {}
157157
158158 ~TaskRunnerAffineWeakPtr () = default ;
159159
@@ -163,8 +163,35 @@ class TaskRunnerAffineWeakPtr : public WeakPtr<T> {
163163 TaskRunnerAffineWeakPtr<T>& operator =(TaskRunnerAffineWeakPtr<T>&& r) =
164164 default ;
165165
166+ void reset () { flag_ = nullptr ; }
167+
168+ // The following methods should only be called on the same thread as the
169+ // "originating" |TaskRunnerAffineWeakPtrFactory|.
170+
171+ explicit operator bool () const {
172+ CheckThreadSafety ();
173+ return flag_ && flag_->is_valid ();
174+ }
175+
176+ T* get () const {
177+ CheckThreadSafety ();
178+ return *this ? ptr_ : nullptr ;
179+ }
180+
181+ T& operator *() const {
182+ CheckThreadSafety ();
183+ FML_DCHECK (*this );
184+ return *get ();
185+ }
186+
187+ T* operator ->() const {
188+ CheckThreadSafety ();
189+ FML_DCHECK (*this );
190+ return get ();
191+ }
192+
166193 protected:
167- void CheckThreadSafety () const override {
194+ void CheckThreadSafety () const {
168195 FML_DCHECK_TASK_RUNNER_IS_CURRENT (checker_.checker );
169196 }
170197
@@ -177,8 +204,10 @@ class TaskRunnerAffineWeakPtr : public WeakPtr<T> {
177204 T* ptr,
178205 fml::RefPtr<fml::internal::WeakPtrFlag>&& flag,
179206 DebugTaskRunnerChecker checker)
180- : WeakPtr<T> (ptr, std::move(flag)), checker_(checker) {}
207+ : ptr_ (ptr), flag_( std::move(flag)), checker_(checker) {}
181208
209+ T* ptr_;
210+ fml::RefPtr<fml::internal::WeakPtrFlag> flag_;
182211 DebugTaskRunnerChecker checker_;
183212};
184213
0 commit comments