15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/quic/quic_time.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Highest number of microseconds that DateTimeOffset can hold. 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int64 kQuicInfiniteTimeUs = GG_INT64_C(0x7fffffffffffffff) / 10; 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)QuicTime::Delta::Delta(base::TimeDelta delta) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : delta_(delta) { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)QuicTime::Delta QuicTime::Delta::Zero() { 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return QuicTime::Delta::FromMicroseconds(0); 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)QuicTime::Delta QuicTime::Delta::Infinite() { 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return QuicTime::Delta::FromMicroseconds(kQuicInfiniteTimeUs); 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)QuicTime::Delta QuicTime::Delta::FromSeconds(int64 seconds) { 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return QuicTime::Delta(base::TimeDelta::FromSeconds(seconds)); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)QuicTime::Delta QuicTime::Delta::FromMilliseconds(int64 ms) { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return QuicTime::Delta(base::TimeDelta::FromMilliseconds(ms)); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)QuicTime::Delta QuicTime::Delta::FromMicroseconds(int64 us) { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return QuicTime::Delta(base::TimeDelta::FromMicroseconds(us)); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int64 QuicTime::Delta::ToSeconds() const { 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return delta_.InSeconds(); 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int64 QuicTime::Delta::ToMilliseconds() const { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return delta_.InMilliseconds(); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int64 QuicTime::Delta::ToMicroseconds() const { 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return delta_.InMicroseconds(); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)QuicTime::Delta QuicTime::Delta::Add(const Delta& delta) const { 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return QuicTime::Delta::FromMicroseconds(ToMicroseconds() + 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delta.ToMicroseconds()); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)QuicTime::Delta QuicTime::Delta::Subtract(const Delta& delta) const { 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return QuicTime::Delta::FromMicroseconds(ToMicroseconds() - 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delta.ToMicroseconds()); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool QuicTime::Delta::IsZero() const { 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return delta_.InMicroseconds() == 0; 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool QuicTime::Delta::IsInfinite() const { 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return delta_.InMicroseconds() == kQuicInfiniteTimeUs; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)QuicTime QuicTime::Zero() { 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return QuicTime(base::TimeTicks()); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)QuicTime::QuicTime(base::TimeTicks ticks) 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : ticks_(ticks) { 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)int64 QuicTime::ToDebuggingValue() const { 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ticks_ - base::TimeTicks()).InMicroseconds(); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool QuicTime::IsInitialized() const { 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ticks_ != base::TimeTicks(); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)QuicTime QuicTime::Add(const Delta& delta) const { 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return QuicTime(ticks_ + delta.delta_); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)QuicTime QuicTime::Subtract(const Delta& delta) const { 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return QuicTime(ticks_ - delta.delta_); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)QuicTime::Delta QuicTime::Subtract(const QuicTime& other) const { 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return QuicTime::Delta(ticks_ - other.ticks_); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 102b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// static 103b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)QuicWallTime QuicWallTime::FromUNIXSeconds(uint64 seconds) { 104b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return QuicWallTime(seconds); 105b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)} 106b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 107868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// static 108868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)QuicWallTime QuicWallTime::Zero() { 109868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return QuicWallTime(0); 110868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 111868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 112b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)uint64 QuicWallTime::ToUNIXSeconds() const { 113b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return seconds_; 114b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)} 115b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 116b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)bool QuicWallTime::IsAfter(QuicWallTime other) const { 117b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return seconds_ > other.seconds_; 118b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)} 119b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 120b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)bool QuicWallTime::IsBefore(QuicWallTime other) const { 121b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return seconds_ < other.seconds_; 122b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)} 123b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 124868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool QuicWallTime::IsZero() const { 125868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return seconds_ == 0; 126868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 127868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 128b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)QuicTime::Delta QuicWallTime::AbsoluteDifference(QuicWallTime other) const { 129b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) uint64 d; 130b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 131b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (seconds_ > other.seconds_) { 132b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) d = seconds_ - other.seconds_; 133b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } else { 134b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) d = other.seconds_ - seconds_; 135b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 136b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 137b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (d > static_cast<uint64>(kint64max)) { 138b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) d = kint64max; 139b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 140b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return QuicTime::Delta::FromSeconds(d); 141b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)} 142b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 143b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)QuicWallTime QuicWallTime::Add(QuicTime::Delta delta) const { 144b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) uint64 seconds = seconds_ + delta.ToSeconds(); 145b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (seconds < seconds_) { 146b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) seconds = kuint64max; 147b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 148b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return QuicWallTime(seconds); 149b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)} 150b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 151b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)QuicWallTime QuicWallTime::Subtract(QuicTime::Delta delta) const { 152b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) uint64 seconds = seconds_ - delta.ToSeconds(); 153b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (seconds > seconds_) { 154b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) seconds = 0; 155b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 156b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return QuicWallTime(seconds); 157b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)} 158b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 159b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)QuicWallTime::QuicWallTime(uint64 seconds) 160b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) : seconds_(seconds) { 161b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)} 162b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace net 164