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

Commit 8882bf3

Browse files
Avoid dereferencing IO manager weak pointers on the UI thread (#13232)
UI thread APIs that need to access the IO thread's resource context should obtain a weak pointer to the IO manager and pass that to the IO thread.
1 parent 8aefcd8 commit 8882bf3

File tree

5 files changed

+24
-33
lines changed

5 files changed

+24
-33
lines changed

lib/ui/painting/image_encoding.cc

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -211,21 +211,16 @@ Dart_Handle EncodeImage(CanvasImage* canvas_image,
211211
tonic::DartState::Current(), callback_handle);
212212

213213
const auto& task_runners = UIDartState::Current()->GetTaskRunners();
214-
auto context = UIDartState::Current()->GetResourceContext();
215-
216-
task_runners.GetIOTaskRunner()->PostTask(
217-
fml::MakeCopyable([callback = std::move(callback), //
218-
image = canvas_image->image(), //
219-
context = std::move(context), //
220-
ui_task_runner = task_runners.GetUITaskRunner(), //
221-
image_format //
222-
]() mutable {
223-
EncodeImageAndInvokeDataCallback(std::move(callback), //
224-
std::move(image), //
225-
context.get(), //
226-
std::move(ui_task_runner), //
227-
image_format //
228-
);
214+
215+
task_runners.GetIOTaskRunner()->PostTask(fml::MakeCopyable(
216+
[callback = std::move(callback), image = canvas_image->image(),
217+
io_manager = UIDartState::Current()->GetIOManager(),
218+
ui_task_runner = task_runners.GetUITaskRunner(),
219+
image_format]() mutable {
220+
EncodeImageAndInvokeDataCallback(std::move(callback), std::move(image),
221+
io_manager->GetResourceContext().get(),
222+
std::move(ui_task_runner),
223+
image_format);
229224
}));
230225

231226
return Dart_Null();

lib/ui/painting/multi_frame_codec.cc

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -168,11 +168,11 @@ Dart_Handle MultiFrameCodec::getNextFrame(Dart_Handle callback_handle) {
168168
[callback = std::make_unique<DartPersistentValue>(
169169
tonic::DartState::Current(), callback_handle),
170170
this, trace_id, ui_task_runner = task_runners.GetUITaskRunner(),
171-
queue = UIDartState::Current()->GetSkiaUnrefQueue(),
172-
context = dart_state->GetResourceContext()]() mutable {
173-
GetNextFrameAndInvokeCallback(std::move(callback),
174-
std::move(ui_task_runner), context,
175-
std::move(queue), trace_id);
171+
io_manager = dart_state->GetIOManager()]() mutable {
172+
GetNextFrameAndInvokeCallback(
173+
std::move(callback), std::move(ui_task_runner),
174+
io_manager->GetResourceContext(), io_manager->GetSkiaUnrefQueue(),
175+
trace_id);
176176
}));
177177

178178
return Dart_Null();

lib/ui/painting/picture.cc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ Dart_Handle Picture::RasterizeToImage(sk_sp<SkPicture> picture,
136136
auto unref_queue = dart_state->GetSkiaUnrefQueue();
137137
auto ui_task_runner = dart_state->GetTaskRunners().GetUITaskRunner();
138138
auto io_task_runner = dart_state->GetTaskRunners().GetIOTaskRunner();
139-
fml::WeakPtr<GrContext> resource_context = dart_state->GetResourceContext();
139+
fml::WeakPtr<IOManager> io_manager = dart_state->GetIOManager();
140140

141141
// We can't create an image on this task runner because we don't have a
142142
// graphics context. Even if we did, it would be slow anyway. Also, this
@@ -173,9 +173,9 @@ Dart_Handle Picture::RasterizeToImage(sk_sp<SkPicture> picture,
173173

174174
fml::TaskRunner::RunNowOrPostTask(io_task_runner, [ui_task_runner, picture,
175175
picture_bounds, ui_task,
176-
resource_context] {
176+
io_manager] {
177177
sk_sp<SkSurface> surface =
178-
MakeSnapshotSurface(picture_bounds, resource_context);
178+
MakeSnapshotSurface(picture_bounds, io_manager->GetResourceContext());
179179
sk_sp<SkImage> raster_image = MakeRasterSnapshot(picture, surface);
180180

181181
fml::TaskRunner::RunNowOrPostTask(

lib/ui/ui_dart_state.cc

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,10 @@ const TaskRunners& UIDartState::GetTaskRunners() const {
7878
return task_runners_;
7979
}
8080

81+
fml::WeakPtr<IOManager> UIDartState::GetIOManager() const {
82+
return io_manager_;
83+
}
84+
8185
fml::RefPtr<flutter::SkiaUnrefQueue> UIDartState::GetSkiaUnrefQueue() const {
8286
// TODO(gw280): The WeakPtr here asserts that we are derefing it on the
8387
// same thread as it was created on. As we can't guarantee that currently
@@ -119,14 +123,6 @@ void UIDartState::AddOrRemoveTaskObserver(bool add) {
119123
}
120124
}
121125

122-
fml::WeakPtr<GrContext> UIDartState::GetResourceContext() const {
123-
FML_DCHECK(task_runners_.GetIOTaskRunner()->RunsTasksOnCurrentThread());
124-
if (!io_manager_) {
125-
return {};
126-
}
127-
return io_manager_->GetResourceContext();
128-
}
129-
130126
fml::WeakPtr<ImageDecoder> UIDartState::GetImageDecoder() const {
131127
return image_decoder_;
132128
}

lib/ui/ui_dart_state.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,9 @@ class UIDartState : public tonic::DartState {
4848

4949
void FlushMicrotasksNow();
5050

51-
fml::RefPtr<flutter::SkiaUnrefQueue> GetSkiaUnrefQueue() const;
51+
fml::WeakPtr<IOManager> GetIOManager() const;
5252

53-
fml::WeakPtr<GrContext> GetResourceContext() const;
53+
fml::RefPtr<flutter::SkiaUnrefQueue> GetSkiaUnrefQueue() const;
5454

5555
fml::WeakPtr<ImageDecoder> GetImageDecoder() const;
5656

0 commit comments

Comments
 (0)