void InputHandler::threadProc()

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();
}