Problem : WSARecv call should not intercept message for the waiting overlapped WSARecv. https://www.winehq.org/pipermail/wine-devel/2021-May/186612.html
A client program needs to know if there are pending asyncs before calling try_recv. Wineserver notifies it whenever invoking APC_ASYNC_IO. Then, the client program will update it.
Signed-off-by: Dongwan Kim kdw6485@gmail.com --- include/wine/server_protocol.h | 1 + server/async.c | 8 ++++++++ 2 files changed, 9 insertions(+)
diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h index b37a8e8e056..4dc2eb567db 100644 --- a/include/wine/server_protocol.h +++ b/include/wine/server_protocol.h @@ -492,6 +492,7 @@ typedef union client_ptr_t user; client_ptr_t sb; data_size_t result; + unsigned int async_wait; } async_io; struct { diff --git a/server/async.c b/server/async.c index ec3396c930f..0220bf4e2f4 100644 --- a/server/async.c +++ b/server/async.c @@ -164,6 +164,7 @@ static void async_destroy( struct object *obj ) void async_terminate( struct async *async, unsigned int status ) { struct iosb *iosb = async->iosb; + struct async* async_waiting;
if (async->terminated) return;
@@ -202,6 +203,13 @@ void async_terminate( struct async *async, unsigned int status ) else data.async_io.status = status;
+ async_waiting = find_pending_async(async->queue); + if(async_waiting) + { + data.async_io.async_wait = 1; + release_object(async_waiting); + } + thread_queue_apc( async->thread->process, async->thread, &async->obj, &data ); }