| // Copyright 2011 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "base/pending_task.h" |
| |
| #include "base/task/task_features.h" |
| |
| namespace base { |
| |
| namespace { |
| |
| // TODO(crbug.com/1153139): Reconcile with GetDefaultTaskLeeway() and |
| // kMinLowResolutionThresholdMs once GetDefaultTaskLeeway() == 16ms. |
| constexpr base::TimeDelta kMaxPreciseDelay = Milliseconds(32); |
| |
| subtle::DelayPolicy MaybeOverrideDelayPolicy(subtle::DelayPolicy delay_policy, |
| TimeTicks queue_time, |
| TimeTicks delayed_run_time) { |
| if (delayed_run_time.is_null()) |
| return subtle::DelayPolicy::kFlexibleNoSooner; |
| DCHECK(!queue_time.is_null()); |
| if (delayed_run_time - queue_time >= kMaxPreciseDelay && |
| delay_policy == subtle::DelayPolicy::kPrecise) { |
| return subtle::DelayPolicy::kFlexibleNoSooner; |
| } |
| return delay_policy; |
| } |
| |
| } // namespace |
| |
| PendingTask::PendingTask() = default; |
| |
| PendingTask::PendingTask(const Location& posted_from, |
| OnceClosure task, |
| TimeTicks queue_time, |
| TimeTicks delayed_run_time, |
| TimeDelta leeway, |
| subtle::DelayPolicy delay_policy) |
| : task(std::move(task)), |
| posted_from(posted_from), |
| queue_time(queue_time), |
| delayed_run_time(delayed_run_time), |
| leeway(leeway), |
| delay_policy(MaybeOverrideDelayPolicy(delay_policy, |
| queue_time, |
| delayed_run_time)) {} |
| |
| PendingTask::PendingTask(PendingTask&& other) = default; |
| |
| PendingTask::~PendingTask() = default; |
| |
| PendingTask& PendingTask::operator=(PendingTask&& other) = default; |
| |
| TimeTicks PendingTask::GetDesiredExecutionTime() const { |
| if (!delayed_run_time.is_null()) |
| return delayed_run_time; |
| return queue_time; |
| } |
| |
| TimeTicks PendingTask::earliest_delayed_run_time() const { |
| DCHECK(!delayed_run_time.is_null()); |
| if (delay_policy == subtle::DelayPolicy::kFlexiblePreferEarly) |
| return delayed_run_time - leeway; |
| return delayed_run_time; |
| } |
| |
| TimeTicks PendingTask::latest_delayed_run_time() const { |
| DCHECK(!delayed_run_time.is_null()); |
| if (delay_policy == subtle::DelayPolicy::kFlexibleNoSooner) |
| return delayed_run_time + leeway; |
| return delayed_run_time; |
| } |
| |
| } // namespace base |