#ifndef BASE_TASK_THREAD_POOL_DELAYED_TASK_MANAGER_H_
#define BASE_TASK_THREAD_POOL_DELAYED_TASK_MANAGER_H_
#include <functional>
#include <optional>
#include "base/base_export.h"
#include "base/containers/intrusive_heap.h"
#include "base/functional/callback.h"
#include "base/memory/ptr_util.h"
#include "base/memory/raw_ptr.h"
#include "base/sequence_checker.h"
#include "base/synchronization/atomic_flag.h"
#include "base/task/common/checked_lock.h"
#include "base/task/delay_policy.h"
#include "base/task/task_features.h"
#include "base/task/thread_pool/task.h"
#include "base/thread_annotations.h"
#include "base/time/default_tick_clock.h"
#include "base/time/tick_clock.h"
namespace base {
class SequencedTaskRunner;
namespace internal {
class BASE_EXPORT DelayedTaskManager {
public:
using PostTaskNowCallback = OnceCallback<void(Task task)>;
DelayedTaskManager(
const TickClock* tick_clock = DefaultTickClock::GetInstance());
DelayedTaskManager(const DelayedTaskManager&) = delete;
DelayedTaskManager& operator=(const DelayedTaskManager&) = delete;
~DelayedTaskManager();
void Start(scoped_refptr<SequencedTaskRunner> service_thread_task_runner);
void AddDelayedTask(Task task, PostTaskNowCallback post_task_now_callback);
void ProcessRipeTasks();
std::optional<TimeTicks> NextScheduledRunTime() const;
subtle::DelayPolicy TopTaskDelayPolicyForTesting() const;
void Shutdown();
private:
struct DelayedTask {
DelayedTask();
DelayedTask(Task task, PostTaskNowCallback callback);
DelayedTask(DelayedTask&& other);
DelayedTask(const DelayedTask&) = delete;
DelayedTask& operator=(const DelayedTask&) = delete;
~DelayedTask();
DelayedTask& operator=(DelayedTask&& other);
bool operator>(const DelayedTask& other) const;
Task task;
PostTaskNowCallback callback;
void SetScheduled();
void SetHeapHandle(const HeapHandle& handle) {}
void ClearHeapHandle() {}
HeapHandle GetHeapHandle() const { return HeapHandle::Invalid(); }
};
std::pair<TimeTicks, subtle::DelayPolicy>
GetTimeAndDelayPolicyToScheduleProcessRipeTasksLockRequired()
EXCLUSIVE_LOCKS_REQUIRED(queue_lock_);
void ScheduleProcessRipeTasksOnServiceThread();
const RepeatingClosure process_ripe_tasks_closure_;
const RepeatingClosure schedule_process_ripe_tasks_closure_;
const raw_ptr<const TickClock> tick_clock_;
mutable CheckedLock queue_lock_{UniversalSuccessor()};
scoped_refptr<SequencedTaskRunner> service_thread_task_runner_;
DelayedTaskHandle delayed_task_handle_ GUARDED_BY_CONTEXT(sequence_checker_);
IntrusiveHeap<DelayedTask, std::greater<>> delayed_task_queue_
GUARDED_BY(queue_lock_);
base::TimeDelta max_precise_delay GUARDED_BY(queue_lock_) =
kDefaultMaxPreciseDelay;
SEQUENCE_CHECKER(sequence_checker_);
};
}
}
#endif