1// Copyright 2013 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.
4
5#include "net/quic/quic_alarm.h"
6
7#include "base/logging.h"
8
9namespace net {
10
11QuicAlarm::QuicAlarm(Delegate* delegate)
12    : delegate_(delegate),
13      deadline_(QuicTime::Zero()) {
14}
15
16QuicAlarm::~QuicAlarm() {}
17
18void QuicAlarm::Set(QuicTime deadline) {
19  DCHECK(!IsSet());
20  DCHECK(deadline.IsInitialized());
21  deadline_ = deadline;
22  SetImpl();
23}
24
25void QuicAlarm::Cancel() {
26  deadline_ = QuicTime::Zero();
27  CancelImpl();
28}
29
30void QuicAlarm::Update(QuicTime deadline, QuicTime::Delta granularity) {
31  if (!deadline.IsInitialized()) {
32    Cancel();
33    return;
34  }
35  if (std::abs(deadline.Subtract(deadline_).ToMicroseconds()) <
36          granularity.ToMicroseconds()) {
37    return;
38  }
39  Cancel();
40  Set(deadline);
41}
42
43bool QuicAlarm::IsSet() const {
44  return deadline_.IsInitialized();
45}
46
47void QuicAlarm::Fire() {
48  if (!deadline_.IsInitialized()) {
49    return;
50  }
51
52  deadline_ = QuicTime::Zero();
53  QuicTime deadline = delegate_->OnAlarm();
54  // delegate_->OnAlarm() might call Set(), in which case  deadline_ will
55  // already contain the new value, so don't overwrite it.
56  if (!deadline_.IsInitialized() && deadline.IsInitialized()) {
57    Set(deadline);
58  }
59}
60
61}  // namespace net
62