// Copyright 2013 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #define FML_USED_ON_EMBEDDER #include "flutter/fml/task_source.h" namespace fml { TaskSource::TaskSource(TaskQueueId task_queue_id) : task_queue_id_(task_queue_id) {} TaskSource::~TaskSource() { ShutDown(); } void TaskSource::ShutDown() { primary_task_queue_ = {}; secondary_task_queue_ = {}; } void TaskSource::RegisterTask(const DelayedTask& task) { switch (task.GetTaskSourceGrade()) { case TaskSourceGrade::kUserInteraction: primary_task_queue_.push(task); break; case TaskSourceGrade::kUnspecified: primary_task_queue_.push(task); break; case TaskSourceGrade::kDartEventLoop: secondary_task_queue_.push(task); break; } } void TaskSource::PopTask(TaskSourceGrade grade) { switch (grade) { case TaskSourceGrade::kUserInteraction: primary_task_queue_.pop(); break; case TaskSourceGrade::kUnspecified: primary_task_queue_.pop(); break; case TaskSourceGrade::kDartEventLoop: secondary_task_queue_.pop(); break; } } size_t TaskSource::GetNumPendingTasks() const { size_t size = primary_task_queue_.size(); if (secondary_pause_requests_ == 0) { size += secondary_task_queue_.size(); } return size; } bool TaskSource::IsEmpty() const { return GetNumPendingTasks() == 0; } TaskSource::TopTask TaskSource::Top() const { FML_CHECK(!IsEmpty()); if (secondary_pause_requests_ > 0 || secondary_task_queue_.empty()) { const auto& primary_top = primary_task_queue_.top(); return { .task_queue_id = task_queue_id_, .task = primary_top, }; } else if (primary_task_queue_.empty()) { const auto& secondary_top = secondary_task_queue_.top(); return { .task_queue_id = task_queue_id_, .task = secondary_top, }; } else { const auto& primary_top = primary_task_queue_.top(); const auto& secondary_top = secondary_task_queue_.top(); if (primary_top > secondary_top) { return { .task_queue_id = task_queue_id_, .task = secondary_top, }; } else { return { .task_queue_id = task_queue_id_, .task = primary_top, }; } } } void TaskSource::PauseSecondary() { secondary_pause_requests_++; } void TaskSource::ResumeSecondary() { secondary_pause_requests_--; FML_DCHECK(secondary_pause_requests_ >= 0); } } // namespace fml