Alexandre Julliard : ntdll: Pass a select operation structure to NTDLL_wait_for_multiple_objects.

Alexandre Julliard julliard at winehq.org
Tue Aug 27 14:47:55 CDT 2013


Module: wine
Branch: master
Commit: cbdc0ec72d917334059dd1ab0d17375594442aa0
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=cbdc0ec72d917334059dd1ab0d17375594442aa0

Author: Alexandre Julliard <julliard at 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 */




More information about the wine-cvs mailing list