[RFC PATCH 1/6] server: Allow calling async_handoff() with status code STATUS_ALERTED.
Zebediah Figura (she/her)
zfigura at codeweavers.com
Thu Jan 27 10:53:44 CST 2022
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.
More information about the wine-devel
mailing list