From 48b1ce5519623e83c5910453babef99ffdce3e23 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 1 Jul 2011 13:50:09 +0200 Subject: Issue #12462: time.sleep() now calls immediatly the (Python) signal handler if it is interrupted by a signal, instead of having to wait until the next instruction. Patch reviewed by Antoine Pitrou. --- Misc/NEWS | 4 ++++ Modules/timemodule.c | 17 +++++++++++------ 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS index a0ab6a1..6e0882b 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -200,6 +200,10 @@ Core and Builtins Library ------- +- Issue #12462: time.sleep() now calls immediatly the (Python) signal handler + if it is interrupted by a signal, instead of having to wait until the next + instruction. + - Issue #12442: new shutil.disk_usage function, providing total, used and free disk space statistics. diff --git a/Modules/timemodule.c b/Modules/timemodule.c index 2b86bcb..75aa8b6 100644 --- a/Modules/timemodule.c +++ b/Modules/timemodule.c @@ -915,23 +915,28 @@ floatsleep(double secs) #if defined(HAVE_SELECT) && !defined(__EMX__) struct timeval t; double frac; + int err; + frac = fmod(secs, 1.0); secs = floor(secs); t.tv_sec = (long)secs; t.tv_usec = (long)(frac*1000000.0); Py_BEGIN_ALLOW_THREADS - if (select(0, (fd_set *)0, (fd_set *)0, (fd_set *)0, &t) != 0) { + err = select(0, (fd_set *)0, (fd_set *)0, (fd_set *)0, &t); + Py_END_ALLOW_THREADS + if (err != 0) { #ifdef EINTR - if (errno != EINTR) { -#else - if (1) { + if (errno == EINTR) { + if (PyErr_CheckSignals()) + return -1; + } + else #endif - Py_BLOCK_THREADS + { PyErr_SetFromErrno(PyExc_IOError); return -1; } } - Py_END_ALLOW_THREADS #elif defined(__WATCOMC__) && !defined(__QNX__) /* XXX Can't interrupt this sleep */ Py_BEGIN_ALLOW_THREADS -- cgit v0.12