[PATCH v2 1/6] server: Improve APC error handling when alloc_handle fails.

Rémi Bernon rbernon at codeweavers.com
Wed Feb 5 04:49:35 CST 2020


Whenever alloc_handle fails, we ignored the error and dequeued the
next APC. This patch makes the loop break whenever the error status
changes.

Note that the APC is still marked as executed although it failed.

Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 server/thread.c | 29 +++++++++++++----------------
 1 file changed, 13 insertions(+), 16 deletions(-)

diff --git a/server/thread.c b/server/thread.c
index aec4c1acf4e..0d502eecba5 100644
--- a/server/thread.c
+++ b/server/thread.c
@@ -1581,26 +1581,23 @@ DECL_HANDLER(select)
 
     reply->timeout = select_on( &select_op, op_size, req->cookie, req->flags, req->timeout );
 
-    if (get_error() == STATUS_USER_APC)
+    while (get_error() == STATUS_USER_APC)
     {
-        for (;;)
+        if (!(apc = thread_dequeue_apc( current, !(req->flags & SELECT_ALERTABLE) )))
+            break;
+        /* Optimization: ignore APC_NONE calls, they are only used to
+         * wake up a thread, but since we got here the thread woke up already.
+         */
+        if (apc->call.type != APC_NONE &&
+            (reply->apc_handle = alloc_handle( current->process, apc, SYNCHRONIZE, 0 )))
         {
-            if (!(apc = thread_dequeue_apc( current, !(req->flags & SELECT_ALERTABLE) )))
-                break;
-            /* Optimization: ignore APC_NONE calls, they are only used to
-             * wake up a thread, but since we got here the thread woke up already.
-             */
-            if (apc->call.type != APC_NONE &&
-                (reply->apc_handle = alloc_handle( current->process, apc, SYNCHRONIZE, 0 )))
-            {
-                reply->call = apc->call;
-                release_object( apc );
-                break;
-            }
-            apc->executed = 1;
-            wake_up( &apc->obj, 0 );
+            reply->call = apc->call;
             release_object( apc );
+            break;
         }
+        apc->executed = 1;
+        wake_up( &apc->obj, 0 );
+        release_object( apc );
     }
 }
 
-- 
2.25.0




More information about the wine-devel mailing list