1*cc02d7e2SAndroid Build Coastguard Worker //
2*cc02d7e2SAndroid Build Coastguard Worker //
3*cc02d7e2SAndroid Build Coastguard Worker // Copyright 2015 gRPC authors.
4*cc02d7e2SAndroid Build Coastguard Worker //
5*cc02d7e2SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
6*cc02d7e2SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
7*cc02d7e2SAndroid Build Coastguard Worker // You may obtain a copy of the License at
8*cc02d7e2SAndroid Build Coastguard Worker //
9*cc02d7e2SAndroid Build Coastguard Worker // http://www.apache.org/licenses/LICENSE-2.0
10*cc02d7e2SAndroid Build Coastguard Worker //
11*cc02d7e2SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
12*cc02d7e2SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
13*cc02d7e2SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*cc02d7e2SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
15*cc02d7e2SAndroid Build Coastguard Worker // limitations under the License.
16*cc02d7e2SAndroid Build Coastguard Worker //
17*cc02d7e2SAndroid Build Coastguard Worker //
18*cc02d7e2SAndroid Build Coastguard Worker
19*cc02d7e2SAndroid Build Coastguard Worker #include <chrono>
20*cc02d7e2SAndroid Build Coastguard Worker #include <cstdint>
21*cc02d7e2SAndroid Build Coastguard Worker
22*cc02d7e2SAndroid Build Coastguard Worker #include <grpc/support/time.h>
23*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/support/time.h>
24*cc02d7e2SAndroid Build Coastguard Worker
25*cc02d7e2SAndroid Build Coastguard Worker // IWYU pragma: no_include <ratio>
26*cc02d7e2SAndroid Build Coastguard Worker
27*cc02d7e2SAndroid Build Coastguard Worker using std::chrono::duration_cast;
28*cc02d7e2SAndroid Build Coastguard Worker using std::chrono::high_resolution_clock;
29*cc02d7e2SAndroid Build Coastguard Worker using std::chrono::nanoseconds;
30*cc02d7e2SAndroid Build Coastguard Worker using std::chrono::seconds;
31*cc02d7e2SAndroid Build Coastguard Worker using std::chrono::system_clock;
32*cc02d7e2SAndroid Build Coastguard Worker
33*cc02d7e2SAndroid Build Coastguard Worker namespace grpc {
34*cc02d7e2SAndroid Build Coastguard Worker
Timepoint2Timespec(const system_clock::time_point & from,gpr_timespec * to)35*cc02d7e2SAndroid Build Coastguard Worker void Timepoint2Timespec(const system_clock::time_point& from,
36*cc02d7e2SAndroid Build Coastguard Worker gpr_timespec* to) {
37*cc02d7e2SAndroid Build Coastguard Worker system_clock::duration deadline = from.time_since_epoch();
38*cc02d7e2SAndroid Build Coastguard Worker seconds secs = duration_cast<seconds>(deadline);
39*cc02d7e2SAndroid Build Coastguard Worker if (from == system_clock::time_point::max() ||
40*cc02d7e2SAndroid Build Coastguard Worker secs.count() >= gpr_inf_future(GPR_CLOCK_REALTIME).tv_sec ||
41*cc02d7e2SAndroid Build Coastguard Worker secs.count() < 0) {
42*cc02d7e2SAndroid Build Coastguard Worker *to = gpr_inf_future(GPR_CLOCK_REALTIME);
43*cc02d7e2SAndroid Build Coastguard Worker return;
44*cc02d7e2SAndroid Build Coastguard Worker }
45*cc02d7e2SAndroid Build Coastguard Worker nanoseconds nsecs = duration_cast<nanoseconds>(deadline - secs);
46*cc02d7e2SAndroid Build Coastguard Worker to->tv_sec = static_cast<int64_t>(secs.count());
47*cc02d7e2SAndroid Build Coastguard Worker to->tv_nsec = static_cast<int32_t>(nsecs.count());
48*cc02d7e2SAndroid Build Coastguard Worker to->clock_type = GPR_CLOCK_REALTIME;
49*cc02d7e2SAndroid Build Coastguard Worker }
50*cc02d7e2SAndroid Build Coastguard Worker
TimepointHR2Timespec(const high_resolution_clock::time_point & from,gpr_timespec * to)51*cc02d7e2SAndroid Build Coastguard Worker void TimepointHR2Timespec(const high_resolution_clock::time_point& from,
52*cc02d7e2SAndroid Build Coastguard Worker gpr_timespec* to) {
53*cc02d7e2SAndroid Build Coastguard Worker high_resolution_clock::duration deadline = from.time_since_epoch();
54*cc02d7e2SAndroid Build Coastguard Worker seconds secs = duration_cast<seconds>(deadline);
55*cc02d7e2SAndroid Build Coastguard Worker if (from == high_resolution_clock::time_point::max() ||
56*cc02d7e2SAndroid Build Coastguard Worker secs.count() >= gpr_inf_future(GPR_CLOCK_REALTIME).tv_sec ||
57*cc02d7e2SAndroid Build Coastguard Worker secs.count() < 0) {
58*cc02d7e2SAndroid Build Coastguard Worker *to = gpr_inf_future(GPR_CLOCK_REALTIME);
59*cc02d7e2SAndroid Build Coastguard Worker return;
60*cc02d7e2SAndroid Build Coastguard Worker }
61*cc02d7e2SAndroid Build Coastguard Worker nanoseconds nsecs = duration_cast<nanoseconds>(deadline - secs);
62*cc02d7e2SAndroid Build Coastguard Worker to->tv_sec = static_cast<int64_t>(secs.count());
63*cc02d7e2SAndroid Build Coastguard Worker to->tv_nsec = static_cast<int32_t>(nsecs.count());
64*cc02d7e2SAndroid Build Coastguard Worker to->clock_type = GPR_CLOCK_REALTIME;
65*cc02d7e2SAndroid Build Coastguard Worker }
66*cc02d7e2SAndroid Build Coastguard Worker
Timespec2Timepoint(gpr_timespec t)67*cc02d7e2SAndroid Build Coastguard Worker system_clock::time_point Timespec2Timepoint(gpr_timespec t) {
68*cc02d7e2SAndroid Build Coastguard Worker if (gpr_time_cmp(t, gpr_inf_future(t.clock_type)) == 0) {
69*cc02d7e2SAndroid Build Coastguard Worker return system_clock::time_point::max();
70*cc02d7e2SAndroid Build Coastguard Worker }
71*cc02d7e2SAndroid Build Coastguard Worker t = gpr_convert_clock_type(t, GPR_CLOCK_REALTIME);
72*cc02d7e2SAndroid Build Coastguard Worker system_clock::time_point tp;
73*cc02d7e2SAndroid Build Coastguard Worker tp += duration_cast<system_clock::time_point::duration>(seconds(t.tv_sec));
74*cc02d7e2SAndroid Build Coastguard Worker tp +=
75*cc02d7e2SAndroid Build Coastguard Worker duration_cast<system_clock::time_point::duration>(nanoseconds(t.tv_nsec));
76*cc02d7e2SAndroid Build Coastguard Worker return tp;
77*cc02d7e2SAndroid Build Coastguard Worker }
78*cc02d7e2SAndroid Build Coastguard Worker
79*cc02d7e2SAndroid Build Coastguard Worker } // namespace grpc
80