1*635a8641SAndroid Build Coastguard Worker // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file. 4*635a8641SAndroid Build Coastguard Worker 5*635a8641SAndroid Build Coastguard Worker #include "base/time/time.h" 6*635a8641SAndroid Build Coastguard Worker 7*635a8641SAndroid Build Coastguard Worker #include <stdint.h> 8*635a8641SAndroid Build Coastguard Worker #include <sys/time.h> 9*635a8641SAndroid Build Coastguard Worker #include <time.h> 10*635a8641SAndroid Build Coastguard Worker 11*635a8641SAndroid Build Coastguard Worker #include <limits> 12*635a8641SAndroid Build Coastguard Worker 13*635a8641SAndroid Build Coastguard Worker #include "base/logging.h" 14*635a8641SAndroid Build Coastguard Worker 15*635a8641SAndroid Build Coastguard Worker namespace base { 16*635a8641SAndroid Build Coastguard Worker 17*635a8641SAndroid Build Coastguard Worker // static FromTimeSpec(const timespec & ts)18*635a8641SAndroid Build Coastguard WorkerTimeDelta TimeDelta::FromTimeSpec(const timespec& ts) { 19*635a8641SAndroid Build Coastguard Worker return TimeDelta(ts.tv_sec * Time::kMicrosecondsPerSecond + 20*635a8641SAndroid Build Coastguard Worker ts.tv_nsec / Time::kNanosecondsPerMicrosecond); 21*635a8641SAndroid Build Coastguard Worker } 22*635a8641SAndroid Build Coastguard Worker ToTimeSpec() const23*635a8641SAndroid Build Coastguard Workerstruct timespec TimeDelta::ToTimeSpec() const { 24*635a8641SAndroid Build Coastguard Worker int64_t microseconds = InMicroseconds(); 25*635a8641SAndroid Build Coastguard Worker time_t seconds = 0; 26*635a8641SAndroid Build Coastguard Worker if (microseconds >= Time::kMicrosecondsPerSecond) { 27*635a8641SAndroid Build Coastguard Worker seconds = InSeconds(); 28*635a8641SAndroid Build Coastguard Worker microseconds -= seconds * Time::kMicrosecondsPerSecond; 29*635a8641SAndroid Build Coastguard Worker } 30*635a8641SAndroid Build Coastguard Worker struct timespec result = { 31*635a8641SAndroid Build Coastguard Worker seconds, 32*635a8641SAndroid Build Coastguard Worker static_cast<long>(microseconds * Time::kNanosecondsPerMicrosecond)}; 33*635a8641SAndroid Build Coastguard Worker return result; 34*635a8641SAndroid Build Coastguard Worker } 35*635a8641SAndroid Build Coastguard Worker 36*635a8641SAndroid Build Coastguard Worker // static FromTimeVal(struct timeval t)37*635a8641SAndroid Build Coastguard WorkerTime Time::FromTimeVal(struct timeval t) { 38*635a8641SAndroid Build Coastguard Worker DCHECK_LT(t.tv_usec, static_cast<int>(Time::kMicrosecondsPerSecond)); 39*635a8641SAndroid Build Coastguard Worker DCHECK_GE(t.tv_usec, 0); 40*635a8641SAndroid Build Coastguard Worker if (t.tv_usec == 0 && t.tv_sec == 0) 41*635a8641SAndroid Build Coastguard Worker return Time(); 42*635a8641SAndroid Build Coastguard Worker if (t.tv_usec == static_cast<suseconds_t>(Time::kMicrosecondsPerSecond) - 1 && 43*635a8641SAndroid Build Coastguard Worker t.tv_sec == std::numeric_limits<time_t>::max()) 44*635a8641SAndroid Build Coastguard Worker return Max(); 45*635a8641SAndroid Build Coastguard Worker return Time((static_cast<int64_t>(t.tv_sec) * Time::kMicrosecondsPerSecond) + 46*635a8641SAndroid Build Coastguard Worker t.tv_usec + kTimeTToMicrosecondsOffset); 47*635a8641SAndroid Build Coastguard Worker } 48*635a8641SAndroid Build Coastguard Worker ToTimeVal() const49*635a8641SAndroid Build Coastguard Workerstruct timeval Time::ToTimeVal() const { 50*635a8641SAndroid Build Coastguard Worker struct timeval result; 51*635a8641SAndroid Build Coastguard Worker if (is_null()) { 52*635a8641SAndroid Build Coastguard Worker result.tv_sec = 0; 53*635a8641SAndroid Build Coastguard Worker result.tv_usec = 0; 54*635a8641SAndroid Build Coastguard Worker return result; 55*635a8641SAndroid Build Coastguard Worker } 56*635a8641SAndroid Build Coastguard Worker if (is_max()) { 57*635a8641SAndroid Build Coastguard Worker result.tv_sec = std::numeric_limits<time_t>::max(); 58*635a8641SAndroid Build Coastguard Worker result.tv_usec = static_cast<suseconds_t>(Time::kMicrosecondsPerSecond) - 1; 59*635a8641SAndroid Build Coastguard Worker return result; 60*635a8641SAndroid Build Coastguard Worker } 61*635a8641SAndroid Build Coastguard Worker int64_t us = us_ - kTimeTToMicrosecondsOffset; 62*635a8641SAndroid Build Coastguard Worker result.tv_sec = us / Time::kMicrosecondsPerSecond; 63*635a8641SAndroid Build Coastguard Worker result.tv_usec = us % Time::kMicrosecondsPerSecond; 64*635a8641SAndroid Build Coastguard Worker return result; 65*635a8641SAndroid Build Coastguard Worker } 66*635a8641SAndroid Build Coastguard Worker 67*635a8641SAndroid Build Coastguard Worker } // namespace base 68