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