[Corrected^2] dlls/ntdll/serial.c: Generate a single EV_TXEMPTY when the\ TX buffer turns empty

Uwe Bonnes bon at elektron.ikp.physik.tu-darmstadt.de
Mon Oct 10 14:20:16 CDT 2011


(now with some added debug output removed again and compiling again...)
Hello,

the present ntdll/serial.c check_events, with the transmitt buffer empty,
always generates an EV_TXEMPTY event. An event should only be generated when
the transmitt buffer _turns_ empty

In above patch, I record the state of the TEMT flag in get_irq_info() and
signal a 0->1 transistion.

The application under test
http://www.microsps.net/Downloads/Benutzeroberflaeche_V1_04i.zip
from http://www.microsps.net/bof.html kann now see the device, however
does display white on white and has other artifacts.

Bye

-- 
Uwe Bonnes                bon at elektron.ikp.physik.tu-darmstadt.de

Institut fuer Kernphysik  Schlossgartenstrasse 9  64289 Darmstadt
--------- Tel. 06151 162516 -------- Fax. 06151 164321 ----------
>From 8e8e50ccb9cdf5b49a8a2f2c9b384c18bbe4d6d7 Mon Sep 17 00:00:00 2001
From: Uwe Bonnes <bon at elektron.ikp.physik.tu-darmstadt.de>
Date: Mon, 10 Oct 2011 15:44:00 +0200
Subject: Generate a single EV_TXEMPTY when the TX buffer turns empty

---
 dlls/ntdll/serial.c |   34 ++++++++++++++++++----------------
 1 files changed, 18 insertions(+), 16 deletions(-)

diff --git a/dlls/ntdll/serial.c b/dlls/ntdll/serial.c
index 1ca2cfa..b896659c0 100644
--- a/dlls/ntdll/serial.c
+++ b/dlls/ntdll/serial.c
@@ -785,6 +785,7 @@ static NTSTATUS set_XOn(int fd)
 typedef struct serial_irq_info
 {
     int rx , tx, frame, overrun, parity, brk, buf_overrun;
+    DWORD temt;
 }serial_irq_info;
 
 /***********************************************************************
@@ -807,8 +808,22 @@ typedef struct async_commio
 static NTSTATUS get_irq_info(int fd, serial_irq_info *irq_info)
 {
     NTSTATUS status = STATUS_NOT_IMPLEMENTED;
-#ifdef TIOCGICOUNT
     struct serial_icounter_struct einfo;
+    irq_info->temt = 0;
+/* Generate a single TX_TXEMPTY event when the TX Buffer turns empty*/
+#if defined(TIOCSERGETLSR) 
+/* Perferred log the state TIOCSERGETLSR*/
+	if (ioctl(fd, TIOCSERGETLSR, &irq_info->temt))
+	    WARN("TIOCSERGETLSR returned error\n");
+#elif defined(TIOCOUTQ)
+/*otherwise we log when the out queue gets empty */
+	if (ioctl(fd, TIOCOUTQ, &irq_info->temt))
+	    WARN("TIOCOUTQ returned error\n");
+	if (irq_info->temt == 0)
+            irq_info->temt = 1;
+#endif
+
+#ifdef TIOCGICOUNT
     if (!ioctl(fd, TIOCGICOUNT, &einfo))
     {
         irq_info->rx          = einfo.rx;
@@ -862,21 +877,8 @@ static DWORD check_events(int fd, DWORD mask,
     }
     if (mask & EV_TXEMPTY)
     {
-	queue = 0;
-/* We really want to know when all characters have gone out of the transmitter */
-#if defined(TIOCSERGETLSR) 
-	if (ioctl(fd, TIOCSERGETLSR, &queue))
-	    WARN("TIOCSERGETLSR returned error\n");
-	if (queue)
-/* TIOCOUTQ only checks for an empty buffer */
-#elif defined(TIOCOUTQ)
-	if (ioctl(fd, TIOCOUTQ, &queue))
-	    WARN("TIOCOUTQ returned error\n");
-	if (!queue)
-#endif
-           ret |= EV_TXEMPTY;
-	TRACE("OUTQUEUE %d, Transmitter %sempty\n",
-              queue, (ret & EV_TXEMPTY) ? "" : "not ");
+        if (!(old->temt) && new->temt)
+            ret |= EV_TXEMPTY;
     }
     return ret & mask;
 }
-- 
1.7.3.4




More information about the wine-patches mailing list