server: Add support for pending write flag to the serial device. Take 2.

Wolfgang Walter wine at stwm.de
Tue Oct 22 13:51:01 CDT 2013


Am Dienstag, 22. Oktober 2013, 16:55:51 schrieb Alexandre Julliard:
> Dmitry Timoshkov <dmitry at baikal.ru> writes:
> > This patch makes WaitCommEvent(EV_TXEMPTY) work when a serial device
> > reports that the out queue is empty even after a successful write()
> > which is the case for real COM ports and as well as for serial-USB
> > adapters.
> > 
> > Take 2 removes special handling of FlushFileBuffers for a serial sevice,
> > the tests show that it really should not reset the pending write state.
> > 
> > I'd like to see some feedback for this patch.
> 
> It doesn't work here:
> 
> ../../../tools/runtest -q -P wine -T ../../.. -M kernel32.dll -p
> kernel32_test.exe.so comm.c && touch comm.ok comm.c:860: Test failed:
> WaitCommEvent failed with a timeout
> comm.c:881: Test failed: WaitCommEvent error 997
> comm.c:882: Test failed: WaitCommEvent: expected EV_TXEMPTY, got 0
> comm.c:887: Test failed: WaitCommEvent used 1003 ms for waiting
> comm.c:2226: Tests skipped: interactive tests (set WINETEST_INTERACTIVE=1)
> make: *** [comm.ok] Error 4

This is because the previous test fails: in the previous test wine actually 
write to the serial device and does not return with ERROR_INVALID_PARAMETER. 
These 17 bytes also need some time to be written and therefor this test fails 
with a timeout.

I proposed to add a sleep(TIMEOUT) if the previous test does not pass that is 
the write actually returns success or with error ERROR_IO_PENDING:

    if (res || (!res && GetLastError() == ERROR_IO_PENDING))
        /* if data has been sent: wait for termination */
        Sleep(timeout);

This has been rejected because then the test passes even without changing the 
EV_TXEMPTY handling at all. This is because calling WaitCommEvent() while 
there are still bytes in the tx queue already works.

This does not mean that "Add support for pending write flag to the serial 
device" is not needed. It is needed to correctly signal EV_TXEMPTY if 
WaitCommEvent() is called later when the tx queue is already empty. I sent a 
patch (5 Sep) adding an additional test for this case (the patch was named

[PATCH 3/6] add another test for waiting for EV_TXEMPTY with WaitCommEvent(), 
try 2

It was part of a series of patches which implemented someting similar to 
Dmitry's patch so I hope Dmitry's patch goes in as it actually fixes an 
important bug.


Independently: TIMEOUT is to short anyway for (see my earlier emails and those 
of Francois Gouget, I attached the latter one).


Regards,
-- 
Wolfgang Walter
Studentenwerk München
Anstalt des öffentlichen Rechts
-------------- next part --------------
An embedded message was scrubbed...
From: Francois Gouget <fgouget at free.fr>
Subject: kernel32/tests: Fix the test_waittxempty() timeout.
Date: Tue, 01 Oct 2013 16:56:31 +0200
Size: 8848
URL: <http://www.winehq.org/pipermail/wine-devel/attachments/20131022/46302207/attachment.mht>


More information about the wine-devel mailing list