mirror of
https://github.com/python/cpython.git
synced 2025-07-19 09:15:34 +00:00
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:
parent
e3c330b42a
commit
30ea2f223f
10 changed files with 1576 additions and 3095 deletions
|
@ -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') {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue