Jinoh Kang : server: Reselect only after dequeueing async request.

Alexandre Julliard julliard at winehq.org
Tue Jan 4 16:20:01 CST 2022


Module: wine
Branch: master
Commit: 9ef5c9c0090f17df5bfd794485019fb8bf9a7e25
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=9ef5c9c0090f17df5bfd794485019fb8bf9a7e25

Author: Jinoh Kang <jinoh.kang.kr at gmail.com>
Date:   Tue Jan  4 05:42:08 2022 +0900

server: Reselect only after dequeueing async request.

Otherwise, async_waiting() returns 0, leading the socket object to
believe that the previous async request has not yet been acknowledged.
This results in I/O hang for subsequent reads (until shutdown).

Also, async_destroy() calls async_reselect() only after removing the
async request from the queue.  Make async_set_result() consistent with
this behaviour.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=52332
Signed-off-by: Jinoh Kang <jinoh.kang.kr at gmail.com>
Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ws2_32/tests/sock.c | 4 ----
 server/async.c           | 5 ++---
 2 files changed, 2 insertions(+), 7 deletions(-)

diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c
index d3d58fc946f..5cf015eecc6 100644
--- a/dlls/ws2_32/tests/sock.c
+++ b/dlls/ws2_32/tests/sock.c
@@ -11487,16 +11487,12 @@ static void test_simultaneous_async_recv(void)
         DWORD size;
 
         ret = WaitForSingleObject(events[i], 1000);
-        todo_wine_if(i > 0)
         ok(!ret, "wait timed out\n");
 
         size = 0;
         ret = GetOverlappedResult((HANDLE)client, &overlappeds[i], &size, FALSE);
-        todo_wine_if(i > 0)
         ok(ret, "got error %u\n", GetLastError());
-        todo_wine_if(i > 0)
         ok(size == stride, "got size %u\n", size);
-        todo_wine_if(i > 0)
         ok(!memcmp(expect, actual, stride), "expected %s, got %s\n", debugstr_an(expect, stride), debugstr_an(actual, stride));
     }
 
diff --git a/server/async.c b/server/async.c
index 1a564ff1a69..7aef28355f0 100644
--- a/server/async.c
+++ b/server/async.c
@@ -509,12 +509,11 @@ void async_set_result( struct object *obj, unsigned int status, apc_param_t tota
             async->completion_callback( async->completion_callback_private );
         async->completion_callback = NULL;
 
-        async_reselect( async );
-
         if (async->queue)
         {
-            async->fd = NULL;
             list_remove( &async->queue_entry );
+            async_reselect( async );
+            async->fd = NULL;
             async->queue = NULL;
             release_object( async );
         }




More information about the wine-cvs mailing list