dlls/ntdll/serial.c: Generate a single EV_TXEMPTY when the TX buffer turns empty (try 3)

Uwe Bonnes bon at elektron.ikp.physik.tu-darmstadt.de
Thu Oct 13 04:53:12 CDT 2011


Thanks to Alexandre for his feedback.
To avoid dupplicating the #ifdef TIOCGICOUNT I move code and changed the
code path. This time also with better error checking.
-- 
Uwe Bonnes                bon at elektron.ikp.physik.tu-darmstadt.de

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

---
 dlls/ntdll/serial.c |   60 ++++++++++++++++++++++++++++++++++----------------
 1 files changed, 41 insertions(+), 19 deletions(-)

diff --git a/dlls/ntdll/serial.c b/dlls/ntdll/serial.c
index 1ca2cfa..481aecd 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;
 
 /***********************************************************************
@@ -818,12 +819,46 @@ static NTSTATUS get_irq_info(int fd, serial_irq_info *irq_info)
         irq_info->parity      = einfo.parity;
         irq_info->brk         = einfo.brk;
         irq_info->buf_overrun = einfo.buf_overrun;
-        return STATUS_SUCCESS;
+        status = STATUS_SUCCESS;
     }
-    TRACE("TIOCGICOUNT err %s\n", strerror(errno));
-    status = FILE_GetNtStatus();
-#endif
+    else
+    {
+        TRACE("TIOCGICOUNT err %s\n", strerror(errno));
+        status = FILE_GetNtStatus();
+        memset(irq_info,0, sizeof(serial_irq_info));
+        return status;
+    }
+#else
     memset(irq_info,0, sizeof(serial_irq_info));
+    return STATUS_NOT_IMPLEMENTED;
+#endif
+    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))
+        {
+            TRACE("TIOCSERGETLSR err %s\n", strerror(errno));
+            status = FILE_GetNtStatus();
+            return status;
+        }
+        else
+            status = STATUS_SUCCESS;
+#elif defined(TIOCOUTQ)
+/*otherwise we log when the out queue gets empty */
+	if (ioctl(fd, TIOCOUTQ, &irq_info->temt))
+        {
+            TRACE("TIOCOUTQ err %s\n", strerror(errno));
+            status = FILE_GetNtStatus();
+            return status;
+        }
+        else
+        {
+            status = STATUS_SUCCESS;
+            if (irq_info->temt == 0)
+                irq_info->temt = 1;
+        }
+#endif
     return status;
 }
 
@@ -862,21 +897,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