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 
now()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