106c3fb27SDimitry Andric //===----------------------------------------------------------------------===// 206c3fb27SDimitry Andric // 306c3fb27SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 406c3fb27SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 506c3fb27SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 606c3fb27SDimitry Andric // 706c3fb27SDimitry Andric //===----------------------------------------------------------------------===// 806c3fb27SDimitry Andric 906c3fb27SDimitry Andric #include <__config> 1006c3fb27SDimitry Andric #include <chrono> 1106c3fb27SDimitry Andric #include <filesystem> 1206c3fb27SDimitry Andric #include <time.h> 1306c3fb27SDimitry Andric 1406c3fb27SDimitry Andric #if defined(_LIBCPP_WIN32API) 1506c3fb27SDimitry Andric # include "time_utils.h" 1606c3fb27SDimitry Andric #endif 1706c3fb27SDimitry Andric 1806c3fb27SDimitry Andric #if defined(_LIBCPP_WIN32API) 1906c3fb27SDimitry Andric # define WIN32_LEAN_AND_MEAN 2006c3fb27SDimitry Andric # define NOMINMAX 2106c3fb27SDimitry Andric # include <windows.h> 2206c3fb27SDimitry Andric #endif 2306c3fb27SDimitry Andric 2406c3fb27SDimitry Andric #if __has_include(<unistd.h>) 2506c3fb27SDimitry Andric # include <unistd.h> // _POSIX_TIMERS 2606c3fb27SDimitry Andric #endif 2706c3fb27SDimitry Andric 2806c3fb27SDimitry Andric #if __has_include(<sys/time.h>) 2906c3fb27SDimitry Andric # include <sys/time.h> // for gettimeofday and timeval 3006c3fb27SDimitry Andric #endif 3106c3fb27SDimitry Andric 328a4dda33SDimitry Andric #if defined(__APPLE__) || defined(__gnu_hurd__) || (defined(_POSIX_TIMERS) && _POSIX_TIMERS > 0) 3306c3fb27SDimitry Andric # define _LIBCPP_HAS_CLOCK_GETTIME 3406c3fb27SDimitry Andric #endif 3506c3fb27SDimitry Andric 3606c3fb27SDimitry Andric _LIBCPP_BEGIN_NAMESPACE_FILESYSTEM 3706c3fb27SDimitry Andric 3806c3fb27SDimitry Andric const bool _FilesystemClock::is_steady; 3906c3fb27SDimitry Andric 4006c3fb27SDimitry Andric _FilesystemClock::time_point _FilesystemClock::now() noexcept { 4106c3fb27SDimitry Andric typedef chrono::duration<rep> __secs; 4206c3fb27SDimitry Andric #if defined(_LIBCPP_WIN32API) 4306c3fb27SDimitry Andric typedef chrono::duration<rep, nano> __nsecs; 4406c3fb27SDimitry Andric FILETIME time; 4506c3fb27SDimitry Andric GetSystemTimeAsFileTime(&time); 4606c3fb27SDimitry Andric detail::TimeSpec tp = detail::filetime_to_timespec(time); 47*cb14a3feSDimitry Andric return time_point(__secs(tp.tv_sec) + chrono::duration_cast<duration>(__nsecs(tp.tv_nsec))); 4806c3fb27SDimitry Andric #elif defined(_LIBCPP_HAS_CLOCK_GETTIME) 4906c3fb27SDimitry Andric typedef chrono::duration<rep, nano> __nsecs; 5006c3fb27SDimitry Andric struct timespec tp; 5106c3fb27SDimitry Andric if (0 != clock_gettime(CLOCK_REALTIME, &tp)) 5206c3fb27SDimitry Andric __throw_system_error(errno, "clock_gettime(CLOCK_REALTIME) failed"); 53*cb14a3feSDimitry Andric return time_point(__secs(tp.tv_sec) + chrono::duration_cast<duration>(__nsecs(tp.tv_nsec))); 5406c3fb27SDimitry Andric #else 5506c3fb27SDimitry Andric typedef chrono::duration<rep, micro> __microsecs; 5606c3fb27SDimitry Andric timeval tv; 5706c3fb27SDimitry Andric gettimeofday(&tv, 0); 5806c3fb27SDimitry Andric return time_point(__secs(tv.tv_sec) + __microsecs(tv.tv_usec)); 5906c3fb27SDimitry Andric #endif 6006c3fb27SDimitry Andric } 6106c3fb27SDimitry Andric 6206c3fb27SDimitry Andric _LIBCPP_END_NAMESPACE_FILESYSTEM 63