blob: a92144be83f9a57dfdb07de94471dc91a625f0bb [file] [log] [blame]
Greg Kraynov2d33cfb2018-05-24 20:02:041// Copyright 2018 The Chromium Authors. All rights reserved.
alexclarke1794435f2015-07-23 11:50:352// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Greg Kraynov2d33cfb2018-05-24 20:02:045#include "base/task/sequence_manager/lazy_now.h"
alexclarke1794435f2015-07-23 11:50:356
alexclarkef65eb2d2015-11-03 18:24:167#include "base/time/tick_clock.h"
alexclarke1794435f2015-07-23 11:50:358
Greg Kraynov8f4784462018-05-14 10:08:219namespace base {
10namespace sequence_manager {
Greg Kraynov1f358aca2018-04-27 18:51:3311
Greg Kraynov02e83f92018-05-24 11:22:5212LazyNow::LazyNow(TimeTicks now) : tick_clock_(nullptr), now_(now) {}
Greg Kraynov1f358aca2018-04-27 18:51:3313
Greg Kraynov8f4784462018-05-14 10:08:2114LazyNow::LazyNow(const TickClock* tick_clock)
Greg Kraynov1f358aca2018-04-27 18:51:3315 : tick_clock_(tick_clock), now_() {
16 DCHECK(tick_clock);
17}
18
19LazyNow::LazyNow(LazyNow&& move_from)
20 : tick_clock_(move_from.tick_clock_), now_(move_from.now_) {
21 move_from.tick_clock_ = nullptr;
Greg Kraynov02e83f92018-05-24 11:22:5222 move_from.now_ = nullopt;
Greg Kraynov1f358aca2018-04-27 18:51:3323}
24
Greg Kraynov8f4784462018-05-14 10:08:2125TimeTicks LazyNow::Now() {
Greg Kraynov02e83f92018-05-24 11:22:5226 // It looks tempting to avoid using Optional and to rely on is_null() instead,
27 // but in some test environments clock intentionally starts from zero.
28 if (!now_) {
Greg Kraynov1f358aca2018-04-27 18:51:3329 DCHECK(tick_clock_); // It can fire only on use after std::move.
alexclarkef65eb2d2015-11-03 18:24:1630 now_ = tick_clock_->NowTicks();
Greg Kraynov1f358aca2018-04-27 18:51:3331 }
Greg Kraynov02e83f92018-05-24 11:22:5232 return *now_;
alexclarke1794435f2015-07-23 11:50:3533}
34
Greg Kraynov8f4784462018-05-14 10:08:2135} // namespace sequence_manager
36} // namespace base