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.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=54338
-- v2: kernelbase: Partially implement QueryUnbiasedInterruptTimePrecise. kernelbase: Partially implement QueryInterruptTimePrecise. kernelbase: Implement QueryInterruptTime. include: Add realtimeapiset.h file.
From: Mohamad Al-Jaf mohamadaljaf@gmail.com
--- include/Makefile.in | 1 + include/realtimeapiset.h | 42 ++++++++++++++++++++++++++++++++++++++++ include/winbase.h | 3 +-- 3 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 include/realtimeapiset.h
diff --git a/include/Makefile.in b/include/Makefile.in index 8602dd51e42..e98df3ad0d6 100644 --- a/include/Makefile.in +++ b/include/Makefile.in @@ -629,6 +629,7 @@ SOURCES = \ ras.h \ rasdlg.h \ raserror.h \ + realtimeapiset.h \ reason.h \ regstr.h \ relogger.idl \ diff --git a/include/realtimeapiset.h b/include/realtimeapiset.h new file mode 100644 index 00000000000..124a7987c8c --- /dev/null +++ b/include/realtimeapiset.h @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2023 Mohamad Al-Jaf + * + * 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 HRESULT WINAPI ConvertAuxiliaryCounterToPerformanceCounter(ULONGLONG,ULONGLONG*,ULONGLONG*); +WINBASEAPI HRESULT WINAPI ConvertPerformanceCounterToAuxiliaryCounter(ULONGLONG,ULONGLONG*,ULONGLONG*); +WINBASEAPI HRESULT WINAPI QueryAuxiliaryCounterFrequency(ULONGLONG*); +WINBASEAPI BOOL WINAPI QueryIdleProcessorCycleTime(ULONG*,PULONG64*); +WINBASEAPI BOOL WINAPI QueryIdleProcessorCycleTimeEx(USHORT,ULONG*,ULONG64*); +WINBASEAPI VOID WINAPI QueryInterruptTime(ULONGLONG*); +WINBASEAPI VOID WINAPI QueryInterruptTimePrecise(ULONGLONG*); +WINBASEAPI BOOL WINAPI QueryProcessCycleTime(HANDLE,ULONG64*); +WINBASEAPI BOOL WINAPI QueryThreadCycleTime(HANDLE,ULONG64*); +WINBASEAPI BOOL WINAPI QueryUnbiasedInterruptTime(ULONGLONG*); +WINBASEAPI VOID WINAPI QueryUnbiasedInterruptTimePrecise(ULONGLONG*); + +#ifdef __cplusplus +} +#endif + +#endif /* _REALTIMEAPISET_H_ */ diff --git a/include/winbase.h b/include/winbase.h index 8826251914d..6b3048f795e 100644 --- a/include/winbase.h +++ b/include/winbase.h @@ -46,6 +46,7 @@ extern "C" { #include <synchapi.h> #include <threadpoolapiset.h> #include <memoryapi.h> +#include <realtimeapiset.h>
/* Windows Exit Procedure flag values */ #define WEP_FREE_DLL 0 @@ -2605,8 +2606,6 @@ WINBASEAPI BOOL WINAPI QueryInformationJobObject(HANDLE,JOBOBJECTINFOCLAS WINBASEAPI BOOL WINAPI QueryMemoryResourceNotification(HANDLE,PBOOL); WINBASEAPI BOOL WINAPI QueryPerformanceCounter(LARGE_INTEGER*); WINBASEAPI BOOL WINAPI QueryPerformanceFrequency(LARGE_INTEGER*); -WINBASEAPI BOOL WINAPI QueryProcessCycleTime(HANDLE,PULONG64); -WINBASEAPI BOOL WINAPI QueryThreadCycleTime(HANDLE,PULONG64); WINBASEAPI BOOL WINAPI QueryUmsThreadInformation(PUMS_CONTEXT,UMS_THREAD_INFO_CLASS,PVOID,ULONG,PULONG); WINBASEAPI DWORD WINAPI QueueUserAPC(PAPCFUNC,HANDLE,ULONG_PTR); WINBASEAPI BOOL WINAPI QueueUserWorkItem(LPTHREAD_START_ROUTINE,PVOID,ULONG);
From: Brendan Shanks bshanks@codeweavers.com
--- dlls/kernelbase/kernelbase.spec | 2 +- dlls/kernelbase/sync.c | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-)
diff --git a/dlls/kernelbase/kernelbase.spec b/dlls/kernelbase/kernelbase.spec index 95d4b64d76e..68d037a5aaf 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 60b33af99c3..4ce2834e8b0 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; +} + + /*********************************************************************** * Waits ***********************************************************************/
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 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-)
diff --git a/dlls/kernelbase/kernelbase.spec b/dlls/kernelbase/kernelbase.spec index 68d037a5aaf..d2b1094b50d 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 4ce2834e8b0..10a66a5afe8 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 ); +} + + /*********************************************************************** * Waits ***********************************************************************/
From: Mohamad Al-Jaf mohamadaljaf@gmail.com
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=54338 --- dlls/kernelbase/kernelbase.spec | 2 +- dlls/kernelbase/sync.c | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-)
diff --git a/dlls/kernelbase/kernelbase.spec b/dlls/kernelbase/kernelbase.spec index d2b1094b50d..80cc163468c 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 10a66a5afe8..7144c2681e1 100644 --- a/dlls/kernelbase/sync.c +++ b/dlls/kernelbase/sync.c @@ -234,6 +234,18 @@ void WINAPI DECLSPEC_HOTPATCH QueryInterruptTimePrecise( ULONGLONG *time ) }
+/*********************************************************************** + * QueryUnbiasedInterruptTimePrecise (kernelbase.@) + */ +void WINAPI DECLSPEC_HOTPATCH QueryUnbiasedInterruptTimePrecise( ULONGLONG *time ) +{ + static int once; + if (!once++) FIXME( "(%p): semi-stub.\n", time ); + + RtlQueryUnbiasedInterruptTime( time ); +} + + /*********************************************************************** * Waits ***********************************************************************/
On Tue Feb 7 05:20:15 2023 +0000, Mohamad Al-Jaf wrote:
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.
Ah thank you, I had missed your MR. I've pushed a new version using your commits (with some small changes to keep things consistent)
On Tue Feb 7 05:20:15 2023 +0000, Brendan Shanks wrote:
Ah thank you, I had missed your MR. I've pushed a new version using your commits (with some small changes to keep things consistent)
No problem. Thanks, looks good.
This merge request was approved by Mohamad Al-Jaf.