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