This closes patch:

[ 960406 ] unblock signals in threads

although the changes do not correspond exactly to any patch attached to
that report.

Non-main threads no longer have all signals masked.

A different interface to readline is used.

The handling of signals inside calls to PyOS_Readline is now rather
different.

These changes are all a bit scary!  Review and cross-platform testing
much appreciated.
This commit is contained in:
Michael W. Hudson 2004-07-07 17:44:12 +00:00
parent e3c330b42a
commit 30ea2f223f
10 changed files with 1576 additions and 3095 deletions

View file

@ -1589,7 +1589,8 @@ builtin_raw_input(PyObject *self, PyObject *args)
prompt);
Py_XDECREF(po);
if (s == NULL) {
PyErr_SetNone(PyExc_KeyboardInterrupt);
if (!PyErr_Occurred())
PyErr_SetNone(PyExc_KeyboardInterrupt);
return NULL;
}
if (*s == '\0') {

View file

@ -318,7 +318,7 @@ static volatile int things_to_do = 0;
int
Py_AddPendingCall(int (*func)(void *), void *arg)
{
static int busy = 0;
static volatile int busy = 0;
int i, j;
/* XXX Begin critical section */
/* XXX If you want this to be safe against nested

View file

@ -1435,7 +1435,8 @@ err_input(perrdetail *err)
msg = "EOL while scanning single-quoted string";
break;
case E_INTR:
PyErr_SetNone(PyExc_KeyboardInterrupt);
if (!PyErr_Occurred())
PyErr_SetNone(PyExc_KeyboardInterrupt);
Py_XDECREF(v);
return;
case E_NOMEM:

View file

@ -119,7 +119,6 @@ PyThread_start_new_thread(void (*func)(void *), void *arg)
{
pthread_t th;
int status;
sigset_t oldmask, newmask;
#if defined(THREAD_STACK_SIZE) || defined(PTHREAD_SYSTEM_SCHED_SUPPORTED)
pthread_attr_t attrs;
#endif
@ -137,13 +136,6 @@ PyThread_start_new_thread(void (*func)(void *), void *arg)
pthread_attr_setscope(&attrs, PTHREAD_SCOPE_SYSTEM);
#endif
/* Mask all signals in the current thread before creating the new
* thread. This causes the new thread to start with all signals
* blocked.
*/
sigfillset(&newmask);
SET_THREAD_SIGMASK(SIG_BLOCK, &newmask, &oldmask);
status = pthread_create(&th,
#if defined(THREAD_STACK_SIZE) || defined(PTHREAD_SYSTEM_SCHED_SUPPORTED)
&attrs,
@ -154,9 +146,6 @@ PyThread_start_new_thread(void (*func)(void *), void *arg)
(void *)arg
);
/* Restore signal mask for original thread */
SET_THREAD_SIGMASK(SIG_SETMASK, &oldmask, NULL);
#if defined(THREAD_STACK_SIZE) || defined(PTHREAD_SYSTEM_SCHED_SUPPORTED)
pthread_attr_destroy(&attrs);
#endif