]> granicus.if.org Git - libevent/commitdiff
evutil_time: improve evutil_gettimeofday on Windows
authorNick Grifka <nigri@microsoft.com>
Mon, 27 Apr 2020 22:02:25 +0000 (15:02 -0700)
committerAzat Khuzhin <azat@libevent.org>
Tue, 28 Apr 2020 21:53:03 +0000 (00:53 +0300)
If present, use GetSystemTimePreciseAsFileTime instead of
GetSystemTimeAsFileTime. Available since Windows 8.

evutil_time.c

index 9faa8ce71919f87b478196223eb1c8ebe7975c47..c327218227a45c97d057c3efc50209302ed9eab1 100644 (file)
@@ -65,6 +65,9 @@
 
 #ifndef EVENT__HAVE_GETTIMEOFDAY
 /* No gettimeofday; this must be windows. */
+
+typedef void (WINAPI *GetSystemTimePreciseAsFileTime_fn_t) (LPFILETIME);
+
 int
 evutil_gettimeofday(struct timeval *tv, struct timezone *tz)
 {
@@ -90,7 +93,22 @@ evutil_gettimeofday(struct timeval *tv, struct timezone *tz)
        if (tv == NULL)
                return -1;
 
-       GetSystemTimeAsFileTime(&ft.ft_ft);
+       static GetSystemTimePreciseAsFileTime_fn_t GetSystemTimePreciseAsFileTime_fn = NULL;
+       static int check_precise = 1;
+
+       if (EVUTIL_UNLIKELY(check_precise)) {
+               HMODULE h = evutil_load_windows_system_library_(TEXT("kernel32.dll"));
+               if (h != NULL)
+                       GetSystemTimePreciseAsFileTime_fn =
+                               (GetSystemTimePreciseAsFileTime_fn_t)
+                                       GetProcAddress(h, "GetSystemTimePreciseAsFileTime");
+               check_precise = 0;
+       }
+
+       if (GetSystemTimePreciseAsFileTime_fn != NULL)
+               GetSystemTimePreciseAsFileTime_fn(&ft.ft_ft);
+       else
+               GetSystemTimeAsFileTime(&ft.ft_ft);
 
        if (EVUTIL_UNLIKELY(ft.ft_64 < EPOCH_BIAS)) {
                /* Time before the unix epoch. */