|  | // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include "base/time/time.h" | 
|  |  | 
|  | #include <stdint.h> | 
|  | #include <sys/time.h> | 
|  | #include <time.h> | 
|  |  | 
|  | #include <limits> | 
|  |  | 
|  | #include "base/logging.h" | 
|  |  | 
|  | namespace base { | 
|  |  | 
|  | // static | 
|  | TimeDelta TimeDelta::FromTimeSpec(const timespec& ts) { | 
|  | return TimeDelta(ts.tv_sec * Time::kMicrosecondsPerSecond + | 
|  | ts.tv_nsec / Time::kNanosecondsPerMicrosecond); | 
|  | } | 
|  |  | 
|  | struct timespec TimeDelta::ToTimeSpec() const { | 
|  | int64_t microseconds = InMicroseconds(); | 
|  | time_t seconds = 0; | 
|  | if (microseconds >= Time::kMicrosecondsPerSecond) { | 
|  | seconds = InSeconds(); | 
|  | microseconds -= seconds * Time::kMicrosecondsPerSecond; | 
|  | } | 
|  | struct timespec result = { | 
|  | seconds, | 
|  | static_cast<long>(microseconds * Time::kNanosecondsPerMicrosecond)}; | 
|  | return result; | 
|  | } | 
|  |  | 
|  | // static | 
|  | Time Time::FromTimeVal(struct timeval t) { | 
|  | DCHECK_LT(t.tv_usec, static_cast<int>(Time::kMicrosecondsPerSecond)); | 
|  | DCHECK_GE(t.tv_usec, 0); | 
|  | if (t.tv_usec == 0 && t.tv_sec == 0) | 
|  | return Time(); | 
|  | if (t.tv_usec == static_cast<suseconds_t>(Time::kMicrosecondsPerSecond) - 1 && | 
|  | t.tv_sec == std::numeric_limits<time_t>::max()) | 
|  | return Max(); | 
|  | return Time((static_cast<int64_t>(t.tv_sec) * Time::kMicrosecondsPerSecond) + | 
|  | t.tv_usec + kTimeTToMicrosecondsOffset); | 
|  | } | 
|  |  | 
|  | struct timeval Time::ToTimeVal() const { | 
|  | struct timeval result; | 
|  | if (is_null()) { | 
|  | result.tv_sec = 0; | 
|  | result.tv_usec = 0; | 
|  | return result; | 
|  | } | 
|  | if (is_max()) { | 
|  | result.tv_sec = std::numeric_limits<time_t>::max(); | 
|  | result.tv_usec = static_cast<suseconds_t>(Time::kMicrosecondsPerSecond) - 1; | 
|  | return result; | 
|  | } | 
|  | int64_t us = us_ - kTimeTToMicrosecondsOffset; | 
|  | result.tv_sec = us / Time::kMicrosecondsPerSecond; | 
|  | result.tv_usec = us % Time::kMicrosecondsPerSecond; | 
|  | return result; | 
|  | } | 
|  |  | 
|  | }  // namespace base |