1ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
2ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// found in the LICENSE file.
4ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
5ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "net/quic/quic_alarm.h"
6ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
7ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/logging.h"
8ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
9ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochnamespace net {
10ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
11ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochQuicAlarm::QuicAlarm(Delegate* delegate)
12ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    : delegate_(delegate),
13ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      deadline_(QuicTime::Zero()) {
14ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
15ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
16ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochQuicAlarm::~QuicAlarm() {}
17ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
18ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid QuicAlarm::Set(QuicTime deadline) {
19ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  DCHECK(!IsSet());
20ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  DCHECK(deadline.IsInitialized());
21ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  deadline_ = deadline;
22ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  SetImpl();
23ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
24ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
25ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid QuicAlarm::Cancel() {
26ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  deadline_ = QuicTime::Zero();
27ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  CancelImpl();
28ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
29ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
3003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void QuicAlarm::Update(QuicTime deadline, QuicTime::Delta granularity) {
3103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (!deadline.IsInitialized()) {
3203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    Cancel();
3303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return;
3403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
3503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (std::abs(deadline.Subtract(deadline_).ToMicroseconds()) <
3603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          granularity.ToMicroseconds()) {
3703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return;
3803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
3903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  Cancel();
4003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  Set(deadline);
4103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
4203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
43ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbool QuicAlarm::IsSet() const {
44ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  return deadline_.IsInitialized();
45ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
46ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
47ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid QuicAlarm::Fire() {
48ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  if (!deadline_.IsInitialized()) {
49ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    return;
50ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
51ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
52ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  deadline_ = QuicTime::Zero();
53ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  QuicTime deadline = delegate_->OnAlarm();
54ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // delegate_->OnAlarm() might call Set(), in which case  deadline_ will
55ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // already contain the new value, so don't overwrite it.
56ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  if (!deadline_.IsInitialized() && deadline.IsInitialized()) {
57ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    Set(deadline);
58ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
59ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
60ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
61ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}  // namespace net
62