1df51be85SLouis Dionne // -*- C++ -*- 2df51be85SLouis Dionne //===----------------------------------------------------------------------===// 3df51be85SLouis Dionne // 4df51be85SLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5df51be85SLouis Dionne // See https://llvm.org/LICENSE.txt for license information. 6df51be85SLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7df51be85SLouis Dionne // 8df51be85SLouis Dionne //===----------------------------------------------------------------------===// 9480cd780SLouis Dionne 10df51be85SLouis Dionne #ifndef _LIBCPP___CHRONO_CONVERT_TO_TIMESPEC_H 11df51be85SLouis Dionne #define _LIBCPP___CHRONO_CONVERT_TO_TIMESPEC_H 12df51be85SLouis Dionne 13df51be85SLouis Dionne #include <__chrono/duration.h> 14df51be85SLouis Dionne #include <__config> 15df51be85SLouis Dionne #include <limits> 16df51be85SLouis Dionne 17df51be85SLouis Dionne #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 18df51be85SLouis Dionne # pragma GCC system_header 19df51be85SLouis Dionne #endif 20df51be85SLouis Dionne 21df51be85SLouis Dionne _LIBCPP_PUSH_MACROS 22df51be85SLouis Dionne #include <__undef_macros> 23df51be85SLouis Dionne 24df51be85SLouis Dionne _LIBCPP_BEGIN_NAMESPACE_STD 25df51be85SLouis Dionne 26df51be85SLouis Dionne // Convert a nanoseconds duration to the given TimeSpec type, which must have 27df51be85SLouis Dionne // the same properties as std::timespec. 28df51be85SLouis Dionne template <class _TimeSpec> __convert_to_timespec(const chrono::nanoseconds & __ns)29*9783f28cSLouis Dionne_LIBCPP_HIDE_FROM_ABI inline _TimeSpec __convert_to_timespec(const chrono::nanoseconds& __ns) { 30df51be85SLouis Dionne using namespace chrono; 31df51be85SLouis Dionne seconds __s = duration_cast<seconds>(__ns); 32df51be85SLouis Dionne _TimeSpec __ts; 33df51be85SLouis Dionne typedef decltype(__ts.tv_sec) __ts_sec; 34df51be85SLouis Dionne const __ts_sec __ts_sec_max = numeric_limits<__ts_sec>::max(); 35df51be85SLouis Dionne 36*9783f28cSLouis Dionne if (__s.count() < __ts_sec_max) { 37df51be85SLouis Dionne __ts.tv_sec = static_cast<__ts_sec>(__s.count()); 38df51be85SLouis Dionne __ts.tv_nsec = static_cast<decltype(__ts.tv_nsec)>((__ns - __s).count()); 39*9783f28cSLouis Dionne } else { 40df51be85SLouis Dionne __ts.tv_sec = __ts_sec_max; 41df51be85SLouis Dionne __ts.tv_nsec = 999999999; // (10^9 - 1) 42df51be85SLouis Dionne } 43df51be85SLouis Dionne 44df51be85SLouis Dionne return __ts; 45df51be85SLouis Dionne } 46df51be85SLouis Dionne 47df51be85SLouis Dionne _LIBCPP_END_NAMESPACE_STD 48df51be85SLouis Dionne 49df51be85SLouis Dionne _LIBCPP_POP_MACROS 50df51be85SLouis Dionne 51df51be85SLouis Dionne #endif // _LIBCPP___CHRONO_CONVERT_TO_TIMESPEC_H 52