mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
remove lock and use raw ptr for MessageLoopTaskQueues (flutter/engine#34249)
This commit is contained in:
parent
b3b941e436
commit
bec0d79eeb
@ -64,7 +64,7 @@ class MessageLoopImpl : public Wakeable,
|
||||
MessageLoopImpl();
|
||||
|
||||
private:
|
||||
fml::RefPtr<MessageLoopTaskQueues> task_queue_;
|
||||
fml::MessageLoopTaskQueues* task_queue_;
|
||||
TaskQueueId queue_id_;
|
||||
|
||||
std::atomic_bool terminated_;
|
||||
|
||||
@ -17,13 +17,8 @@
|
||||
|
||||
namespace fml {
|
||||
|
||||
std::mutex MessageLoopTaskQueues::creation_mutex_;
|
||||
|
||||
const size_t TaskQueueId::kUnmerged = ULONG_MAX;
|
||||
|
||||
// Guarded by creation_mutex_.
|
||||
fml::RefPtr<MessageLoopTaskQueues> MessageLoopTaskQueues::instance_;
|
||||
|
||||
namespace {
|
||||
|
||||
// iOS prior to version 9 prevents c++11 thread_local and __thread specifier,
|
||||
@ -37,7 +32,6 @@ class TaskSourceGradeHolder {
|
||||
};
|
||||
} // namespace
|
||||
|
||||
// Guarded by creation_mutex_.
|
||||
FML_THREAD_LOCAL ThreadLocalUniquePtr<TaskSourceGradeHolder>
|
||||
tls_task_source_grade;
|
||||
|
||||
@ -48,14 +42,9 @@ TaskQueueEntry::TaskQueueEntry(TaskQueueId created_for_arg)
|
||||
task_source = std::make_unique<TaskSource>(created_for);
|
||||
}
|
||||
|
||||
fml::RefPtr<MessageLoopTaskQueues> MessageLoopTaskQueues::GetInstance() {
|
||||
std::scoped_lock creation(creation_mutex_);
|
||||
if (!instance_) {
|
||||
instance_ = fml::MakeRefCounted<MessageLoopTaskQueues>();
|
||||
tls_task_source_grade.reset(
|
||||
new TaskSourceGradeHolder{TaskSourceGrade::kUnspecified});
|
||||
}
|
||||
return instance_;
|
||||
MessageLoopTaskQueues* MessageLoopTaskQueues::GetInstance() {
|
||||
static MessageLoopTaskQueues* instance = new MessageLoopTaskQueues;
|
||||
return instance;
|
||||
}
|
||||
|
||||
TaskQueueId MessageLoopTaskQueues::CreateTaskQueue() {
|
||||
@ -67,7 +56,10 @@ TaskQueueId MessageLoopTaskQueues::CreateTaskQueue() {
|
||||
}
|
||||
|
||||
MessageLoopTaskQueues::MessageLoopTaskQueues()
|
||||
: task_queue_id_counter_(0), order_(0) {}
|
||||
: task_queue_id_counter_(0), order_(0) {
|
||||
tls_task_source_grade.reset(
|
||||
new TaskSourceGradeHolder{TaskSourceGrade::kUnspecified});
|
||||
}
|
||||
|
||||
MessageLoopTaskQueues::~MessageLoopTaskQueues() = default;
|
||||
|
||||
@ -95,7 +87,6 @@ void MessageLoopTaskQueues::DisposeTasks(TaskQueueId queue_id) {
|
||||
}
|
||||
|
||||
TaskSourceGrade MessageLoopTaskQueues::GetCurrentTaskSourceGrade() {
|
||||
std::scoped_lock creation(creation_mutex_);
|
||||
return tls_task_source_grade.get()->task_source_grade;
|
||||
}
|
||||
|
||||
@ -145,11 +136,8 @@ fml::closure MessageLoopTaskQueues::GetNextTaskToRun(TaskQueueId queue_id,
|
||||
fml::closure invocation = top.task.GetTask();
|
||||
queue_entries_.at(top.task_queue_id)
|
||||
->task_source->PopTask(top.task.GetTaskSourceGrade());
|
||||
{
|
||||
std::scoped_lock creation(creation_mutex_);
|
||||
const auto task_source_grade = top.task.GetTaskSourceGrade();
|
||||
tls_task_source_grade.reset(new TaskSourceGradeHolder{task_source_grade});
|
||||
}
|
||||
const auto task_source_grade = top.task.GetTaskSourceGrade();
|
||||
tls_task_source_grade.reset(new TaskSourceGradeHolder{task_source_grade});
|
||||
return invocation;
|
||||
}
|
||||
|
||||
|
||||
@ -62,12 +62,11 @@ enum class FlushType {
|
||||
/// This also wakes up the loop at the required times.
|
||||
/// \see fml::MessageLoop
|
||||
/// \see fml::Wakeable
|
||||
class MessageLoopTaskQueues
|
||||
: public fml::RefCountedThreadSafe<MessageLoopTaskQueues> {
|
||||
class MessageLoopTaskQueues {
|
||||
public:
|
||||
// Lifecycle.
|
||||
|
||||
static fml::RefPtr<MessageLoopTaskQueues> GetInstance();
|
||||
static MessageLoopTaskQueues* GetInstance();
|
||||
|
||||
TaskQueueId CreateTaskQueue();
|
||||
|
||||
@ -152,9 +151,6 @@ class MessageLoopTaskQueues
|
||||
|
||||
fml::TimePoint GetNextWakeTimeUnlocked(TaskQueueId queue_id) const;
|
||||
|
||||
static std::mutex creation_mutex_;
|
||||
static fml::RefPtr<MessageLoopTaskQueues> instance_;
|
||||
|
||||
mutable std::mutex queue_mutex_;
|
||||
std::map<TaskQueueId, std::unique_ptr<TaskQueueEntry>> queue_entries_;
|
||||
|
||||
@ -162,8 +158,6 @@ class MessageLoopTaskQueues
|
||||
|
||||
std::atomic_int order_;
|
||||
|
||||
FML_FRIEND_MAKE_REF_COUNTED(MessageLoopTaskQueues);
|
||||
FML_FRIEND_REF_COUNTED_THREAD_SAFE(MessageLoopTaskQueues);
|
||||
FML_DISALLOW_COPY_ASSIGN_AND_MOVE(MessageLoopTaskQueues);
|
||||
};
|
||||
|
||||
|
||||
@ -27,7 +27,7 @@ class TestWakeable : public fml::Wakeable {
|
||||
WakeUpCall wake_up_call_;
|
||||
};
|
||||
|
||||
static int CountRemainingTasks(fml::RefPtr<MessageLoopTaskQueues> task_queue,
|
||||
static int CountRemainingTasks(fml::MessageLoopTaskQueues* task_queue,
|
||||
const TaskQueueId& queue_id,
|
||||
bool run_invocation = false) {
|
||||
const auto now = ChronoTicksSinceEpoch();
|
||||
|
||||
@ -57,7 +57,7 @@ class SharedThreadMerger
|
||||
private:
|
||||
fml::TaskQueueId owner_;
|
||||
fml::TaskQueueId subsumed_;
|
||||
fml::RefPtr<fml::MessageLoopTaskQueues> task_queues_;
|
||||
fml::MessageLoopTaskQueues* task_queues_;
|
||||
std::mutex mutex_;
|
||||
bool enabled_;
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user