Skip to content

Commit 87c26ae

Browse files
authored
Refactor Delayed Tasks to their own file (flutter#9290)
* Refactor Delayed Tasks to their own class * fix some comments * Update BUILD.gn
1 parent 9baf589 commit 87c26ae

File tree

6 files changed

+85
-37
lines changed

6 files changed

+85
-37
lines changed

ci/licenses_golden/licenses_flutter

+2
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,8 @@ FILE: ../../../flutter/fml/command_line_unittest.cc
100100
FILE: ../../../flutter/fml/compiler_specific.h
101101
FILE: ../../../flutter/fml/concurrent_message_loop.cc
102102
FILE: ../../../flutter/fml/concurrent_message_loop.h
103+
FILE: ../../../flutter/fml/delayed_task.cc
104+
FILE: ../../../flutter/fml/delayed_task.h
103105
FILE: ../../../flutter/fml/eintr_wrapper.h
104106
FILE: ../../../flutter/fml/file.cc
105107
FILE: ../../../flutter/fml/file.h

fml/BUILD.gn

+2
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ source_set("fml") {
1616
"compiler_specific.h",
1717
"concurrent_message_loop.cc",
1818
"concurrent_message_loop.h",
19+
"delayed_task.cc",
20+
"delayed_task.h",
1921
"eintr_wrapper.h",
2022
"file.cc",
2123
"file.h",

fml/delayed_task.cc

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
// Copyright 2013 The Flutter Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
#define FML_USED_ON_EMBEDDER
6+
7+
#include "flutter/fml/delayed_task.h"
8+
9+
namespace fml {
10+
11+
DelayedTask::DelayedTask(size_t order,
12+
fml::closure task,
13+
fml::TimePoint target_time)
14+
: order_(order), task_(std::move(task)), target_time_(target_time) {}
15+
16+
DelayedTask::DelayedTask(const DelayedTask& other) = default;
17+
18+
DelayedTask::~DelayedTask() = default;
19+
20+
const fml::closure& DelayedTask::GetTask() const {
21+
return task_;
22+
}
23+
24+
fml::TimePoint DelayedTask::GetTargetTime() const {
25+
return target_time_;
26+
}
27+
28+
bool DelayedTask::operator>(const DelayedTask& other) const {
29+
if (target_time_ == other.target_time_) {
30+
return order_ > other.order_;
31+
}
32+
return target_time_ > other.target_time_;
33+
}
34+
35+
} // namespace fml

fml/delayed_task.h

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
// Copyright 2013 The Flutter Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
#ifndef FLUTTER_FML_DELAYED_TASK_H_
6+
#define FLUTTER_FML_DELAYED_TASK_H_
7+
8+
#include "flutter/fml/closure.h"
9+
#include "flutter/fml/time/time_point.h"
10+
11+
#include <queue>
12+
13+
namespace fml {
14+
15+
class DelayedTask {
16+
public:
17+
DelayedTask(size_t order, fml::closure task, fml::TimePoint target_time);
18+
19+
DelayedTask(const DelayedTask& other);
20+
21+
~DelayedTask();
22+
23+
const fml::closure& GetTask() const;
24+
25+
fml::TimePoint GetTargetTime() const;
26+
27+
bool operator>(const DelayedTask& other) const;
28+
29+
private:
30+
size_t order_;
31+
fml::closure task_;
32+
fml::TimePoint target_time_;
33+
};
34+
35+
using DelayedTaskQueue = std::priority_queue<DelayedTask,
36+
std::deque<DelayedTask>,
37+
std::greater<DelayedTask>>;
38+
39+
} // namespace fml
40+
41+
#endif // FLUTTER_FML_DELAYED_TASK_H_

fml/message_loop_impl.cc

+4-13
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ void MessageLoopImpl::RegisterTask(fml::closure task,
133133
}
134134
std::lock_guard<std::mutex> lock(delayed_tasks_mutex_);
135135
delayed_tasks_.push({++order_, std::move(task), target_time});
136-
WakeUp(delayed_tasks_.top().target_time);
136+
WakeUp(delayed_tasks_.top().GetTargetTime());
137137
}
138138

139139
void MessageLoopImpl::FlushTasks(FlushType type) {
@@ -158,18 +158,18 @@ void MessageLoopImpl::FlushTasks(FlushType type) {
158158
auto now = fml::TimePoint::Now();
159159
while (!delayed_tasks_.empty()) {
160160
const auto& top = delayed_tasks_.top();
161-
if (top.target_time > now) {
161+
if (top.GetTargetTime() > now) {
162162
break;
163163
}
164-
invocations.emplace_back(std::move(top.task));
164+
invocations.emplace_back(std::move(top.GetTask()));
165165
delayed_tasks_.pop();
166166
if (type == FlushType::kSingle) {
167167
break;
168168
}
169169
}
170170

171171
WakeUp(delayed_tasks_.empty() ? fml::TimePoint::Max()
172-
: delayed_tasks_.top().target_time);
172+
: delayed_tasks_.top().GetTargetTime());
173173
}
174174

175175
for (const auto& invocation : invocations) {
@@ -189,13 +189,4 @@ void MessageLoopImpl::RunSingleExpiredTaskNow() {
189189
FlushTasks(FlushType::kSingle);
190190
}
191191

192-
MessageLoopImpl::DelayedTask::DelayedTask(size_t p_order,
193-
fml::closure p_task,
194-
fml::TimePoint p_target_time)
195-
: order(p_order), task(std::move(p_task)), target_time(p_target_time) {}
196-
197-
MessageLoopImpl::DelayedTask::DelayedTask(const DelayedTask& other) = default;
198-
199-
MessageLoopImpl::DelayedTask::~DelayedTask() = default;
200-
201192
} // namespace fml

fml/message_loop_impl.h

+1-24
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include <utility>
1414

1515
#include "flutter/fml/closure.h"
16+
#include "flutter/fml/delayed_task.h"
1617
#include "flutter/fml/macros.h"
1718
#include "flutter/fml/memory/ref_counted.h"
1819
#include "flutter/fml/message_loop.h"
@@ -58,30 +59,6 @@ class MessageLoopImpl : public fml::RefCountedThreadSafe<MessageLoopImpl> {
5859
MessageLoopImpl();
5960

6061
private:
61-
struct DelayedTask {
62-
size_t order;
63-
fml::closure task;
64-
fml::TimePoint target_time;
65-
66-
DelayedTask(size_t p_order,
67-
fml::closure p_task,
68-
fml::TimePoint p_target_time);
69-
70-
DelayedTask(const DelayedTask& other);
71-
72-
~DelayedTask();
73-
};
74-
75-
struct DelayedTaskCompare {
76-
bool operator()(const DelayedTask& a, const DelayedTask& b) {
77-
return a.target_time == b.target_time ? a.order > b.order
78-
: a.target_time > b.target_time;
79-
}
80-
};
81-
82-
using DelayedTaskQueue = std::
83-
priority_queue<DelayedTask, std::deque<DelayedTask>, DelayedTaskCompare>;
84-
8562
std::mutex tasks_flushing_mutex_;
8663

8764
std::mutex observers_mutex_;

0 commit comments

Comments
 (0)