Swift for Windows uses `QueryInterruptTimePrecise` and `QueryUnbiasedInterruptTimePrecise`. These are semi-stubs since (I believe) the "Precise" variants should read the CPU timestamp directly rather than reading from USER_SHARED_DATA.
From: Brendan Shanks bshanks@codeweavers.com
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=54338 --- dlls/kernelbase/kernelbase.spec | 2 +- dlls/kernelbase/sync.c | 12 ++++++++++++ include/realtimeapiset.h | 32 ++++++++++++++++++++++++++++++++ include/winbase.h | 1 + 4 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 include/realtimeapiset.h
diff --git a/dlls/kernelbase/kernelbase.spec b/dlls/kernelbase/kernelbase.spec index 95d4b64d76e..8596868df61 100644 --- a/dlls/kernelbase/kernelbase.spec +++ b/dlls/kernelbase/kernelbase.spec @@ -1250,7 +1250,7 @@ @ stdcall QueryThreadCycleTime(long ptr) @ stdcall QueryThreadpoolStackInformation(ptr ptr) @ stdcall QueryUnbiasedInterruptTime(ptr) ntdll.RtlQueryUnbiasedInterruptTime -# @ stub QueryUnbiasedInterruptTimePrecise +@ stdcall QueryUnbiasedInterruptTimePrecise(ptr) @ stdcall QueryVirtualMemoryInformation(long ptr long ptr long ptr) @ stdcall QueryWorkingSet(long ptr long) @ stdcall QueryWorkingSetEx(long ptr long) diff --git a/dlls/kernelbase/sync.c b/dlls/kernelbase/sync.c index 60b33af99c3..8e1956c0d6a 100644 --- a/dlls/kernelbase/sync.c +++ b/dlls/kernelbase/sync.c @@ -205,6 +205,18 @@ ULONGLONG WINAPI DECLSPEC_HOTPATCH GetTickCount64(void) }
+/****************************************************************************** + * QueryUnbiasedInterruptTimePrecise (kernelbase.@) + */ +void WINAPI DECLSPEC_HOTPATCH QueryUnbiasedInterruptTimePrecise( ULONGLONG *time ) +{ + static int once; + if (!once++) FIXME( "(%p) semi-stub\n", time ); + + RtlQueryUnbiasedInterruptTime( time ); +} + + /*********************************************************************** * Waits ***********************************************************************/ diff --git a/include/realtimeapiset.h b/include/realtimeapiset.h new file mode 100644 index 00000000000..7c077035147 --- /dev/null +++ b/include/realtimeapiset.h @@ -0,0 +1,32 @@ +/* + * Copyright 2023 Brendan Shanks for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef _REALTIMEAPISET_H +#define _REALTIMEAPISET_H + +#ifdef __cplusplus +extern "C" { +#endif + +WINBASEAPI void WINAPI QueryUnbiasedInterruptTimePrecise(ULONGLONG *); + +#ifdef __cplusplus +} +#endif + +#endif /* _REALTIMEAPISET_H */ diff --git a/include/winbase.h b/include/winbase.h index 8826251914d..6575ed67aef 100644 --- a/include/winbase.h +++ b/include/winbase.h @@ -43,6 +43,7 @@ extern "C" {
#include <libloaderapi.h> #include <processthreadsapi.h> +#include <realtimeapiset.h> #include <synchapi.h> #include <threadpoolapiset.h> #include <memoryapi.h>
From: Brendan Shanks bshanks@codeweavers.com
--- dlls/kernelbase/kernelbase.spec | 2 +- dlls/kernelbase/sync.c | 17 +++++++++++++++++ include/realtimeapiset.h | 1 + 3 files changed, 19 insertions(+), 1 deletion(-)
diff --git a/dlls/kernelbase/kernelbase.spec b/dlls/kernelbase/kernelbase.spec index 8596868df61..d4b838fd532 100644 --- a/dlls/kernelbase/kernelbase.spec +++ b/dlls/kernelbase/kernelbase.spec @@ -1234,7 +1234,7 @@ @ stdcall QueryFullProcessImageNameW(ptr long ptr ptr) # @ stub QueryIdleProcessorCycleTime # @ stub QueryIdleProcessorCycleTimeEx -# @ stub QueryInterruptTime +@ stdcall QueryInterruptTime(ptr) # @ stub QueryInterruptTimePrecise @ stdcall QueryMemoryResourceNotification(ptr ptr) # @ stub QueryOptionalDelayLoadedAPI diff --git a/dlls/kernelbase/sync.c b/dlls/kernelbase/sync.c index 8e1956c0d6a..7cb8527cc59 100644 --- a/dlls/kernelbase/sync.c +++ b/dlls/kernelbase/sync.c @@ -205,6 +205,23 @@ ULONGLONG WINAPI DECLSPEC_HOTPATCH GetTickCount64(void) }
+/****************************************************************************** + * QueryInterruptTime (kernelbase.@) + */ +void WINAPI DECLSPEC_HOTPATCH QueryInterruptTime( ULONGLONG *time ) +{ + ULONG high, low; + + do + { + high = user_shared_data->InterruptTime.High1Time; + low = user_shared_data->InterruptTime.LowPart; + } + while (high != user_shared_data->InterruptTime.High2Time); + *time = (ULONGLONG)high << 32 | low; +} + + /****************************************************************************** * QueryUnbiasedInterruptTimePrecise (kernelbase.@) */ diff --git a/include/realtimeapiset.h b/include/realtimeapiset.h index 7c077035147..49805919924 100644 --- a/include/realtimeapiset.h +++ b/include/realtimeapiset.h @@ -23,6 +23,7 @@ extern "C" { #endif
+WINBASEAPI void WINAPI QueryInterruptTime(ULONGLONG *); WINBASEAPI void WINAPI QueryUnbiasedInterruptTimePrecise(ULONGLONG *);
#ifdef __cplusplus
From: Brendan Shanks bshanks@codeweavers.com
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=54338 --- dlls/kernelbase/kernelbase.spec | 2 +- dlls/kernelbase/sync.c | 12 ++++++++++++ include/realtimeapiset.h | 1 + 3 files changed, 14 insertions(+), 1 deletion(-)
diff --git a/dlls/kernelbase/kernelbase.spec b/dlls/kernelbase/kernelbase.spec index d4b838fd532..80cc163468c 100644 --- a/dlls/kernelbase/kernelbase.spec +++ b/dlls/kernelbase/kernelbase.spec @@ -1235,7 +1235,7 @@ # @ stub QueryIdleProcessorCycleTime # @ stub QueryIdleProcessorCycleTimeEx @ stdcall QueryInterruptTime(ptr) -# @ stub QueryInterruptTimePrecise +@ stdcall QueryInterruptTimePrecise(ptr) @ stdcall QueryMemoryResourceNotification(ptr ptr) # @ stub QueryOptionalDelayLoadedAPI @ stdcall QueryPerformanceCounter(ptr) ntdll.RtlQueryPerformanceCounter diff --git a/dlls/kernelbase/sync.c b/dlls/kernelbase/sync.c index 7cb8527cc59..ee222211db1 100644 --- a/dlls/kernelbase/sync.c +++ b/dlls/kernelbase/sync.c @@ -222,6 +222,18 @@ void WINAPI DECLSPEC_HOTPATCH QueryInterruptTime( ULONGLONG *time ) }
+/****************************************************************************** + * QueryInterruptTimePrecise (kernelbase.@) + */ +void WINAPI DECLSPEC_HOTPATCH QueryInterruptTimePrecise( ULONGLONG *time ) +{ + static int once; + if (!once++) FIXME( "(%p) semi-stub\n", time ); + + QueryInterruptTime( time ); +} + + /****************************************************************************** * QueryUnbiasedInterruptTimePrecise (kernelbase.@) */ diff --git a/include/realtimeapiset.h b/include/realtimeapiset.h index 49805919924..a0250dd2cb6 100644 --- a/include/realtimeapiset.h +++ b/include/realtimeapiset.h @@ -24,6 +24,7 @@ extern "C" { #endif
WINBASEAPI void WINAPI QueryInterruptTime(ULONGLONG *); +WINBASEAPI void WINAPI QueryInterruptTimePrecise(ULONGLONG *); WINBASEAPI void WINAPI QueryUnbiasedInterruptTimePrecise(ULONGLONG *);
#ifdef __cplusplus
Hi, I submitted a MR for QueryUnbiasedInterruptTimePrecise for this Wine-Bug last week: https://gitlab.winehq.org/wine/wine/-/merge_requests/2017
Please use my commits in this MR and I'll close that one.