From: Jinoh Kang Subject: [RFC PATCH v2 09/11] ntdll: Don't interrupt sock_recv with an I/O synchronous completion APC. Message-Id: <05bbe179-7709-95c1-5fd5-c1d9b4dfc236@gmail.com> Date: Sat, 22 Jan 2022 23:36:59 +0900 In-Reply-To: <1e0d520b-0f60-1323-3305-4f884fb121a1@gmail.com> References: <1e0d520b-0f60-1323-3305-4f884fb121a1@gmail.com> The synchronous completion request APC will be delivered via "inline_apc" instead of interrupting the current thread. Signed-off-by: Jinoh Kang --- Notes: The synchronous I/O-case logic was inside the requestor function (sock_recv) in the previous patch, but has now been moved into the asynchronous I/O completion callback (async_recv_proc) for this patch serie. dlls/ntdll/unix/socket.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/dlls/ntdll/unix/socket.c b/dlls/ntdll/unix/socket.c index 7d3795a953e..3ab3c55d6e4 100644 --- a/dlls/ntdll/unix/socket.c +++ b/dlls/ntdll/unix/socket.c @@ -690,6 +690,7 @@ static NTSTATUS sock_recv( HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc, voi NTSTATUS status; unsigned int i; ULONG options; + inline_apc_t inline_apc; if (unix_flags & MSG_OOB) { @@ -751,12 +752,14 @@ static NTSTATUS sock_recv( HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc, voi if (status == STATUS_DEVICE_NOT_READY && force_async) status = STATUS_PENDING; + memset( &inline_apc, 0, sizeof(inline_apc) ); SERVER_START_REQ( recv_socket ) { req->status = status; req->total = information; req->async = server_async( handle, &async->io, event, apc, apc_user, iosb_client_ptr(io) ); req->oob = !!(unix_flags & MSG_OOB); + wine_server_set_reply( req, &inline_apc, sizeof(inline_apc) ); status = wine_server_call( req ); wait_handle = wine_server_ptr_handle( reply->wait ); options = reply->options; @@ -770,8 +773,7 @@ static NTSTATUS sock_recv( HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc, voi if (!is_completion_deferred( status )) release_fileio( &async->io ); - if (wait_handle) status = wait_async( wait_handle, options & FILE_SYNCHRONOUS_IO_ALERT ); - return status; + return wait_async_after_apc( wait_handle, options & FILE_SYNCHRONOUS_IO_ALERT, status, &inline_apc ); } -- 2.31.1