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