| // Copyright 2018 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef LIB_DEPRECATED_LOOP_INCOMING_TASK_QUEUE_H_ |
| #define LIB_DEPRECATED_LOOP_INCOMING_TASK_QUEUE_H_ |
| |
| #include <mutex> |
| #include <utility> |
| #include <vector> |
| |
| #include "lib/fxl/functional/closure.h" |
| #include "lib/fxl/fxl_export.h" |
| #include "lib/fxl/macros.h" |
| #include "lib/fxl/memory/ref_counted.h" |
| #include "lib/fxl/synchronization/thread_annotations.h" |
| #include "lib/fxl/tasks/task_runner.h" |
| #include "lib/fxl/time/time_point.h" |
| |
| namespace deprecated_loop { |
| namespace internal { |
| |
| class FXL_EXPORT TaskQueueDelegate { |
| public: |
| virtual void PostTask(fxl::Closure task, fxl::TimePoint target_time) = 0; |
| virtual bool RunsTasksOnCurrentThread() = 0; |
| |
| protected: |
| virtual ~TaskQueueDelegate(); |
| }; |
| |
| // Receives tasks from multiple threads and buffers them until a delegate |
| // is ready to receive them. |
| // |
| // This object is threadsafe. |
| class FXL_EXPORT IncomingTaskQueue : public fxl::TaskRunner { |
| public: |
| IncomingTaskQueue(); |
| ~IncomingTaskQueue() override; |
| |
| // |TaskRunner| implementation: |
| void PostTask(fxl::Closure task) override; |
| void PostTaskForTime(fxl::Closure task, fxl::TimePoint target_time) override; |
| void PostDelayedTask(fxl::Closure task, fxl::TimeDelta delay) override; |
| bool RunsTasksOnCurrentThread() override; |
| |
| // Sets the delegate and schedules all pending tasks with it. |
| void InitDelegate(TaskQueueDelegate* delegate); |
| |
| // Clears the delegate and drops all later incoming tasks. |
| void ClearDelegate(); |
| |
| private: |
| void AddTask(fxl::Closure task, fxl::TimePoint target_time); |
| |
| using Task = std::pair<fxl::Closure, fxl::TimePoint>; |
| |
| std::mutex mutex_; |
| std::vector<Task> incoming_queue_ FXL_GUARDED_BY(mutex_); |
| TaskQueueDelegate* delegate_ FXL_GUARDED_BY(mutex_) = nullptr; |
| bool drop_incoming_tasks_ FXL_GUARDED_BY(mutex_) = false; |
| |
| FXL_DISALLOW_COPY_AND_ASSIGN(IncomingTaskQueue); |
| }; |
| |
| } // namespace internal |
| } // namespace deprecated_loop |
| |
| #endif // LIB_DEPRECATED_LOOP_INCOMING_TASK_QUEUE_H_ |