Issue #16105: When a signal handler fails to write to the file descriptor registered with `signal.set_wakeup_fd()`, report an exception instead of ignoring the error.

This commit is contained in:
Antoine Pitrou 2013-08-17 20:27:56 +02:00
parent f920a1c1f1
commit 6f6ec37838
3 changed files with 62 additions and 1 deletions

View file

@ -175,15 +175,31 @@ checksignals_witharg(void * unused)
return PyErr_CheckSignals();
}
static int
report_wakeup_error(void *data)
{
int save_errno = errno;
errno = (int) (Py_intptr_t) data;
PyErr_SetFromErrno(PyExc_OSError);
PySys_WriteStderr("Exception ignored when trying to write to the "
"signal wakeup fd:\n");
PyErr_WriteUnraisable(NULL);
errno = save_errno;
return 0;
}
static void
trip_signal(int sig_num)
{
unsigned char byte;
int rc = 0;
Handlers[sig_num].tripped = 1;
if (wakeup_fd != -1) {
byte = (unsigned char)sig_num;
write(wakeup_fd, &byte, 1);
while ((rc = write(wakeup_fd, &byte, 1)) == -1 && errno == EINTR);
if (rc == -1)
Py_AddPendingCall(report_wakeup_error, (void *) (Py_intptr_t) errno);
}
if (is_tripped)
return;