[PATCH v9 1/2] ntdll/socket: Implement exclusive flag for IOCTL_AFD_POLL.

Zebediah Figura zfigura at codeweavers.com
Mon Sep 13 11:58:31 CDT 2021


On 9/10/21 12:33 PM, Guillaume Charifi wrote:
> @@ -787,7 +789,13 @@ static void free_poll_req( void *private )
>       if (req->timeout) remove_timeout_user( req->timeout );
>   
>       for (i = 0; i < req->count; ++i)
> +    {
> +        if (req->sockets[i].sock->main_poll == req)
> +            req->sockets[i].sock->main_poll = NULL;
> +
>           release_object( req->sockets[i].sock );
> +    }
> +
>       release_object( req->async );
>       release_object( req->iosb );
>       list_remove( &req->entry );

This needs to be done earlier, which is why you need the cancel_async 
callback.

Asyncs terminated by the server aren't destroyed immediately; they're 
kept around until an APC_ASYNC_IO is delivered and processed by the 
client. Only then is the completion callback called. This is because 
some asyncs can be restarted by the client.

However, this means that if a new poll_socket request arrives after the 
async is canceled or completed, but before APC_ASYNC_IO is processed, 
with this patch it won't be appropriately marked as the main one. So the 
main poll needs to get reset immediately when the async is terminated, 
including via cancellation.



More information about the wine-devel mailing list