Added several Polymer resources.
[chromium-blink-merge.git] / remoting / host / backoff_timer.cc
blob16679b5b93f86ba4ac18fb74debef0fa10419845
1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "remoting/host/backoff_timer.h"
7 namespace remoting {
9 BackoffTimer::BackoffTimer() : timer_(new base::Timer(false, false)) {
12 BackoffTimer::~BackoffTimer() {
15 void BackoffTimer::Start(const tracked_objects::Location& posted_from,
16 base::TimeDelta delay,
17 base::TimeDelta max_delay,
18 const base::Closure& user_task) {
19 backoff_policy_.multiply_factor = 2;
20 backoff_policy_.initial_delay_ms = delay.InMilliseconds();
21 backoff_policy_.maximum_backoff_ms = max_delay.InMilliseconds();
22 backoff_policy_.entry_lifetime_ms = -1;
23 backoff_entry_.reset(new net::BackoffEntry(&backoff_policy_));
25 posted_from_ = posted_from;
26 user_task_ = user_task;
27 StartTimer();
30 void BackoffTimer::Stop() {
31 timer_->Stop();
32 user_task_.Reset();
33 backoff_entry_.reset();
36 void BackoffTimer::StartTimer() {
37 timer_->Start(
38 posted_from_, backoff_entry_->GetTimeUntilRelease(),
39 base::Bind(&BackoffTimer::OnTimerFired, base::Unretained(this)));
42 void BackoffTimer::OnTimerFired() {
43 DCHECK(IsRunning());
44 DCHECK(!user_task_.is_null());
45 backoff_entry_->InformOfRequest(false);
46 StartTimer();
48 // Running the user task may destroy this object, so don't reference
49 // any fields of this object after running it.
50 base::Closure user_task(user_task_);
51 user_task.Run();
54 } // namespace remoting