From: Victor Stinner Date: Fri, 1 Jul 2011 11:50:09 +0000 (+0200) Subject: Issue #12462: time.sleep() now calls immediatly the (Python) signal handler if X-Git-Tag: v3.3.0a1~1989 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=48b1ce5519623e83c5910453babef99ffdce3e23;p=python 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. --- diff --git a/Misc/NEWS b/Misc/NEWS index a0ab6a15f5..6e0882b962 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 2b86bcb491..75aa8b61b8 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