Merged revisions 86214 via svnmerge from

svn+ssh://pythondev@svn.python.org/python/branches/py3k

........
  r86214 | antoine.pitrou | 2010-11-05 20:47:27 +0100 (ven., 05 nov. 2010) | 4 lines

  Issue #10311: The signal module now restores errno before returning from
  its low-level signal handler.  Patch by Hallvard B Furuseth.
........
This commit is contained in:
Antoine Pitrou 2010-11-05 19:54:58 +00:00
parent 938ece7152
commit 8d46e4267c
3 changed files with 25 additions and 15 deletions

View File

@ -263,6 +263,7 @@ Peter Funk
Geoff Furnish
Ulisses Furquim
Hagen Fürstenau
Hallvard B Furuseth
Achim Gaedke
Martin von Gagern
Lele Gaifax

View File

@ -143,6 +143,9 @@ C-API
Library
-------
- Issue #10311: The signal module now restores errno before returning from
its low-level signal handler. Patch by Hallvard B Furuseth.
- The keyword only restriction for the places argument in
unittest.TestCase.assert[Not]AlmostEqual methods has been removed.

View File

@ -166,16 +166,20 @@ checksignals_witharg(void * unused)
static void
signal_handler(int sig_num)
{
#ifdef WITH_THREAD
#ifdef WITH_PTH
int save_errno = errno;
#if defined(WITH_THREAD) && defined(WITH_PTH)
if (PyThread_get_thread_ident() != main_thread) {
pth_raise(*(pth_t *) main_thread, sig_num);
return;
}
else
#endif
{
#ifdef WITH_THREAD
/* See NOTES section above */
if (getpid() == main_pid) {
if (getpid() == main_pid)
#endif
{
Handlers[sig_num].tripped = 1;
/* Set is_tripped after setting .tripped, as it gets
cleared in PyErr_CheckSignals() before .tripped. */
@ -183,24 +187,26 @@ signal_handler(int sig_num)
Py_AddPendingCall(checksignals_witharg, NULL);
if (wakeup_fd != -1)
write(wakeup_fd, "\0", 1);
#ifdef WITH_THREAD
}
#endif
#ifdef SIGCHLD
if (sig_num == SIGCHLD) {
/* To avoid infinite recursion, this signal remains
reset until explicit re-instated.
Don't clear the 'func' field as it is our pointer
to the Python handler... */
return;
}
#endif
#ifndef HAVE_SIGACTION
#ifdef SIGCHLD
/* To avoid infinite recursion, this signal remains
reset until explicit re-instated.
Don't clear the 'func' field as it is our pointer
to the Python handler... */
if (sig_num != SIGCHLD)
#endif
/* If the handler was not set up with sigaction, reinstall it. See
* Python/pythonrun.c for the implementation of PyOS_setsig which
* makes this true. See also issue8354. */
PyOS_setsig(sig_num, signal_handler);
#endif
}
/* Issue #10311: asynchronously executing signal handlers should not
mutate errno under the feet of unsuspecting C code. */
errno = save_errno;
}