Use PyOS_setsig() instead of directly calling signal() or sigaction().

This fixes the first half of bug #110611: the immediate exit when ^C
is hit when readline and threads are configured.

Also added a new module variable, readline.library_version.
This commit is contained in:
Guido van Rossum 2000-09-16 16:37:53 +00:00
parent d2cd7adf6f
commit 174efc9cdb
1 changed files with 12 additions and 5 deletions

View File

@ -447,19 +447,20 @@ call_readline(char *prompt)
{
size_t n;
char *p, *q;
void (*old_inthandler)(int);
old_inthandler = signal(SIGINT, onintr);
PyOS_sighandler_t old_inthandler;
old_inthandler = PyOS_setsig(SIGINT, onintr);
if (setjmp(jbuf)) {
#ifdef HAVE_SIGRELSE
/* This seems necessary on SunOS 4.1 (Rasmus Hahn) */
sigrelse(SIGINT);
#endif
signal(SIGINT, old_inthandler);
PyOS_setsig(SIGINT, old_inthandler);
return NULL;
}
rl_event_hook = PyOS_InputHook;
p = readline(prompt);
signal(SIGINT, old_inthandler);
PyOS_setsig(SIGINT, old_inthandler);
/* We must return a buffer allocated with PyMem_Malloc. */
if (p == NULL) {
@ -493,10 +494,16 @@ static char doc_module[] =
DL_EXPORT(void)
initreadline(void)
{
PyObject *m;
PyObject *m, *d, *v;
m = Py_InitModule4("readline", readline_methods, doc_module,
(PyObject *)NULL, PYTHON_API_VERSION);
d = PyModule_GetDict(m);
v = PyString_FromString(rl_library_version);
PyDict_SetItemString(d, "library_version", v);
Py_XDECREF(v);
if (isatty(fileno(stdin))) {
PyOS_ReadlineFunctionPointer = call_readline;
setup_readline();