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