[Corrected] 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 10:31:27 CDT 2011
(now with some added debug output removed 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 33d8ec312689be3ea979527ef8901a3268f23b9b 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 | 35 +++++++++++++++++++----------------
1 files changed, 19 insertions(+), 16 deletions(-)
diff --git a/dlls/ntdll/serial.c b/dlls/ntdll/serial.c
index 1ca2cfa..6d26dcd 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,23 @@ 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*/
+ we perfered log the state TIOCSERGETLSR
+#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 +878,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