[3.9] bpo-40826: Fix GIL usage in PyOS_Readline() (GH-20613)

* bpo-40826: Fix GIL usage in PyOS_Readline() (GH-20579)

Fix GIL usage in PyOS_Readline(): lock the GIL to set an exception.

Pass tstate to my_fgets() and _PyOS_WindowsConsoleReadline(). Cleanup
these functions.

(cherry picked from commit c353764fd5)

* bpo-40826: Add _PyOS_InterruptOccurred(tstate) function (GH-20599)

my_fgets() now calls _PyOS_InterruptOccurred(tstate) to check for
pending signals, rather calling PyOS_InterruptOccurred().

my_fgets() is called with the GIL released, whereas
PyOS_InterruptOccurred() must be called with the GIL held.

test_repl: use text=True and avoid SuppressCrashReport in
test_multiline_string_parsing().

Fix my_fgets() on Windows: fgets(fp) does crash if fileno(fp) is closed.

(cherry picked from commit fa7ab6aa0f)
This commit is contained in:
Victor Stinner 2020-06-03 17:49:25 +02:00 committed by GitHub
parent a125561397
commit 5d2396c8cf
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 121 additions and 42 deletions

View file

@ -1779,11 +1779,13 @@ PyOS_FiniInterrupts(void)
finisignal();
}
// The caller doesn't have to hold the GIL
int
PyOS_InterruptOccurred(void)
_PyOS_InterruptOccurred(PyThreadState *tstate)
{
PyInterpreterState *interp = _PyInterpreterState_GET();
if (!_Py_ThreadCanHandleSignals(interp)) {
assert(tstate != NULL);
if (!_Py_ThreadCanHandleSignals(tstate->interp)) {
return 0;
}
@ -1795,6 +1797,16 @@ PyOS_InterruptOccurred(void)
return 1;
}
// The caller must to hold the GIL
int
PyOS_InterruptOccurred(void)
{
PyThreadState *tstate = _PyThreadState_GET();
return _PyOS_InterruptOccurred(tstate);
}
static void
_clear_pending_signals(void)
{