[PATCH v3 3/8] server: Defer postprocessing until after setting initial status in recv_socket handler.
Zebediah Figura (she/her)
zfigura at codeweavers.com
Wed Mar 2 00:35:54 CST 2022
On 3/1/22 06:42, Jinoh Kang wrote:
> On 2/26/22 03:42, Zebediah Figura (she/her) wrote:
>> On 2/21/22 11:23, Jinoh Kang wrote:
>>> This allows the client to postpone the initial I/O until after the
>>> server has actually queued the I/O request. The server should perform
>>> the postprocessing only after the initial I/O has been done.
>>>
>>> In the case of recv_socket, the manipulation of event flags shall
>>> ideally be done *after* (not *before*) the client has attempted the
>>> initial I/O, since the readiness of the socket may change in the
>>> meanwhile.
>>>
>>> Signed-off-by: Jinoh Kang <jinoh.kang.kr at gmail.com>
>>
>> What's the point of doing this?
>
> Clarity, mostly.
>
> Clearing pending_events indicates that we're interested in polling I/O again.
> Since the recv() call has not yet happened, it means the incoming queue may still have pending data.
> One might reason that this will erroneously trigger AFD_POLL_READ event, even though the recv() call will consume all the remaining data.
>
> Now, the above scenario won't really happen since we never poll for POLLIN if async_waiting( &sock->read_q ) is false.
> I nonetheless find it much more intuitive to have the event flag cleared *after* performing the initial I/O.
> This also makes it consistent with the send_socket case.
Well, we can't clear event flags after performing the initial I/O per
se. At best we can do so after *queuing* it, which isn't particularly
meaningful. Perhaps there's an argument for moving the flag manipulation
after queue_async(), but I'll admit it doesn't really seem worthwhile. I
don't see the point of moving it after async_handoff(), though.
Note also that we have to clear event flags even in (some?) error cases,
where no I/O is really queued. So while I can only assume this passes
the tests, it makes it much less obvious that it's the right thing to
do. It also introduces a mental burden on the reader to understand the
semantics of the "initial status callback" and when (and under what
circumstances) it's called.
More information about the wine-devel
mailing list