[PATCH] kernel32: Move the implementation of GetTickCount() to kernel32.
Andrew Wesie
awesie at gmail.com
Thu May 30 11:12:47 CDT 2019
If we are going to duplicate the functionality of monotonic_counter,
can we add a test to ensure that it stays in sync with the ntdll
functions? I've attached a test that should work.
On Thu, May 30, 2019 at 3:49 AM Huw Davies <huw at codeweavers.com> wrote:
>
> Fixes regression caused by 3e927c4aec9dbeef930b83f62ee0651b8c147247
>
> Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=47265
> Signed-off-by: Huw Davies <huw at codeweavers.com>
> ---
> dlls/kernel32/kernel32.spec | 4 +--
> dlls/kernel32/time.c | 57 +++++++++++++++++++++++++++++++++++++
> dlls/ntdll/ntdll.spec | 4 +--
> dlls/ntdll/ntdll_misc.h | 4 ---
> dlls/ntdll/time.c | 2 +-
> 5 files changed, 62 insertions(+), 9 deletions(-)
>
> diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec
> index 5f3f1fa65b..c01f132371 100644
> --- a/dlls/kernel32/kernel32.spec
> +++ b/dlls/kernel32/kernel32.spec
> @@ -858,8 +858,8 @@
> @ stdcall GetThreadPriorityBoost(long ptr)
> @ stdcall GetThreadSelectorEntry(long long ptr)
> @ stdcall GetThreadTimes(long ptr ptr ptr ptr)
> -@ stdcall GetTickCount() ntdll.NtGetTickCount
> -@ stdcall -ret64 GetTickCount64() ntdll.NtGetTickCount
> +@ stdcall GetTickCount()
> +@ stdcall -ret64 GetTickCount64()
> @ stdcall GetTimeFormatA(long long ptr str ptr long)
> @ stdcall GetTimeFormatEx(wstr long ptr wstr ptr long)
> @ stdcall GetTimeFormatW(long long ptr wstr ptr long)
> diff --git a/dlls/kernel32/time.c b/dlls/kernel32/time.c
> index 00fcc6bde7..737affcb38 100644
> --- a/dlls/kernel32/time.c
> +++ b/dlls/kernel32/time.c
> @@ -38,6 +38,9 @@
> #elif defined(HAVE_MACHINE_LIMITS_H)
> #include <machine/limits.h>
> #endif
> +#ifdef __APPLE__
> +# include <mach/mach_time.h>
> +#endif
>
> #include "ntstatus.h"
> #define WIN32_NO_STATUS
> @@ -64,6 +67,33 @@ static inline LONGLONG filetime_to_longlong( const FILETIME *ft )
> return (((LONGLONG)ft->dwHighDateTime) << 32) + ft->dwLowDateTime;
> }
>
> +#define TICKSPERSEC 10000000
> +#define TICKSPERMSEC 10000
> +
> +/* return a monotonic time counter, in Win32 ticks */
> +static inline ULONGLONG monotonic_counter(void)
> +{
> + LARGE_INTEGER counter;
> +
> +#ifdef __APPLE__
> + static mach_timebase_info_data_t timebase;
> +
> + if (!timebase.denom) mach_timebase_info( &timebase );
> + return mach_absolute_time() * timebase.numer / timebase.denom / 100;
> +#elif defined(HAVE_CLOCK_GETTIME)
> + struct timespec ts;
> +#ifdef CLOCK_MONOTONIC_RAW
> + if (!clock_gettime( CLOCK_MONOTONIC_RAW, &ts ))
> + return ts.tv_sec * (ULONGLONG)TICKSPERSEC + ts.tv_nsec / 100;
> +#endif
> + if (!clock_gettime( CLOCK_MONOTONIC, &ts ))
> + return ts.tv_sec * (ULONGLONG)TICKSPERSEC + ts.tv_nsec / 100;
> +#endif
> +
> + NtQueryPerformanceCounter( &counter, NULL );
> + return counter.QuadPart;
> +}
> +
> static const WCHAR mui_stdW[] = { 'M','U','I','_','S','t','d',0 };
> static const WCHAR mui_dltW[] = { 'M','U','I','_','D','l','t',0 };
>
> @@ -1528,3 +1558,30 @@ BOOL WINAPI QueryUnbiasedInterruptTime(ULONGLONG *time)
> RtlQueryUnbiasedInterruptTime(time);
> return TRUE;
> }
> +
> +/******************************************************************************
> + * GetTickCount64 (KERNEL32.@)
> + */
> +ULONGLONG WINAPI DECLSPEC_HOTPATCH GetTickCount64(void)
> +{
> + return monotonic_counter() / TICKSPERMSEC;
> +}
> +
> +/***********************************************************************
> + * GetTickCount (KERNEL32.@)
> + *
> + * Get the number of milliseconds the system has been running.
> + *
> + * PARAMS
> + * None.
> + *
> + * RETURNS
> + * The current tick count.
> + *
> + * NOTES
> + * The value returned will wrap around every 2^32 milliseconds.
> + */
> +DWORD WINAPI DECLSPEC_HOTPATCH GetTickCount(void)
> +{
> + return monotonic_counter() / TICKSPERMSEC;
> +}
> diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec
> index 050ebc7641..aeb9735ba1 100644
> --- a/dlls/ntdll/ntdll.spec
> +++ b/dlls/ntdll/ntdll.spec
> @@ -194,7 +194,7 @@
> @ stdcall NtGetCurrentProcessorNumber()
> # @ stub NtGetDevicePowerState
> @ stub NtGetPlugPlayEvent
> -@ stdcall -ret64 NtGetTickCount() get_tick_count64
> +@ stdcall NtGetTickCount()
> @ stdcall NtGetWriteWatch(long long ptr long ptr ptr ptr)
> @ stdcall NtImpersonateAnonymousToken(long)
> @ stub NtImpersonateClientOfPort
> @@ -1142,7 +1142,7 @@
> @ stdcall -private ZwGetCurrentProcessorNumber() NtGetCurrentProcessorNumber
> # @ stub ZwGetDevicePowerState
> @ stub ZwGetPlugPlayEvent
> -@ stdcall -private -ret64 ZwGetTickCount() get_tick_count64
> +@ stdcall -private ZwGetTickCount() NtGetTickCount
> @ stdcall -private ZwGetWriteWatch(long long ptr long ptr ptr ptr) NtGetWriteWatch
> @ stdcall -private ZwImpersonateAnonymousToken(long) NtImpersonateAnonymousToken
> @ stub ZwImpersonateClientOfPort
> diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h
> index 2d83f541bd..3463ebd38a 100644
> --- a/dlls/ntdll/ntdll_misc.h
> +++ b/dlls/ntdll/ntdll_misc.h
> @@ -268,8 +268,4 @@ void WINAPI LdrInitializeThunk(CONTEXT*,void**,ULONG_PTR,ULONG_PTR);
> /* string functions */
> int __cdecl NTDLL_tolower( int c );
> int __cdecl _stricmp( LPCSTR str1, LPCSTR str2 );
> -
> -/* time functions */
> -ULONGLONG WINAPI get_tick_count64( void );
> -#define NtGetTickCount get_tick_count64
> #endif
> diff --git a/dlls/ntdll/time.c b/dlls/ntdll/time.c
> index 41e456398e..20de627c28 100644
> --- a/dlls/ntdll/time.c
> +++ b/dlls/ntdll/time.c
> @@ -557,7 +557,7 @@ NTSTATUS WINAPI NtQueryPerformanceCounter( LARGE_INTEGER *counter, LARGE_INTEGER
> * NtGetTickCount (NTDLL.@)
> * ZwGetTickCount (NTDLL.@)
> */
> -ULONGLONG WINAPI DECLSPEC_HOTPATCH get_tick_count64(void)
> +ULONG WINAPI NtGetTickCount(void)
> {
> return monotonic_counter() / TICKSPERMSEC;
> }
> --
> 2.17.1
>
>
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-kernel32-tests-Compare-GetTickCount-to-ntdll-functio.patch
Type: application/octet-stream
Size: 4758 bytes
Desc: not available
URL: <http://www.winehq.org/pipermail/wine-devel/attachments/20190530/f9701f58/attachment.obj>
More information about the wine-devel
mailing list