| // 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 |