xref: /aosp_15_r20/external/libchrome/base/time/time_conversion_posix.cc (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
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 Worker TimeDelta 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 Worker struct 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 Worker Time 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 Worker struct 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