/* * C11 implementation * * (C) Copyright yohhoy 2012. * Copyright 2022 Yonggang Luo * Distributed under the Boost Software License, Version 1.0. * * Permission is hereby granted, free of charge, to any person or * organization obtaining a copy of the software and accompanying * documentation covered by this license (the "Software") to use, * reproduce, display, distribute, execute, and transmit the Software, * and to prepare [[derivative work]]s of the Software, and to permit * third-parties to whom the Software is furnished to do so, all * subject to the following: * * The copyright notices in the Software and this entire statement, * including the above license grant, this restriction and the * following disclaimer, must be included in all copies of the * Software, in whole or in part, and all derivative works of the * Software, unless such copies or derivative works are solely in the * form of machine-executable object code generated by a source * language processor. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND * NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR ANYONE * DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR OTHER * LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #include "time.h" #ifndef KIT_HAVE_TIMESPEC_GET # if defined(_WIN32) && !defined(__CYGWIN__) # ifndef WIN32_LEAN_AND_MEAN # define WIN32_LEAN_AND_MEAN 1 # endif # include int timespec_get(struct timespec *ts, int base) { /* difference between 1970 and 1601 */ # define _TIMESPEC_IMPL_UNIX_EPOCH_IN_TICKS 116444736000000000ull /* 1 tick is 100 nanoseconds */ # define _TIMESPEC_IMPL_TICKS_PER_SECONDS 10000000ull if (!ts) return 0; if (base == TIME_UTC) { FILETIME ft; ULARGE_INTEGER date; LONGLONG ticks; GetSystemTimeAsFileTime(&ft); date.HighPart = ft.dwHighDateTime; date.LowPart = ft.dwLowDateTime; ticks = (LONGLONG) (date.QuadPart - _TIMESPEC_IMPL_UNIX_EPOCH_IN_TICKS); ts->tv_sec = ticks / _TIMESPEC_IMPL_TICKS_PER_SECONDS; ts->tv_nsec = (ticks % _TIMESPEC_IMPL_TICKS_PER_SECONDS) * 100; return base; } return 0; # undef _TIMESPEC_IMPL_UNIX_EPOCH_IN_TICKS # undef _TIMESPEC_IMPL_TICKS_PER_SECONDS } # else int timespec_get(struct timespec *ts, int base) { if (!ts) return 0; if (base == TIME_UTC) { clock_gettime(CLOCK_REALTIME, ts); return base; } return 0; } # endif #endif