In a threads-disabled build, typing Ctrl-C into a raw_input() crashed,
because (essentially) I didn't realise that PY_BEGIN/END_ALLOW_THREADS actually expanded to nothing under a no-threads build, so if you somehow NULLed out the threadstate (e.g. by calling PyThread_SaveThread) it would stay NULLed when you return to Python. Argh! Backport candidate.
This commit is contained in:
parent
ad351f806d
commit
e3afc598bc
|
@ -12,6 +12,9 @@ What's New in Python 2.5 alpha 1?
|
||||||
Core and builtins
|
Core and builtins
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
- Typing Ctrl-C whilst raw_input() was waiting in a build with threads
|
||||||
|
disabled caused a crash.
|
||||||
|
|
||||||
- Bug #1165306: instancemethod_new allowed the creation of a method
|
- Bug #1165306: instancemethod_new allowed the creation of a method
|
||||||
with im_class == im_self == NULL, which caused a crash when called.
|
with im_class == im_self == NULL, which caused a crash when called.
|
||||||
|
|
||||||
|
|
|
@ -775,9 +775,13 @@ readline_until_enter_or_signal(char *prompt, int *signal)
|
||||||
}
|
}
|
||||||
else if (errno == EINTR) {
|
else if (errno == EINTR) {
|
||||||
int s;
|
int s;
|
||||||
|
#ifdef WITH_THREAD
|
||||||
PyEval_RestoreThread(_PyOS_ReadlineTState);
|
PyEval_RestoreThread(_PyOS_ReadlineTState);
|
||||||
|
#endif
|
||||||
s = PyErr_CheckSignals();
|
s = PyErr_CheckSignals();
|
||||||
|
#ifdef WITH_THREAD
|
||||||
PyEval_SaveThread();
|
PyEval_SaveThread();
|
||||||
|
#endif
|
||||||
if (s < 0) {
|
if (s < 0) {
|
||||||
rl_free_line_state();
|
rl_free_line_state();
|
||||||
rl_cleanup_after_signal();
|
rl_cleanup_after_signal();
|
||||||
|
|
|
@ -82,9 +82,13 @@ my_fgets(char *buf, int len, FILE *fp)
|
||||||
#ifdef EINTR
|
#ifdef EINTR
|
||||||
if (errno == EINTR) {
|
if (errno == EINTR) {
|
||||||
int s;
|
int s;
|
||||||
|
#ifdef WITH_THREAD
|
||||||
PyEval_RestoreThread(_PyOS_ReadlineTState);
|
PyEval_RestoreThread(_PyOS_ReadlineTState);
|
||||||
|
#endif
|
||||||
s = PyErr_CheckSignals();
|
s = PyErr_CheckSignals();
|
||||||
|
#ifdef WITH_THREAD
|
||||||
PyEval_SaveThread();
|
PyEval_SaveThread();
|
||||||
|
#endif
|
||||||
if (s < 0) {
|
if (s < 0) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue