Chromium Code Reviews| Index: third_party/WebKit/Source/platform/scheduler/base/delayed_switch.cc |
| diff --git a/third_party/WebKit/Source/platform/scheduler/base/delayed_switch.cc b/third_party/WebKit/Source/platform/scheduler/base/delayed_switch.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..a6dcb557c704cdbb99f2cbea4c959838f0cc4326 |
| --- /dev/null |
| +++ b/third_party/WebKit/Source/platform/scheduler/base/delayed_switch.cc |
| @@ -0,0 +1,69 @@ |
| +// Copyright 2016 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 "platform/scheduler/base/delayed_switch.h" |
| + |
| +#include "base/task_runner.h" |
| + |
| +namespace blink { |
| +namespace scheduler { |
| + |
| +DelayedSwitch::DelayedSwitch( |
| + base::TaskRunner* task_runner, |
| + base::TimeDelta disable_delay, |
| + base::Closure enable_callback, |
| + base::Closure disable_callback) |
| + : state_(State::DISABLED), |
| + task_runner_(task_runner), |
| + disable_delay_(disable_delay), |
| + enable_callback_(enable_callback), |
| + disable_callback_(disable_callback), |
| + has_disable_task_queued_(false), |
| + weak_ptr_factory_(this) { |
| + delayed_disable_task_.Reset(base::Bind( |
| + &DelayedSwitch::DoDisable, weak_ptr_factory_.GetWeakPtr())); |
| +} |
| + |
| +DelayedSwitch::~DelayedSwitch() {} |
| + |
| +void DelayedSwitch::Enable() { |
| + // Cancel queued call to |disable_callback|. |
| + delayed_disable_task_.Cancel(); |
|
alex clarke (OOO till 29th)
2016/09/29 11:16:53
DCHECK(task_runner_->RunsTasksOnCurrentThread());
altimin
2016/09/29 16:29:42
Acknowledged.
|
| + has_disable_task_queued_ = false; |
| + |
| + if (state_ == State::ENABLED) |
| + return; |
| + |
| + state_ = State::ENABLED; |
| + |
| + enable_callback_.Run(); |
| +} |
| + |
| +void DelayedSwitch::Disable() { |
| + if (state_ == State::DISABLED) |
|
alex clarke (OOO till 29th)
2016/09/29 11:16:53
DCHECK(task_runner_->RunsTasksOnCurrentThread());
altimin
2016/09/29 16:29:42
Acknowledged.
|
| + return; |
| + |
| + if (has_disable_task_queued_) |
| + return; |
| + |
| + task_runner_->PostDelayedTask( |
| + FROM_HERE, delayed_disable_task_.callback(), disable_delay_); |
| + has_disable_task_queued_ = true; |
| +} |
| + |
| +bool DelayedSwitch::IsEnabled() const { |
| + return state_ == State::ENABLED; |
|
alex clarke (OOO till 29th)
2016/09/29 11:16:53
DCHECK(task_runner_->RunsTasksOnCurrentThread());
altimin
2016/09/29 16:29:42
Acknowledged.
|
| +} |
| + |
| +void DelayedSwitch::DoDisable() { |
| + has_disable_task_queued_ = false; |
| + |
| + DCHECK_EQ(State::ENABLED, state_); |
|
Sami
2016/09/29 13:36:07
Does this work? If so, please mark https://bugs.ch
altimin
2016/09/29 16:29:42
Done.
|
| + state_ = State::DISABLED; |
| + |
| + disable_callback_.Run(); |
| +} |
| + |
| +} // namespace scheduler |
| +} // namespace blink |