diff --git i/src/w32.c w/src/w32.c index 698e10e234..d14abc2f8e 100644 --- i/src/w32.c +++ w/src/w32.c @@ -8798,6 +8798,37 @@ _sys_wait_accept (int fd) return cp->status; } +int +_sys_wait_readable (int fd) +{ + HANDLE hEv; + child_process * cp; + int rc; + + if (fd < 0 || fd >= MAXDESC) + return STATUS_READ_ERROR; + + cp = fd_info[fd].cp; + + if (cp == NULL || cp->fd != fd || cp->status != STATUS_READ_READY) + return STATUS_READ_ERROR; + + cp->status = STATUS_READ_FAILED; + + hEv = pfn_WSACreateEvent (); + rc = pfn_WSAEventSelect (SOCK_HANDLE (fd), hEv, FD_READ); + if (rc != SOCKET_ERROR) + { + rc = WaitForSingleObject (hEv, INFINITE); + pfn_WSAEventSelect (SOCK_HANDLE (fd), NULL, 0); + if (rc == WAIT_OBJECT_0) + cp->status = STATUS_READ_SUCCEEDED; + } + pfn_WSACloseEvent (hEv); + + return cp->status; +} + int _sys_wait_connect (int fd) { diff --git i/src/w32.h w/src/w32.h index cf1dadf64c..4a6b7c4b53 100644 --- i/src/w32.h +++ w/src/w32.h @@ -175,6 +175,7 @@ #define FILE_SERIAL 0x0800 extern int _sys_read_ahead (int fd); extern int _sys_wait_accept (int fd); +extern int _sys_wait_readable (int fd); extern int _sys_wait_connect (int fd); extern HMODULE w32_delayed_load (Lisp_Object); diff --git i/src/w32proc.c w/src/w32proc.c index de33726905..1e109669f7 100644 --- i/src/w32proc.c +++ w/src/w32proc.c @@ -1225,7 +1225,7 @@ reader_thread (void *arg) else if (cp->fd >= 0 && (fd_info[cp->fd].flags & FILE_LISTEN) != 0) rc = _sys_wait_accept (cp->fd); else - rc = _sys_read_ahead (cp->fd); + rc = _sys_wait_readable (cp->fd); /* Don't bother waiting for the event if we already have been told to exit by delete_child. */