• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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