1 // Copyright 2011 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "base/pending_task.h"
6
7 #include "base/dcheck_is_on.h"
8 #include "base/debug/alias.h"
9
10 namespace base {
11
12 #if DCHECK_IS_ON()
13 namespace {
14
15 // Returns `str`, or an empty string if `str` is null.
EmptyIfNull(const char * str)16 const char* EmptyIfNull(const char* str) {
17 if (str) {
18 return str;
19 }
20 return "";
21 }
22
23 } // namespace
24 #endif
25
26 TaskMetadata::TaskMetadata() = default;
27
TaskMetadata(const Location & posted_from,TimeTicks queue_time,TimeTicks delayed_run_time,TimeDelta leeway,subtle::DelayPolicy delay_policy)28 TaskMetadata::TaskMetadata(const Location& posted_from,
29 TimeTicks queue_time,
30 TimeTicks delayed_run_time,
31 TimeDelta leeway,
32 subtle::DelayPolicy delay_policy)
33 : posted_from(posted_from),
34 queue_time(queue_time),
35 delayed_run_time(delayed_run_time),
36 leeway(leeway),
37 delay_policy(delay_policy) {}
38
39 TaskMetadata::TaskMetadata(TaskMetadata&& other) = default;
40 TaskMetadata::TaskMetadata(const TaskMetadata& other) = default;
41
42 TaskMetadata::~TaskMetadata() = default;
43
44 TaskMetadata& TaskMetadata::operator=(TaskMetadata&& other) = default;
45 TaskMetadata& TaskMetadata::operator=(const TaskMetadata& other) = default;
46
47 PendingTask::PendingTask() = default;
48
PendingTask(const Location & posted_from,OnceClosure task,TimeTicks queue_time,TimeTicks delayed_run_time,TimeDelta leeway,subtle::DelayPolicy delay_policy)49 PendingTask::PendingTask(const Location& posted_from,
50 OnceClosure task,
51 TimeTicks queue_time,
52 TimeTicks delayed_run_time,
53 TimeDelta leeway,
54 subtle::DelayPolicy delay_policy)
55 : TaskMetadata(posted_from,
56 queue_time,
57 delayed_run_time,
58 leeway,
59 delay_policy),
60 task(std::move(task)) {}
61
PendingTask(const TaskMetadata & metadata,OnceClosure task)62 PendingTask::PendingTask(const TaskMetadata& metadata, OnceClosure task)
63 : TaskMetadata(metadata), task(std::move(task)) {}
64
65 PendingTask::PendingTask(PendingTask&& other) = default;
66
~PendingTask()67 PendingTask::~PendingTask() {
68 #if DCHECK_IS_ON()
69 // Instrumentation to investigate crbug.com/1494307 (only required in
70 // DCHECK-enabled builds since this is a DCHECK failure).
71 // TODO(crbug.com/1494307): Remove after March 2024.
72 DEBUG_ALIAS_FOR_CSTR(posted_from_function,
73 EmptyIfNull(posted_from.function_name()), 256);
74 DEBUG_ALIAS_FOR_CSTR(posted_from_file, EmptyIfNull(posted_from.file_name()),
75 256);
76 #endif
77 task.Reset();
78 }
79
80 PendingTask& PendingTask::operator=(PendingTask&& other) = default;
81
GetDesiredExecutionTime() const82 TimeTicks TaskMetadata::GetDesiredExecutionTime() const {
83 if (!delayed_run_time.is_null())
84 return delayed_run_time;
85 return queue_time;
86 }
87
earliest_delayed_run_time() const88 TimeTicks TaskMetadata::earliest_delayed_run_time() const {
89 DCHECK(!delayed_run_time.is_null());
90 if (delay_policy == subtle::DelayPolicy::kFlexiblePreferEarly)
91 return delayed_run_time - leeway;
92 return delayed_run_time;
93 }
94
latest_delayed_run_time() const95 TimeTicks TaskMetadata::latest_delayed_run_time() const {
96 DCHECK(!delayed_run_time.is_null());
97 if (delay_policy == subtle::DelayPolicy::kFlexibleNoSooner)
98 return delayed_run_time + leeway;
99 return delayed_run_time;
100 }
101
102 } // namespace base
103