diff --git a/Misc/NEWS.d/next/Windows/2020-01-12-23-52-49.bpo-28166.dZ-Mz9.rst b/Misc/NEWS.d/next/Windows/2020-01-12-23-52-49.bpo-28166.dZ-Mz9.rst new file mode 100644 index 00000000000000..85bafc57fa3780 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2020-01-12-23-52-49.bpo-28166.dZ-Mz9.rst @@ -0,0 +1,2 @@ +``WindowsConsoleIO``: Continue to read when interrupted by Ctrl+C if +``SIGINT`` is ignored or the handler doesn't raise an exception. diff --git a/Modules/_io/winconsoleio.c b/Modules/_io/winconsoleio.c index 6680488b740cfc..a40deb2818a165 100644 --- a/Modules/_io/winconsoleio.c +++ b/Modules/_io/winconsoleio.c @@ -583,14 +583,15 @@ read_console_w(HANDLE handle, DWORD maxlen, DWORD *readlen) { break; err = 0; HANDLE hInterruptEvent = _PyOS_SigintEvent(); - if (WaitForSingleObjectEx(hInterruptEvent, 100, FALSE) - == WAIT_OBJECT_0) { + DWORD state = WaitForSingleObjectEx(hInterruptEvent, 100, FALSE); + if (state == WAIT_OBJECT_0 || state == WAIT_TIMEOUT) { ResetEvent(hInterruptEvent); Py_BLOCK_THREADS sig = PyErr_CheckSignals(); Py_UNBLOCK_THREADS if (sig < 0) break; + continue; } } *readlen += n; diff --git a/Parser/myreadline.c b/Parser/myreadline.c index 1825665354844b..58772eb22304bf 100644 --- a/Parser/myreadline.c +++ b/Parser/myreadline.c @@ -160,8 +160,8 @@ _PyOS_WindowsConsoleReadline(PyThreadState *tstate, HANDLE hStdIn) goto exit; err = 0; HANDLE hInterruptEvent = _PyOS_SigintEvent(); - if (WaitForSingleObjectEx(hInterruptEvent, 100, FALSE) - == WAIT_OBJECT_0) { + DWORD state = WaitForSingleObjectEx(hInterruptEvent, 100, FALSE); + if (state == WAIT_OBJECT_0 || state == WAIT_TIMEOUT) { ResetEvent(hInterruptEvent); PyEval_RestoreThread(tstate); s = PyErr_CheckSignals(); @@ -169,6 +169,7 @@ _PyOS_WindowsConsoleReadline(PyThreadState *tstate, HANDLE hStdIn) if (s < 0) { goto exit; } + continue; } break; }