Alexandre Julliard : server: Make select on all handles a separate operation.

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


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Aug 22 10:43:36 2013 +0200

server: Make select on all handles a separate operation.

---

 dlls/ntdll/sync.c              |    3 +--
 include/wine/server_protocol.h |   10 +++++-----
 server/protocol.def            |   10 +++++-----
 server/thread.c                |   10 +++++++---
 server/trace.c                 |    3 ++-
 5 files changed, 20 insertions(+), 16 deletions(-)

diff --git a/dlls/ntdll/sync.c b/dlls/ntdll/sync.c
index aa01209..df6e48e 100644
--- a/dlls/ntdll/sync.c
+++ b/dlls/ntdll/sync.c
@@ -1173,9 +1173,8 @@ NTSTATUS WINAPI NtWaitForMultipleObjects( DWORD count, const HANDLE *handles,
 
     if (!count || count > MAXIMUM_WAIT_OBJECTS) return STATUS_INVALID_PARAMETER_1;
 
-    if (wait_all) flags |= SELECT_ALL;
     if (alertable) flags |= SELECT_ALERTABLE;
-    select_op.wait.op = SELECT_WAIT;
+    select_op.wait.op = wait_all ? SELECT_WAIT_ALL : 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 );
 }
diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h
index 590bd81..890c8a3 100644
--- a/include/wine/server_protocol.h
+++ b/include/wine/server_protocol.h
@@ -407,7 +407,8 @@ struct token_groups
 enum select_op
 {
     SELECT_NONE,
-    SELECT_WAIT
+    SELECT_WAIT,
+    SELECT_WAIT_ALL
 };
 
 typedef union
@@ -1082,9 +1083,8 @@ struct select_reply
     obj_handle_t apc_handle;
     char __pad_60[4];
 };
-#define SELECT_ALL           1
-#define SELECT_ALERTABLE     2
-#define SELECT_INTERRUPTIBLE 4
+#define SELECT_ALERTABLE     1
+#define SELECT_INTERRUPTIBLE 2
 
 
 
@@ -5787,6 +5787,6 @@ union generic_reply
     struct set_suspend_context_reply set_suspend_context_reply;
 };
 
-#define SERVER_PROTOCOL_VERSION 444
+#define SERVER_PROTOCOL_VERSION 445
 
 #endif /* __WINE_WINE_SERVER_PROTOCOL_H */
diff --git a/server/protocol.def b/server/protocol.def
index 4601942..0b50766 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -423,7 +423,8 @@ struct token_groups
 enum select_op
 {
     SELECT_NONE,
-    SELECT_WAIT
+    SELECT_WAIT,
+    SELECT_WAIT_ALL
 };
 
 typedef union
@@ -431,7 +432,7 @@ typedef union
     enum select_op op;
     struct
     {
-        enum select_op  op;      /* SELECT_WAIT */
+        enum select_op  op;      /* SELECT_WAIT or SELECT_WAIT_ALL */
         obj_handle_t    handles[MAXIMUM_WAIT_OBJECTS];
     } wait;
 } select_op_t;
@@ -946,9 +947,8 @@ struct rawinput_device
     apc_call_t   call;         /* APC call arguments */
     obj_handle_t apc_handle;   /* handle to next APC */
 @END
-#define SELECT_ALL           1
-#define SELECT_ALERTABLE     2
-#define SELECT_INTERRUPTIBLE 4
+#define SELECT_ALERTABLE     1
+#define SELECT_INTERRUPTIBLE 2
 
 
 /* Create an event */
diff --git a/server/thread.c b/server/thread.c
index c6eeaf9..6858fd1 100644
--- a/server/thread.c
+++ b/server/thread.c
@@ -75,6 +75,7 @@ struct thread_wait
     struct thread          *thread;     /* owner thread */
     int                     count;      /* count of objects */
     int                     flags;
+    enum select_op          select;
     client_ptr_t            cookie;     /* magic cookie to return to client */
     timeout_t               timeout;
     struct timeout_user    *user;
@@ -558,7 +559,8 @@ static void end_wait( struct thread *thread )
 }
 
 /* build the thread wait structure */
-static int wait_on( unsigned int count, struct object *objects[], int flags, timeout_t timeout )
+static int wait_on( const select_op_t *select_op, unsigned int count, struct object *objects[],
+                    int flags, timeout_t timeout )
 {
     struct thread_wait *wait;
     struct wait_queue_entry *entry;
@@ -569,6 +571,7 @@ static int wait_on( unsigned int count, struct object *objects[], int flags, tim
     wait->thread  = current;
     wait->count   = count;
     wait->flags   = flags;
+    wait->select  = select_op->op;
     wait->user    = NULL;
     wait->timeout = timeout;
     current->wait = wait;
@@ -602,7 +605,7 @@ static int check_wait( struct thread *thread )
     /* Suspended threads may not acquire locks, but they can run system APCs */
     if (thread->process->suspend + thread->suspend > 0) return -1;
 
-    if (wait->flags & SELECT_ALL)
+    if (wait->select == SELECT_WAIT_ALL)
     {
         int not_ok = 0;
         /* Note: we must check them all anyway, as some objects may
@@ -726,6 +729,7 @@ static timeout_t select_on( const select_op_t *select_op, data_size_t op_size, c
         break;
 
     case SELECT_WAIT:
+    case SELECT_WAIT_ALL:
         count = (op_size - offsetof( select_op_t, wait.handles )) / sizeof(select_op->wait.handles[0]);
         if (op_size < offsetof( select_op_t, wait.handles ) || count > MAXIMUM_WAIT_OBJECTS)
         {
@@ -747,7 +751,7 @@ static timeout_t select_on( const select_op_t *select_op, data_size_t op_size, c
     }
 
     if (i < count) goto done;
-    if (!wait_on( count, objects, flags, timeout )) goto done;
+    if (!wait_on( select_op, count, objects, flags, timeout )) goto done;
 
     /* signal the object */
     if (signal_obj)
diff --git a/server/trace.c b/server/trace.c
index c9af74f..cf58794 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -399,7 +399,8 @@ static void dump_varargs_select_op( const char *prefix, data_size_t size )
         fprintf( stderr, "NONE" );
         break;
     case SELECT_WAIT:
-        fprintf( stderr, "WAIT" );
+    case SELECT_WAIT_ALL:
+        fprintf( stderr, "%s", data.op == SELECT_WAIT ? "WAIT" : "WAIT_ALL" );
         if (size > offsetof( select_op_t, wait.handles ))
             dump_handles( ",handles=", data.wait.handles,
                           min( size, sizeof(data.wait) ) - offsetof( select_op_t, wait.handles ));




More information about the wine-cvs mailing list