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