11cb0ef41Sopenharmony_ci/*
21cb0ef41Sopenharmony_ci * nghttp2 - HTTP/2 C Library
31cb0ef41Sopenharmony_ci *
41cb0ef41Sopenharmony_ci * Copyright (c) 2023 nghttp2 contributors
51cb0ef41Sopenharmony_ci *
61cb0ef41Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining
71cb0ef41Sopenharmony_ci * a copy of this software and associated documentation files (the
81cb0ef41Sopenharmony_ci * "Software"), to deal in the Software without restriction, including
91cb0ef41Sopenharmony_ci * without limitation the rights to use, copy, modify, merge, publish,
101cb0ef41Sopenharmony_ci * distribute, sublicense, and/or sell copies of the Software, and to
111cb0ef41Sopenharmony_ci * permit persons to whom the Software is furnished to do so, subject to
121cb0ef41Sopenharmony_ci * the following conditions:
131cb0ef41Sopenharmony_ci *
141cb0ef41Sopenharmony_ci * The above copyright notice and this permission notice shall be
151cb0ef41Sopenharmony_ci * included in all copies or substantial portions of the Software.
161cb0ef41Sopenharmony_ci *
171cb0ef41Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
181cb0ef41Sopenharmony_ci * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
191cb0ef41Sopenharmony_ci * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
201cb0ef41Sopenharmony_ci * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
211cb0ef41Sopenharmony_ci * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
221cb0ef41Sopenharmony_ci * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
231cb0ef41Sopenharmony_ci * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
241cb0ef41Sopenharmony_ci */
251cb0ef41Sopenharmony_ci#include "nghttp2_time.h"
261cb0ef41Sopenharmony_ci
271cb0ef41Sopenharmony_ci#ifdef HAVE_TIME_H
281cb0ef41Sopenharmony_ci#  include <time.h>
291cb0ef41Sopenharmony_ci#endif /* HAVE_TIME_H */
301cb0ef41Sopenharmony_ci
311cb0ef41Sopenharmony_ci#ifdef HAVE_SYSINFOAPI_H
321cb0ef41Sopenharmony_ci#  include <sysinfoapi.h>
331cb0ef41Sopenharmony_ci#endif /* HAVE_SYSINFOAPI_H */
341cb0ef41Sopenharmony_ci
351cb0ef41Sopenharmony_ci#ifndef HAVE_GETTICKCOUNT64
361cb0ef41Sopenharmony_cistatic uint64_t time_now_sec(void) {
371cb0ef41Sopenharmony_ci  time_t t = time(NULL);
381cb0ef41Sopenharmony_ci
391cb0ef41Sopenharmony_ci  if (t == -1) {
401cb0ef41Sopenharmony_ci    return 0;
411cb0ef41Sopenharmony_ci  }
421cb0ef41Sopenharmony_ci
431cb0ef41Sopenharmony_ci  return (uint64_t)t;
441cb0ef41Sopenharmony_ci}
451cb0ef41Sopenharmony_ci#endif /* HAVE_GETTICKCOUNT64 */
461cb0ef41Sopenharmony_ci
471cb0ef41Sopenharmony_ci#ifdef HAVE_CLOCK_GETTIME
481cb0ef41Sopenharmony_ciuint64_t nghttp2_time_now_sec(void) {
491cb0ef41Sopenharmony_ci  struct timespec tp;
501cb0ef41Sopenharmony_ci  int rv = clock_gettime(CLOCK_MONOTONIC, &tp);
511cb0ef41Sopenharmony_ci
521cb0ef41Sopenharmony_ci  if (rv == -1) {
531cb0ef41Sopenharmony_ci    return time_now_sec();
541cb0ef41Sopenharmony_ci  }
551cb0ef41Sopenharmony_ci
561cb0ef41Sopenharmony_ci  return (uint64_t)tp.tv_sec;
571cb0ef41Sopenharmony_ci}
581cb0ef41Sopenharmony_ci#elif defined(HAVE_GETTICKCOUNT64)
591cb0ef41Sopenharmony_ciuint64_t nghttp2_time_now_sec(void) { return GetTickCount64() / 1000; }
601cb0ef41Sopenharmony_ci#else  /* !HAVE_CLOCK_GETTIME && !HAVE_GETTICKCOUNT64 */
611cb0ef41Sopenharmony_ciuint64_t nghttp2_time_now_sec(void) { return time_now_sec(); }
621cb0ef41Sopenharmony_ci#endif /* !HAVE_CLOCK_GETTIME && !HAVE_GETTICKCOUNT64 */
63