Alexandre Julliard : ntdll: Pass a select operation structure to NTDLL_wait_for_multiple_objects.
Module: wine Branch: master Commit: cbdc0ec72d917334059dd1ab0d17375594442aa0 URL: http://source.winehq.org/git/wine.git/?a=commit;h=cbdc0ec72d917334059dd1ab0d... Author: Alexandre Julliard <julliard(a)winehq.org> Date: Thu Aug 22 10:53:45 2013 +0200 ntdll: Pass a select operation structure to NTDLL_wait_for_multiple_objects. --- dlls/ntdll/critsection.c | 5 ++++- dlls/ntdll/exception.c | 13 ++++++++----- dlls/ntdll/ntdll_misc.h | 2 +- dlls/ntdll/sync.c | 22 ++++++++++++---------- 4 files changed, 25 insertions(+), 17 deletions(-) diff --git a/dlls/ntdll/critsection.c b/dlls/ntdll/critsection.c index dcc66e0..6f0b5d5 100644 --- a/dlls/ntdll/critsection.c +++ b/dlls/ntdll/critsection.c @@ -230,9 +230,12 @@ static inline NTSTATUS wait_semaphore( RTL_CRITICAL_SECTION *crit, int timeout ) { HANDLE sem = get_semaphore( crit ); LARGE_INTEGER time; + select_op_t select_op; time.QuadPart = timeout * (LONGLONG)-10000000; - ret = NTDLL_wait_for_multiple_objects( 1, &sem, 0, &time, 0 ); + select_op.wait.op = SELECT_WAIT; + select_op.wait.handles[0] = wine_server_obj_handle( sem ); + ret = NTDLL_wait_for_multiple_objects( &select_op, offsetof( select_op_t, wait.handles[1] ), 0, &time, 0 ); } return ret; } diff --git a/dlls/ntdll/exception.c b/dlls/ntdll/exception.c index faa9e0d..99fac41 100644 --- a/dlls/ntdll/exception.c +++ b/dlls/ntdll/exception.c @@ -81,7 +81,7 @@ void wait_suspend( CONTEXT *context ) /* wait with 0 timeout, will only return once the thread is no longer suspended */ timeout.QuadPart = 0; - NTDLL_wait_for_multiple_objects( 0, NULL, SELECT_INTERRUPTIBLE, &timeout, 0 ); + NTDLL_wait_for_multiple_objects( NULL, 0, SELECT_INTERRUPTIBLE, &timeout, 0 ); /* retrieve the new context */ SERVER_START_REQ( get_suspend_context ) @@ -105,9 +105,10 @@ NTSTATUS send_debug_event( EXCEPTION_RECORD *rec, int first_chance, CONTEXT *con { NTSTATUS ret; DWORD i; - HANDLE handle = 0; + obj_handle_t handle = 0; client_ptr_t params[EXCEPTION_MAXIMUM_PARAMETERS]; context_t server_context; + select_op_t select_op; if (!NtCurrentTeb()->Peb->BeingDebugged) return 0; /* no debugger present */ @@ -126,16 +127,18 @@ NTSTATUS send_debug_event( EXCEPTION_RECORD *rec, int first_chance, CONTEXT *con req->len = i * sizeof(params[0]); wine_server_add_data( req, params, req->len ); wine_server_add_data( req, &server_context, sizeof(server_context) ); - if (!wine_server_call( req )) handle = wine_server_ptr_handle( reply->handle ); + if (!wine_server_call( req )) handle = reply->handle; } SERVER_END_REQ; if (!handle) return 0; - NTDLL_wait_for_multiple_objects( 1, &handle, SELECT_INTERRUPTIBLE, NULL, 0 ); + select_op.wait.op = SELECT_WAIT; + select_op.wait.handles[0] = handle; + NTDLL_wait_for_multiple_objects( &select_op, offsetof( select_op_t, wait.handles[1] ), SELECT_INTERRUPTIBLE, NULL, 0 ); SERVER_START_REQ( get_exception_status ) { - req->handle = wine_server_obj_handle( handle ); + req->handle = handle; wine_server_set_reply( req, &server_context, sizeof(server_context) ); ret = wine_server_call( req ); } diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h index 7a0d925..225121f 100644 --- a/dlls/ntdll/ntdll_misc.h +++ b/dlls/ntdll/ntdll_misc.h @@ -63,7 +63,7 @@ extern LPCSTR debugstr_us( const UNICODE_STRING *str ) DECLSPEC_HIDDEN; extern LPCSTR debugstr_ObjectAttributes(const OBJECT_ATTRIBUTES *oa) DECLSPEC_HIDDEN; extern NTSTATUS NTDLL_queue_process_apc( HANDLE process, const apc_call_t *call, apc_result_t *result ) DECLSPEC_HIDDEN; -extern NTSTATUS NTDLL_wait_for_multiple_objects( UINT count, const HANDLE *handles, UINT flags, +extern NTSTATUS NTDLL_wait_for_multiple_objects( const select_op_t *select_op, data_size_t size, UINT flags, const LARGE_INTEGER *timeout, HANDLE signal_object ) DECLSPEC_HIDDEN; /* init routines */ diff --git a/dlls/ntdll/sync.c b/dlls/ntdll/sync.c index 89f6ee6..aa01209 100644 --- a/dlls/ntdll/sync.c +++ b/dlls/ntdll/sync.c @@ -1106,12 +1106,10 @@ NTSTATUS NTDLL_queue_process_apc( HANDLE process, const apc_call_t *call, apc_re * * Implementation of NtWaitForMultipleObjects */ -NTSTATUS NTDLL_wait_for_multiple_objects( UINT count, const HANDLE *handles, UINT flags, +NTSTATUS NTDLL_wait_for_multiple_objects( const select_op_t *select_op, data_size_t size, UINT flags, const LARGE_INTEGER *timeout, HANDLE signal_object ) { - select_op_t select_op; NTSTATUS ret; - UINT i; int cookie; BOOL user_apc = FALSE; obj_handle_t apc_handle = 0; @@ -1120,8 +1118,6 @@ NTSTATUS NTDLL_wait_for_multiple_objects( UINT count, const HANDLE *handles, UIN timeout_t abs_timeout = timeout ? timeout->QuadPart : TIMEOUT_INFINITE; memset( &result, 0, sizeof(result) ); - select_op.wait.op = SELECT_WAIT; - for (i = 0; i < count; i++) select_op.wait.handles[i] = wine_server_obj_handle( handles[i] ); for (;;) { @@ -1133,7 +1129,7 @@ NTSTATUS NTDLL_wait_for_multiple_objects( UINT count, const HANDLE *handles, UIN req->prev_apc = apc_handle; req->timeout = abs_timeout; wine_server_add_data( req, &result, sizeof(result) ); - wine_server_add_data( req, &select_op, offsetof( select_op_t, wait.handles[count] )); + wine_server_add_data( req, select_op, size ); ret = wine_server_call( req ); abs_timeout = reply->timeout; apc_handle = reply->apc_handle; @@ -1172,13 +1168,16 @@ NTSTATUS WINAPI NtWaitForMultipleObjects( DWORD count, const HANDLE *handles, BOOLEAN wait_all, BOOLEAN alertable, const LARGE_INTEGER *timeout ) { - UINT flags = SELECT_INTERRUPTIBLE; + select_op_t select_op; + UINT i, flags = SELECT_INTERRUPTIBLE; if (!count || count > MAXIMUM_WAIT_OBJECTS) return STATUS_INVALID_PARAMETER_1; if (wait_all) flags |= SELECT_ALL; if (alertable) flags |= SELECT_ALERTABLE; - return NTDLL_wait_for_multiple_objects( count, handles, flags, timeout, 0 ); + select_op.wait.op = SELECT_WAIT; + for (i = 0; i < count; i++) select_op.wait.handles[i] = wine_server_obj_handle( handles[i] ); + return NTDLL_wait_for_multiple_objects( &select_op, offsetof( select_op_t, wait.handles[count] ), flags, timeout, 0 ); } @@ -1197,11 +1196,14 @@ NTSTATUS WINAPI NtWaitForSingleObject(HANDLE handle, BOOLEAN alertable, const LA NTSTATUS WINAPI NtSignalAndWaitForSingleObject( HANDLE hSignalObject, HANDLE hWaitObject, BOOLEAN alertable, const LARGE_INTEGER *timeout ) { + select_op_t select_op; UINT flags = SELECT_INTERRUPTIBLE; if (!hSignalObject) return STATUS_INVALID_HANDLE; if (alertable) flags |= SELECT_ALERTABLE; - return NTDLL_wait_for_multiple_objects( 1, &hWaitObject, flags, timeout, hSignalObject ); + select_op.wait.op = SELECT_WAIT; + select_op.wait.handles[0] = wine_server_obj_handle( hWaitObject ); + return NTDLL_wait_for_multiple_objects( &select_op, offsetof( select_op_t, wait.handles[1] ), flags, timeout, hSignalObject ); } @@ -1226,7 +1228,7 @@ NTSTATUS WINAPI NtDelayExecution( BOOLEAN alertable, const LARGE_INTEGER *timeou { /* if alertable, we need to query the server */ if (alertable) - return NTDLL_wait_for_multiple_objects( 0, NULL, SELECT_INTERRUPTIBLE | SELECT_ALERTABLE, + return NTDLL_wait_for_multiple_objects( NULL, 0, SELECT_INTERRUPTIBLE | SELECT_ALERTABLE, timeout, 0 ); if (!timeout || timeout->QuadPart == TIMEOUT_INFINITE) /* sleep forever */
participants (1)
-
Alexandre Julliard