Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit c87c6cc

Browse files
Change TaskRunnerAffineWeakPtr to no longer be a subclass of WeakPtr (#36818)
1 parent c85eef5 commit c87c6cc

File tree

1 file changed

+38
-9
lines changed

1 file changed

+38
-9
lines changed

fml/memory/weak_ptr.h

Lines changed: 38 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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|.
139137
template <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

Comments
 (0)