// Copyright 2016 The Chromium 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 BASE_TASK_SCHEDULER_DELAYED_TASK_MANAGER_H_ #define BASE_TASK_SCHEDULER_DELAYED_TASK_MANAGER_H_ #include #include #include #include "base/base_export.h" #include "base/callback.h" #include "base/macros.h" #include "base/memory/ptr_util.h" #include "base/memory/ref_counted.h" #include "base/synchronization/atomic_flag.h" #include "base/task_scheduler/scheduler_lock.h" #include "base/time/default_tick_clock.h" #include "base/time/tick_clock.h" namespace base { class TaskRunner; namespace internal { struct Task; // The DelayedTaskManager forwards tasks to post task callbacks when they become // ripe for execution. Tasks are not forwarded before Start() is called. This // class is thread-safe. class BASE_EXPORT DelayedTaskManager { public: // Posts |task| for execution immediately. using PostTaskNowCallback = OnceCallback; // |tick_clock| can be specified for testing. DelayedTaskManager(std::unique_ptr tick_clock = std::make_unique()); ~DelayedTaskManager(); // Starts the delayed task manager, allowing past and future tasks to be // forwarded to their callbacks as they become ripe for execution. // |service_thread_task_runner| posts tasks to the TaskScheduler service // thread. void Start(scoped_refptr service_thread_task_runner); // Schedules a call to |post_task_now_callback| with |task| as argument when // |task| is ripe for execution and Start() has been called. void AddDelayedTask(Task task, PostTaskNowCallback post_task_now_callback); private: // Schedules a call to |post_task_now_callback| with |task| as argument when // |delay| expires. Start() must have been called before this. void AddDelayedTaskNow(Task task, TimeDelta delay, PostTaskNowCallback post_task_now_callback); const std::unique_ptr tick_clock_; AtomicFlag started_; // Synchronizes access to all members below before |started_| is set. Once // |started_| is set: // - |service_thread_task_runner| doest not change, so it can be read without // holding the lock. // - |tasks_added_before_start_| isn't accessed anymore. SchedulerLock lock_; scoped_refptr service_thread_task_runner_; std::vector> tasks_added_before_start_; DISALLOW_COPY_AND_ASSIGN(DelayedTaskManager); }; } // namespace internal } // namespace base #endif // BASE_TASK_SCHEDULER_DELAYED_TASK_MANAGER_H_