blob: 87f56810d77194a3f0e396029b5ee6a7e0578465 [file] [log] [blame]
// 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/dcheck_is_on.h"
#include "base/debug/alias.h"
namespace base {
#if DCHECK_IS_ON()
namespace {
// Returns `str`, or an empty string if `str` is null.
const char* EmptyIfNull(const char* str) {
if (str) {
return str;
}
return "";
}
} // namespace
#endif
TaskMetadata::TaskMetadata() = default;
TaskMetadata::TaskMetadata(const Location& posted_from,
TimeTicks queue_time,
TimeTicks delayed_run_time,
TimeDelta leeway,
subtle::DelayPolicy delay_policy)
: posted_from(posted_from),
queue_time(queue_time),
delayed_run_time(delayed_run_time),
leeway(leeway),
delay_policy(delay_policy) {}
TaskMetadata::TaskMetadata(TaskMetadata&& other) = default;
TaskMetadata::TaskMetadata(const TaskMetadata& other) = default;
TaskMetadata::~TaskMetadata() = default;
TaskMetadata& TaskMetadata::operator=(TaskMetadata&& other) = default;
TaskMetadata& TaskMetadata::operator=(const TaskMetadata& other) = default;
PendingTask::PendingTask() = default;
PendingTask::PendingTask(const Location& posted_from,
OnceClosure task,
TimeTicks queue_time,
TimeTicks delayed_run_time,
TimeDelta leeway,
subtle::DelayPolicy delay_policy)
: TaskMetadata(posted_from,
queue_time,
delayed_run_time,
leeway,
delay_policy),
task(std::move(task)) {}
PendingTask::PendingTask(const TaskMetadata& metadata, OnceClosure task)
: TaskMetadata(metadata), task(std::move(task)) {}
PendingTask::PendingTask(PendingTask&& other) = default;
PendingTask::~PendingTask() {
#if DCHECK_IS_ON()
// Instrumentation to investigate crbug.com/1494307 (only required in
// DCHECK-enabled builds since this is a DCHECK failure).
// TODO(crbug.com/1494307): Remove after March 2024.
DEBUG_ALIAS_FOR_CSTR(posted_from_function,
EmptyIfNull(posted_from.function_name()), 256);
DEBUG_ALIAS_FOR_CSTR(posted_from_file, EmptyIfNull(posted_from.file_name()),
256);
#endif
task.Reset();
}
PendingTask& PendingTask::operator=(PendingTask&& other) = default;
TimeTicks TaskMetadata::GetDesiredExecutionTime() const {
if (!delayed_run_time.is_null())
return delayed_run_time;
return queue_time;
}
TimeTicks TaskMetadata::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 TaskMetadata::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