[RFC PATCH 1/6] server: Allow calling async_handoff() with status code STATUS_ALERTED.

Alexandre Julliard julliard at winehq.org
Thu Jan 27 11:21:38 CST 2022


"Zebediah Figura (she/her)" <zfigura at codeweavers.com> writes:

> On 1/27/22 06:02, Jacek Caban wrote:
>> On 1/27/22 00:52, Zebediah Figura (she/her) wrote:
>>> On 1/23/22 11:29, Jinoh Kang wrote:
>>>> +static int async_add_queue( struct object *obj, struct
>>>> wait_queue_entry *entry )
>>>> +{
>>>> +    struct async *async = (struct async *)obj;
>>>> +    assert( obj->ops == &async_ops );
>>>> +
>>>> +    if (!async->pending && async->terminated && async->alerted)
>>>> +    {
>>>> +        /* The client has failed to complete synchronously
>>>> (e.g. EWOULDBLOCK).
>>>> +         * Restart the async as fully fledged asynchronous I/O, where
>>>> +         * the completion port notification and APC call will be
>>>> triggered
>>>> +         * appropriately. */
>>>> +        async->pending = 1;
>>>> +
>>>> +        /* Unset the signaled flag if the client wants to block
>>>> on this async. */
>>>> +        if (async->blocking) async->signaled = 0;
>>>> +
>>>> +        async_set_result( obj, STATUS_PENDING, 0 );  /* kick it off */
>>>> +    }
>>>> +
>>>> +    return add_queue( obj, entry );
>>>> +}
>>>> +
>>>
>>> I'll admit, this kind of thing is why I didn't really want to have
>>> to try to optimize 3 server calls into 2. Asyncs are already really 
>>> complicated, in terms of the many paths they can take, and it seems
>>> like no matter what we do they're going to get worse. 
>> 
>> Did you consider moving whole sock_send() and try_send() to server?
>> We could then have a proper and reliable queue in server socket
>> object and client could just do a regular generic server ioctl. (I
>> didn't really follow closely the conversation, so sorry if I missed
>> something).
>
> That's actually a good point, thanks for making it. I think I actually
> did consider this when first moving things around, but decided against 
> it on the grounds of keeping stuff out of the server...
>
> Note that we do have to deal with scatter/gather, and the control and
> address in recvmsg, so it can't quite do a generic ioctl, we'd still 
> need to use a special async I/O proc on the ntdll side. But it does
> obviate the need to change the async infrastructure at all.
>
> One possible concern is that we'd end up doing a lot of large copies
> over the server request sockets. It's not clear to me if that's
> anything to worry about.

I think that's a concern, yes. You'd also need large buffers on the
server side. It would of course make some things easier, but I'm not
sure it's a good idea.

-- 
Alexandre Julliard
julliard at winehq.org



More information about the wine-devel mailing list