Make resume dart microtasks static to avoid capturing vsync waiter (flutter/engine#26440)

This avoids the race where vsync waiter was shutdown before the tasks on
ui task runner got flushed.

Fixes: https://github.com/flutter/flutter/issues/82024
This commit is contained in:
Kaushik Iska 2021-05-26 16:52:36 -05:00 committed by GitHub
parent f552538752
commit 41ba3d48d1
2 changed files with 9 additions and 6 deletions

View File

@ -8,6 +8,7 @@
#include "flutter/fml/task_runner.h"
#include "flutter/fml/trace_event.h"
#include "fml/message_loop_task_queues.h"
#include "fml/task_queue_id.h"
namespace flutter {
@ -128,9 +129,12 @@ void VsyncWaiter::FireCallback(fml::TimePoint frame_start_time,
TRACE_FLOW_BEGIN("flutter", kVsyncFlowName, flow_identifier);
fml::TaskQueueId ui_task_queue_id =
task_runners_.GetUITaskRunner()->GetTaskQueueId();
task_runners_.GetUITaskRunner()->PostTaskForTime(
[this, callback, flow_identifier, frame_start_time, frame_target_time,
pause_secondary_tasks]() {
[ui_task_queue_id, callback, flow_identifier, frame_start_time,
frame_target_time, pause_secondary_tasks]() {
FML_TRACE_EVENT("flutter", kVsyncTraceName, "StartTime",
frame_start_time, "TargetTime", frame_target_time);
std::unique_ptr<FrameTimingsRecorder> frame_timings_recorder =
@ -140,7 +144,7 @@ void VsyncWaiter::FireCallback(fml::TimePoint frame_start_time,
callback(std::move(frame_timings_recorder));
TRACE_FLOW_END("flutter", kVsyncFlowName, flow_identifier);
if (pause_secondary_tasks) {
ResumeDartMicroTasks();
ResumeDartMicroTasks(ui_task_queue_id);
}
},
frame_start_time);
@ -158,8 +162,7 @@ void VsyncWaiter::PauseDartMicroTasks() {
task_queues->PauseSecondarySource(ui_task_queue_id);
}
void VsyncWaiter::ResumeDartMicroTasks() {
auto ui_task_queue_id = task_runners_.GetUITaskRunner()->GetTaskQueueId();
void VsyncWaiter::ResumeDartMicroTasks(fml::TaskQueueId ui_task_queue_id) {
auto task_queues = fml::MessageLoopTaskQueues::GetInstance();
task_queues->ResumeSecondarySource(ui_task_queue_id);
}

View File

@ -75,7 +75,7 @@ class VsyncWaiter : public std::enable_shared_from_this<VsyncWaiter> {
std::unordered_map<uintptr_t, fml::closure> secondary_callbacks_;
void PauseDartMicroTasks();
void ResumeDartMicroTasks();
static void ResumeDartMicroTasks(fml::TaskQueueId ui_task_queue_id);
FML_DISALLOW_COPY_AND_ASSIGN(VsyncWaiter);
};