summaryrefslogtreecommitdiff
path: root/grpc/src/core/lib/gprpp/time_util.cc
diff options
context:
space:
mode:
Diffstat (limited to 'grpc/src/core/lib/gprpp/time_util.cc')
-rw-r--r--grpc/src/core/lib/gprpp/time_util.cc77
1 files changed, 77 insertions, 0 deletions
diff --git a/grpc/src/core/lib/gprpp/time_util.cc b/grpc/src/core/lib/gprpp/time_util.cc
new file mode 100644
index 00000000..d3aa25ae
--- /dev/null
+++ b/grpc/src/core/lib/gprpp/time_util.cc
@@ -0,0 +1,77 @@
+//
+// Copyright 2021 the gRPC authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include <grpc/support/port_platform.h>
+
+#include <grpc/support/log.h>
+
+#include "src/core/lib/gprpp/time_util.h"
+
+namespace grpc_core {
+
+gpr_timespec ToGprTimeSpec(absl::Duration duration) {
+ if (duration == absl::InfiniteDuration()) {
+ return gpr_inf_future(GPR_TIMESPAN);
+ } else if (duration == -absl::InfiniteDuration()) {
+ return gpr_inf_past(GPR_TIMESPAN);
+ } else {
+ int64_t s = absl::IDivDuration(duration, absl::Seconds(1), &duration);
+ int64_t n = absl::IDivDuration(duration, absl::Nanoseconds(1), &duration);
+ return gpr_time_add(gpr_time_from_seconds(s, GPR_TIMESPAN),
+ gpr_time_from_nanos(n, GPR_TIMESPAN));
+ }
+}
+
+gpr_timespec ToGprTimeSpec(absl::Time time) {
+ if (time == absl::InfiniteFuture()) {
+ return gpr_inf_future(GPR_CLOCK_REALTIME);
+ } else if (time == absl::InfinitePast()) {
+ return gpr_inf_past(GPR_CLOCK_REALTIME);
+ } else {
+ timespec ts = absl::ToTimespec(time);
+ gpr_timespec out;
+ out.tv_sec = static_cast<decltype(out.tv_sec)>(ts.tv_sec);
+ out.tv_nsec = static_cast<decltype(out.tv_nsec)>(ts.tv_nsec);
+ out.clock_type = GPR_CLOCK_REALTIME;
+ return out;
+ }
+}
+
+absl::Duration ToAbslDuration(gpr_timespec ts) {
+ GPR_ASSERT(ts.clock_type == GPR_TIMESPAN);
+ if (gpr_time_cmp(ts, gpr_inf_future(GPR_TIMESPAN)) == 0) {
+ return absl::InfiniteDuration();
+ } else if (gpr_time_cmp(ts, gpr_inf_past(GPR_TIMESPAN)) == 0) {
+ return -absl::InfiniteDuration();
+ } else {
+ return absl::Seconds(ts.tv_sec) + absl::Nanoseconds(ts.tv_nsec);
+ }
+}
+
+absl::Time ToAbslTime(gpr_timespec ts) {
+ GPR_ASSERT(ts.clock_type != GPR_TIMESPAN);
+ gpr_timespec rts = gpr_convert_clock_type(ts, GPR_CLOCK_REALTIME);
+ if (gpr_time_cmp(rts, gpr_inf_future(GPR_CLOCK_REALTIME)) == 0) {
+ return absl::InfiniteFuture();
+ } else if (gpr_time_cmp(rts, gpr_inf_past(GPR_CLOCK_REALTIME)) == 0) {
+ return absl::InfinitePast();
+ } else {
+ return absl::UnixEpoch() + absl::Seconds(rts.tv_sec) +
+ absl::Nanoseconds(rts.tv_nsec);
+ }
+}
+
+} // namespace grpc_core