From b8dc6b241204f5348563a23f51765234ef19f044 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Thu, 25 Jun 2020 18:07:38 +0200 Subject: [PATCH] ntdll: Move RtlGetSystemTimePrecise() to the Unix library. Signed-off-by: Alexandre Julliard --- dlls/ntdll/time.c | 25 +------------------------ dlls/ntdll/unix/loader.c | 1 + dlls/ntdll/unix/server.c | 2 +- dlls/ntdll/unix/sync.c | 21 +++++++++++++++++++-- dlls/ntdll/unix/unix_private.h | 1 + dlls/ntdll/unixlib.h | 3 ++- 6 files changed, 25 insertions(+), 28 deletions(-) diff --git a/dlls/ntdll/time.c b/dlls/ntdll/time.c index 3174a39c2ca..d6466b9dd1d 100644 --- a/dlls/ntdll/time.c +++ b/dlls/ntdll/time.c @@ -32,9 +32,6 @@ #include #include #include -#ifdef HAVE_SYS_TIME_H -# include -#endif #ifdef HAVE_UNISTD_H # include #endif @@ -399,27 +396,7 @@ NTSTATUS WINAPI NtQuerySystemTime( LARGE_INTEGER *time ) */ LONGLONG WINAPI RtlGetSystemTimePrecise( void ) { - LONGLONG time; - -#ifdef HAVE_CLOCK_GETTIME - struct timespec ts; - - if (!clock_gettime( CLOCK_REALTIME, &ts )) - { - time = ts.tv_sec * (ULONGLONG)TICKSPERSEC + TICKS_1601_TO_1970; - time += (ts.tv_nsec + 50) / 100; - } - else -#endif - { - struct timeval now; - - gettimeofday( &now, 0 ); - time = now.tv_sec * (ULONGLONG)TICKSPERSEC + TICKS_1601_TO_1970; - time += now.tv_usec * 10; - } - - return time; + return unix_funcs->RtlGetSystemTimePrecise(); } /****************************************************************************** diff --git a/dlls/ntdll/unix/loader.c b/dlls/ntdll/unix/loader.c index d8f7ab1bf0d..68018b49fbb 100644 --- a/dlls/ntdll/unix/loader.c +++ b/dlls/ntdll/unix/loader.c @@ -1450,6 +1450,7 @@ static struct unix_funcs unix_funcs = NtWriteVirtualMemory, NtYieldExecution, DbgUiIssueRemoteBreakin, + RtlGetSystemTimePrecise, RtlWaitOnAddress, RtlWakeAddressAll, RtlWakeAddressSingle, diff --git a/dlls/ntdll/unix/server.c b/dlls/ntdll/unix/server.c index 299a311496b..f02d1ed8a20 100644 --- a/dlls/ntdll/unix/server.c +++ b/dlls/ntdll/unix/server.c @@ -679,7 +679,7 @@ unsigned int server_wait( const select_op_t *select_op, data_size_t size, UINT f { LARGE_INTEGER now; - RtlQueryPerformanceCounter(&now); + NtQueryPerformanceCounter( &now, NULL ); abs_timeout -= now.QuadPart; } diff --git a/dlls/ntdll/unix/sync.c b/dlls/ntdll/unix/sync.c index bcf5fef0178..4402584f285 100644 --- a/dlls/ntdll/unix/sync.c +++ b/dlls/ntdll/unix/sync.c @@ -1044,7 +1044,7 @@ NTSTATUS WINAPI NtQueryTimer( HANDLE handle, TIMER_INFORMATION_CLASS class, if (basic_info->RemainingTime.QuadPart > 0) NtQuerySystemTime( &now ); else { - RtlQueryPerformanceCounter( &now ); + NtQueryPerformanceCounter( &now, NULL ); basic_info->RemainingTime.QuadPart = -basic_info->RemainingTime.QuadPart; } @@ -1242,6 +1242,23 @@ ULONG WINAPI NtGetTickCount(void) } +/****************************************************************************** + * RtlGetSystemTimePrecise (NTDLL.@) + */ +LONGLONG WINAPI RtlGetSystemTimePrecise(void) +{ + struct timeval now; +#ifdef HAVE_CLOCK_GETTIME + struct timespec ts; + + if (!clock_gettime( CLOCK_REALTIME, &ts )) + return ts.tv_sec * (ULONGLONG)TICKSPERSEC + TICKS_1601_TO_1970 + (ts.tv_nsec + 50) / 100; +#endif + gettimeofday( &now, 0 ); + return now.tv_sec * (ULONGLONG)TICKSPERSEC + TICKS_1601_TO_1970 + now.tv_usec * 10; +} + + /****************************************************************************** * NtCreateKeyedEvent (NTDLL.@) */ @@ -2248,7 +2265,7 @@ NTSTATUS WINAPI RtlWaitOnAddress( const void *addr, const void *cmp, SIZE_T size { LARGE_INTEGER now; - RtlQueryPerformanceCounter(&now); + NtQueryPerformanceCounter( &now, NULL ); abs_timeout -= now.QuadPart; } diff --git a/dlls/ntdll/unix/unix_private.h b/dlls/ntdll/unix/unix_private.h index 1f06c91eff7..ee6caaec8f5 100644 --- a/dlls/ntdll/unix/unix_private.h +++ b/dlls/ntdll/unix/unix_private.h @@ -89,6 +89,7 @@ extern NTSTATUS CDECL fast_RtlSleepConditionVariableCS( RTL_CONDITION_VARIABLE * RTL_CRITICAL_SECTION *cs, const LARGE_INTEGER *timeout ) DECLSPEC_HIDDEN; extern NTSTATUS CDECL fast_RtlWakeConditionVariable( RTL_CONDITION_VARIABLE *variable, int count ) DECLSPEC_HIDDEN; +extern LONGLONG CDECL fast_RtlGetSystemTimePrecise(void) DECLSPEC_HIDDEN; void CDECL mmap_add_reserved_area( void *addr, SIZE_T size ) DECLSPEC_HIDDEN; void CDECL mmap_remove_reserved_area( void *addr, SIZE_T size ) DECLSPEC_HIDDEN; diff --git a/dlls/ntdll/unixlib.h b/dlls/ntdll/unixlib.h index 3f93b961a69..62117eabb60 100644 --- a/dlls/ntdll/unixlib.h +++ b/dlls/ntdll/unixlib.h @@ -29,7 +29,7 @@ struct msghdr; struct _DISPATCHER_CONTEXT; /* increment this when you change the function table */ -#define NTDLL_UNIXLIB_VERSION 62 +#define NTDLL_UNIXLIB_VERSION 63 struct unix_funcs { @@ -261,6 +261,7 @@ struct unix_funcs /* other Win32 API functions */ NTSTATUS (WINAPI *DbgUiIssueRemoteBreakin)( HANDLE process ); + LONGLONG (WINAPI *RtlGetSystemTimePrecise)(void); NTSTATUS (WINAPI *RtlWaitOnAddress)( const void *addr, const void *cmp, SIZE_T size, const LARGE_INTEGER *timeout ); void (WINAPI *RtlWakeAddressAll)( const void *addr );