Uwe Bonnes : ntdll: Generate a single EV_TXEMPTY when the TX buffer turns empty.
Alexandre Julliard
julliard at winehq.org
Fri Oct 14 14:14:50 CDT 2011
Module: wine
Branch: master
Commit: 89c2a4c5961e6534ecd017d74fa007aec10e34e9
URL: http://source.winehq.org/git/wine.git/?a=commit;h=89c2a4c5961e6534ecd017d74fa007aec10e34e9
Author: Uwe Bonnes <bon at elektron.ikp.physik.tu-darmstadt.de>
Date: Thu Oct 13 11:30:37 2011 +0200
ntdll: Generate a single EV_TXEMPTY when the TX buffer turns empty.
---
dlls/ntdll/serial.c | 54 +++++++++++++++++++++++++++++++-------------------
1 files changed, 33 insertions(+), 21 deletions(-)
diff --git a/dlls/ntdll/serial.c b/dlls/ntdll/serial.c
index 1ca2cfa..231466c 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;
/***********************************************************************
@@ -806,7 +807,6 @@ 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;
if (!ioctl(fd, TIOCGICOUNT, &einfo))
@@ -818,13 +818,38 @@ 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;
}
- TRACE("TIOCGICOUNT err %s\n", strerror(errno));
- status = FILE_GetNtStatus();
-#endif
+ else
+ {
+ TRACE("TIOCGICOUNT err %s\n", strerror(errno));
+ memset(irq_info,0, sizeof(serial_irq_info));
+ return FILE_GetNtStatus();
+ }
+#else
memset(irq_info,0, sizeof(serial_irq_info));
- return status;
+ return STATUS_NOT_IMPLEMENTED;
+#endif
+ irq_info->temt = 0;
+ /* Generate a single TX_TXEMPTY event when the TX Buffer turns empty*/
+#ifdef TIOCSERGETLSR /* prefer to log the state TIOCSERGETLSR */
+ if (ioctl(fd, TIOCSERGETLSR, &irq_info->temt))
+ {
+ TRACE("TIOCSERGETLSR err %s\n", strerror(errno));
+ return FILE_GetNtStatus();
+ }
+#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));
+ return FILE_GetNtStatus();
+ }
+ else
+ {
+ if (irq_info->temt == 0)
+ irq_info->temt = 1;
+ }
+#endif
+ return STATUS_SUCCESS;
}
@@ -862,21 +887,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;
}
More information about the wine-cvs
mailing list