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@gmail.com> Signed-off-by: Zebediah Figura <zfigura@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
62e0afda1e
commit
9ef5c9c009
|
@ -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));
|
||||
}
|
||||
|
||||
|
|
|
@ -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 );
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue