Module: wine Branch: master Commit: b8dc6b241204f5348563a23f51765234ef19f044 URL: https://source.winehq.org/git/wine.git/?a=commit;h=b8dc6b241204f5348563a23f5...
Author: Alexandre Julliard julliard@winehq.org Date: Thu Jun 25 18:07:38 2020 +0200
ntdll: Move RtlGetSystemTimePrecise() to the Unix library.
Signed-off-by: Alexandre Julliard julliard@winehq.org
---
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 3174a39c2c..d6466b9dd1 100644 --- a/dlls/ntdll/time.c +++ b/dlls/ntdll/time.c @@ -32,9 +32,6 @@ #include <string.h> #include <limits.h> #include <time.h> -#ifdef HAVE_SYS_TIME_H -# include <sys/time.h> -#endif #ifdef HAVE_UNISTD_H # include <unistd.h> #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 d8f7ab1bf0..68018b49fb 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 299a311496..f02d1ed8a2 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 bcf5fef017..4402584f28 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 1f06c91eff..ee6caaec8f 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 3f93b961a6..62117eabb6 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 );