in src/unix-adapter/InputHandler.cc [57:114]
void InputHandler::threadProc() {
std::vector<char> buffer(4096);
fd_set readfds;
FD_ZERO(&readfds);
while (true) {
// Handle shutdown.
m_wakeup.reset();
if (m_shouldShutdown) {
trace("InputHandler: shutting down");
break;
}
// Block until data arrives.
{
const int max_fd = std::max(m_inputfd, m_wakeup.fd());
FD_SET(m_inputfd, &readfds);
FD_SET(m_wakeup.fd(), &readfds);
selectWrapper("InputHandler", max_fd + 1, &readfds);
if (!FD_ISSET(m_inputfd, &readfds)) {
continue;
}
}
const int numRead = read(m_inputfd, &buffer[0], buffer.size());
if (numRead == -1 && errno == EINTR) {
// Apparently, this read is interrupted on Cygwin 1.7 by a SIGWINCH
// signal even though I set the SA_RESTART flag on the handler.
continue;
}
// tty is closed, or the read failed for some unexpected reason.
if (numRead <= 0) {
trace("InputHandler: tty read failed: numRead=%d", numRead);
break;
}
DWORD written = 0;
BOOL ret = WriteFile(m_conin,
&buffer[0], numRead,
&written, NULL);
if (!ret || written != static_cast<DWORD>(numRead)) {
if (!ret && GetLastError() == ERROR_BROKEN_PIPE) {
trace("InputHandler: pipe closed: written=%u",
static_cast<unsigned int>(written));
} else {
trace("InputHandler: write failed: "
"ret=%d lastError=0x%x numRead=%d written=%u",
ret,
static_cast<unsigned int>(GetLastError()),
numRead,
static_cast<unsigned int>(written));
}
break;
}
}
m_threadCompleted = 1;
m_completionWakeup.set();
}