kernel32: Factor out all kernel32 timeout-conversion snippets to one helper functions.
diff --git a/dlls/kernel32/sync.c b/dlls/kernel32/sync.c
index ff987c3..be536a4 100644
--- a/dlls/kernel32/sync.c
+++ b/dlls/kernel32/sync.c
@@ -82,6 +82,14 @@
return handle;
}
+/* helper for kernel32->ntdll timeout format conversion */
+static inline PLARGE_INTEGER get_nt_timeout( PLARGE_INTEGER pTime, DWORD timeout )
+{
+ if (timeout == INFINITE) return NULL;
+ pTime->QuadPart = (ULONGLONG)timeout * -10000;
+ return pTime;
+}
+
/***********************************************************************
* Sleep (KERNEL32.@)
*/
@@ -96,18 +104,11 @@
DWORD WINAPI SleepEx( DWORD timeout, BOOL alertable )
{
NTSTATUS status;
+ LARGE_INTEGER time;
- if (timeout == INFINITE) status = NtDelayExecution( alertable, NULL );
- else
- {
- LARGE_INTEGER time;
-
- time.QuadPart = timeout * (ULONGLONG)10000;
- time.QuadPart = -time.QuadPart;
- status = NtDelayExecution( alertable, &time );
- }
- if (status != STATUS_USER_APC) status = STATUS_SUCCESS;
- return status;
+ status = NtDelayExecution( alertable, get_nt_timeout( &time, timeout ) );
+ if (status == STATUS_USER_APC) return WAIT_IO_COMPLETION;
+ return 0;
}
@@ -158,6 +159,7 @@
{
NTSTATUS status;
HANDLE hloc[MAXIMUM_WAIT_OBJECTS];
+ LARGE_INTEGER time;
unsigned int i;
if (count > MAXIMUM_WAIT_OBJECTS)
@@ -187,18 +189,8 @@
}
}
- if (timeout == INFINITE)
- {
- status = NtWaitForMultipleObjects( count, hloc, wait_all, alertable, NULL );
- }
- else
- {
- LARGE_INTEGER time;
-
- time.QuadPart = timeout * (ULONGLONG)10000;
- time.QuadPart = -time.QuadPart;
- status = NtWaitForMultipleObjects( count, hloc, wait_all, alertable, &time );
- }
+ status = NtWaitForMultipleObjects( count, hloc, wait_all, alertable,
+ get_nt_timeout( &time, timeout ) );
if (HIWORD(status)) /* is it an error code? */
{
@@ -302,20 +294,13 @@
DWORD dwMilliseconds, BOOL bAlertable )
{
NTSTATUS status;
- LARGE_INTEGER timeout, *ptimeout = NULL;
+ LARGE_INTEGER timeout;
TRACE("%p %p %d %d\n", hObjectToSignal,
hObjectToWaitOn, dwMilliseconds, bAlertable);
- if (dwMilliseconds != INFINITE)
- {
- timeout.QuadPart = dwMilliseconds * (ULONGLONG)10000;
- timeout.QuadPart = -timeout.QuadPart;
- ptimeout = &timeout;
- }
-
- status = NtSignalAndWaitForSingleObject( hObjectToSignal, hObjectToWaitOn,
- bAlertable, ptimeout );
+ status = NtSignalAndWaitForSingleObject( hObjectToSignal, hObjectToWaitOn, bAlertable,
+ get_nt_timeout( &timeout, dwMilliseconds ) );
if (HIWORD(status))
{
SetLastError( RtlNtStatusToDosError(status) );