summaryrefslogtreecommitdiffstats
path: root/components/scheduler/base/real_time_domain.cc
blob: e9c1c7185ad5b68e3f6946e09d771c3c8e4ff671 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "components/scheduler/base/real_time_domain.h"

#include "base/bind.h"
#include "components/scheduler/base/task_queue_impl.h"
#include "components/scheduler/base/task_queue_manager.h"
#include "components/scheduler/base/task_queue_manager_delegate.h"

namespace scheduler {

RealTimeDomain::RealTimeDomain(const char* tracing_category)
    : TimeDomain(nullptr),
      tracing_category_(tracing_category),
      task_queue_manager_(nullptr) {}

RealTimeDomain::~RealTimeDomain() {}

void RealTimeDomain::OnRegisterWithTaskQueueManager(
    TaskQueueManager* task_queue_manager) {
  task_queue_manager_ = task_queue_manager;
  DCHECK(task_queue_manager_);
}

LazyNow RealTimeDomain::CreateLazyNow() const {
  return task_queue_manager_->CreateLazyNow();
}

base::TimeTicks RealTimeDomain::Now() const {
  return task_queue_manager_->delegate()->NowTicks();
}

base::TimeTicks RealTimeDomain::ComputeDelayedRunTime(
    base::TimeTicks time_domain_now,
    base::TimeDelta delay) const {
  return time_domain_now + delay;
}

void RealTimeDomain::RequestWakeup(base::TimeTicks now, base::TimeDelta delay) {
  // NOTE this is only called if the scheduled runtime is sooner than any
  // previously scheduled runtime, or there is no (outstanding) previously
  // scheduled runtime.
  task_queue_manager_->MaybeScheduleDelayedWork(FROM_HERE, now, delay);
}

bool RealTimeDomain::MaybeAdvanceTime() {
  base::TimeTicks next_run_time;
  if (!NextScheduledRunTime(&next_run_time))
    return false;

  base::TimeTicks now = Now();
  if (now >= next_run_time)
    return true;  // Causes DoWork to post a continuation.

  base::TimeDelta delay = next_run_time - now;
  TRACE_EVENT1(tracing_category_, "RealTimeDomain::MaybeAdvanceTime",
               "delay_ms", delay.InMillisecondsF());

  // The next task is sometime in the future, make sure we schedule a DoWork to
  // run it.
  task_queue_manager_->MaybeScheduleDelayedWork(FROM_HERE, now, delay);
  return false;
}

void RealTimeDomain::AsValueIntoInternal(
    base::trace_event::TracedValue* state) const {}

const char* RealTimeDomain::GetName() const {
  return "RealTimeDomain";
}
}  // namespace scheduler