summaryrefslogtreecommitdiffstats
path: root/win/tclWinConsole.c
diff options
context:
space:
mode:
Diffstat (limited to 'win/tclWinConsole.c')
-rw-r--r--win/tclWinConsole.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/win/tclWinConsole.c b/win/tclWinConsole.c
index 30a09fd..0e38c5b 100644
--- a/win/tclWinConsole.c
+++ b/win/tclWinConsole.c
@@ -862,19 +862,26 @@ ConsoleCheckProc(
/* Pointer is safe to access as we are holding gConsoleLock */
if (handleInfoPtr == NULL) {
+ /* Stale event */
continue;
}
-
+
needEvent = 0;
AcquireSRWLockShared(&handleInfoPtr->lock);
- /* Rememebr channel is read or write, never both */
+ /* Rememeber channel is read or write, never both */
if (chanInfoPtr->watchMask & TCL_READABLE) {
if (RingBufferLength(&handleInfoPtr->buffer) > 0
- || handleInfoPtr->lastError != ERROR_SUCCESS
- ) {
+ || handleInfoPtr->lastError != ERROR_SUCCESS) {
needEvent = 1; /* Input data available or error/EOF */
}
- } else if (chanInfoPtr->watchMask & TCL_WRITABLE) {
+ /*
+ * TCL_READABLE watch means someone is looking out for data being
+ * available, let reader thread know.
+ */
+ handleInfoPtr->flags |= CONSOLE_DATA_AWAITED;
+ WakeConditionVariable(&handleInfoPtr->consoleThreadCV);
+ }
+ else if (chanInfoPtr->watchMask & TCL_WRITABLE) {
if (RingBufferHasFreeSpace(&handleInfoPtr->buffer)) {
needEvent = 1; /* Output space available */
}