From: Dmitry Jemerov Date: Sun, 18 Jul 2010 09:20:24 +0000 (+0400) Subject: runnerw works on windows X-Git-Tag: pycharm/96.681~1 X-Git-Url: https://git.jetbrains.org/?p=idea%2Fcommunity.git;a=commitdiff_plain;h=a9e0b8082123169d41660fba9ec858f12cbefcab runnerw works on windows --- diff --git a/native/runner/runnerw/runnerw.cpp b/native/runner/runnerw/runnerw.cpp index 01fc6b154dbf..d29b27f217f7 100644 --- a/native/runner/runnerw/runnerw.cpp +++ b/native/runner/runnerw/runnerw.cpp @@ -38,14 +38,15 @@ void CtrlBreak() { BOOL is_iac = FALSE; -char IAC = 255; -char BRK = 243; +char IAC = 5; +char BRK = 3; BOOL Scan(char buf[], int count) { for (int i = 0; i < count; i++) { if (is_iac) { if (buf[i] == BRK) { CtrlBreak(); + return TRUE; } else { is_iac = FALSE; } @@ -73,6 +74,41 @@ BOOL CtrlHandler(DWORD fdwCtrlType) { } } +struct StdInThreadParams +{ + HANDLE hEvent; + HANDLE write_stdin; +}; + +DWORD WINAPI StdInThread(void *param) +{ + StdInThreadParams *threadParams = (StdInThreadParams *) param; + char buf[1]; + memset(buf, 0, sizeof(buf)); + + HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE); + while(true) + { + DWORD cbRead = 0; + DWORD cbWrite = 0; + + char c; + ReadFile(hStdin, &c, 1, &cbRead, NULL); + if (cbRead > 0) + { + buf[0] = c; + bool ctrlBroken = Scan(buf, 1); + WriteFile(threadParams->write_stdin, buf, 1, &cbWrite, NULL); + if (ctrlBroken) + { + SetEvent(threadParams->hEvent); + break; + } + } + } + return 0; +} + int main(int argc, char * argv[]) { if (argc < 2) { PrintUsage(); @@ -133,27 +169,34 @@ int main(int argc, char * argv[]) { unsigned long exit = 0; unsigned long b_read; - unsigned long b_write; unsigned long avail; - char buf[1]; - memset(buf, 0, sizeof(buf)); + HANDLE threadEvent = CreateEvent(NULL, TRUE, FALSE, NULL); - for (;;) { - GetExitCodeProcess(pi.hProcess, &exit); + StdInThreadParams params; + params.hEvent = threadEvent; + params.write_stdin = write_stdin; - if (exit != STILL_ACTIVE) - break; + CreateThread(NULL, 0, &StdInThread, ¶ms, 0, NULL); - char c; - std::cin >> c; - buf[0] = c; - Scan(buf, 1); - WriteFile(write_stdin, buf, 1, &b_write, NULL); + HANDLE objects_to_wait[2]; + objects_to_wait[0] = threadEvent; + objects_to_wait[1] = pi.hProcess; + + while(true) + { + int rc = WaitForMultipleObjects(2, objects_to_wait, FALSE, INFINITE); + if (rc == WAIT_OBJECT_0 + 1) + { + break; + } } + GetExitCodeProcess(pi.hProcess, &exit); + CloseHandle(pi.hThread); CloseHandle(pi.hProcess); CloseHandle(newstdin); CloseHandle(write_stdin); + return exit; }