From e310b12978ae01088c166777c7bcd86cdf36917e Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Tue, 7 Jan 2003 20:40:15 +0000 Subject: [PATCH] Backport 2.58 from trunk (minus the cleanup): Fix from Michael Stone for SF bug #660476 and #513033 (bogus thread state swaps in readline). --- Misc/ACKS | 1 + Misc/NEWS | 10 ++++++++++ Modules/readline.c | 18 ++++++------------ 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/Misc/ACKS b/Misc/ACKS index b8902eb3e1d8..c7d68be99c43 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -499,6 +499,7 @@ Frank Stajano Richard Stoakley Casper Stoel Peter Stoehr +Michael Stone Ken Stox William Tanksley Christian Tanzer diff --git a/Misc/NEWS b/Misc/NEWS index 143808226028..2fa1e6698fed 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -1,3 +1,13 @@ +What's New in Python 2.2.3 +Release date: XX-XXX-2003 +========================== + +- XXX There's more, but nobody has updated NEWS so far. + +- Fixed broken threadstate swap in readline that could cause fatal + errors when a readline hook was being invoked while a background + thread was active. (SF bugs #660476 and #513033.) + What's New in Python 2.2.2 (final) ? Release date: 14-Oct-2002 ==================================== diff --git a/Modules/readline.c b/Modules/readline.c index 8d324cf8aa87..3aa62724c1bb 100644 --- a/Modules/readline.c +++ b/Modules/readline.c @@ -404,16 +404,14 @@ static struct PyMethodDef readline_methods[] = /* C function to call the Python hooks. */ static int -on_hook(PyObject *func, PyThreadState *tstate) +on_hook(PyObject *func, PyThreadState **tstate) { int result = 0; if (func != NULL) { PyObject *r; - PyThreadState *save_tstate; /* Note that readline is called with the interpreter lock released! */ - save_tstate = PyThreadState_Swap(NULL); - PyEval_RestoreThread(tstate); + PyEval_RestoreThread(*tstate); r = PyObject_CallFunction(func, NULL); if (r == NULL) goto error; @@ -427,8 +425,7 @@ on_hook(PyObject *func, PyThreadState *tstate) PyErr_Clear(); Py_XDECREF(r); done: - PyEval_SaveThread(); - PyThreadState_Swap(save_tstate); + *tstate = PyEval_SaveThread(); } return result; } @@ -436,14 +433,14 @@ on_hook(PyObject *func, PyThreadState *tstate) static int on_startup_hook(void) { - return on_hook(startup_hook, startup_hook_tstate); + return on_hook(startup_hook, &startup_hook_tstate); } #ifdef HAVE_RL_PRE_INPUT_HOOK static int on_pre_input_hook(void) { - return on_hook(pre_input_hook, pre_input_hook_tstate); + return on_hook(pre_input_hook, &pre_input_hook_tstate); } #endif @@ -455,10 +452,8 @@ on_completion(char *text, int state) char *result = NULL; if (completer != NULL) { PyObject *r; - PyThreadState *save_tstate; /* Note that readline is called with the interpreter lock released! */ - save_tstate = PyThreadState_Swap(NULL); PyEval_RestoreThread(completer_tstate); r = PyObject_CallFunction(completer, "si", text, state); if (r == NULL) @@ -478,8 +473,7 @@ on_completion(char *text, int state) PyErr_Clear(); Py_XDECREF(r); done: - PyEval_SaveThread(); - PyThreadState_Swap(save_tstate); + completer_tstate = PyEval_SaveThread(); } return result; } -- 2.47.3