mirror of
https://github.com/python/cpython.git
synced 2025-08-03 08:34:29 +00:00
[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 commitc353764fd5
) * 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 commitfa7ab6aa0f
)
This commit is contained in:
parent
a125561397
commit
5d2396c8cf
5 changed files with 121 additions and 42 deletions
|
@ -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)
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue