blob: b2398f1dba3802efd742e8e7bb7939a37fa77a3d [file] [log] [blame]
// Copyright 2017 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 "public/platform/WebScopedVirtualTimePauser.h"
#include "base/trace_event/trace_event.h"
#include "platform/scheduler/main_thread/main_thread_scheduler.h"
namespace blink {
WebScopedVirtualTimePauser::WebScopedVirtualTimePauser()
: scheduler_(nullptr) {}
WebScopedVirtualTimePauser::WebScopedVirtualTimePauser(
scheduler::RendererSchedulerImpl* scheduler,
VirtualTaskDuration duration)
: duration_(duration),
scheduler_(scheduler),
trace_id_(WebScopedVirtualTimePauser::next_trace_id_++) {}
WebScopedVirtualTimePauser::~WebScopedVirtualTimePauser() {
if (paused_ && scheduler_)
DecrementVirtualTimePauseCount();
}
WebScopedVirtualTimePauser::WebScopedVirtualTimePauser(
WebScopedVirtualTimePauser&& other) {
virtual_time_when_paused_ = other.virtual_time_when_paused_;
paused_ = other.paused_;
duration_ = other.duration_;
scheduler_ = std::move(other.scheduler_);
other.scheduler_ = nullptr;
trace_id_ = other.trace_id_;
}
WebScopedVirtualTimePauser& WebScopedVirtualTimePauser::operator=(
WebScopedVirtualTimePauser&& other) {
if (scheduler_ && paused_)
DecrementVirtualTimePauseCount();
virtual_time_when_paused_ = other.virtual_time_when_paused_;
paused_ = other.paused_;
duration_ = other.duration_;
scheduler_ = std::move(other.scheduler_);
trace_id_ = other.trace_id_;
other.scheduler_ = nullptr;
return *this;
}
void WebScopedVirtualTimePauser::PauseVirtualTime(bool paused) {
if (paused == paused_ || !scheduler_)
return;
paused_ = paused;
if (paused_) {
TRACE_EVENT_NESTABLE_ASYNC_BEGIN0(
"renderer.scheduler", "WebScopedVirtualTimePauser::PauseVirtualTime",
trace_id_);
virtual_time_when_paused_ = scheduler_->IncrementVirtualTimePauseCount();
} else {
TRACE_EVENT_NESTABLE_ASYNC_END0(
"renderer.scheduler", "WebScopedVirtualTimePauser::PauseVirtualTime",
trace_id_);
DecrementVirtualTimePauseCount();
}
}
void WebScopedVirtualTimePauser::DecrementVirtualTimePauseCount() {
scheduler_->DecrementVirtualTimePauseCount();
if (duration_ == VirtualTaskDuration::kNonInstant) {
scheduler_->MaybeAdvanceVirtualTime(virtual_time_when_paused_ +
base::TimeDelta::FromMilliseconds(10));
}
}
int WebScopedVirtualTimePauser::next_trace_id_ = 0;
} // namespace blink