diff options
author | Guido van Rossum <guido@python.org> | 1997-11-03 22:04:46 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 1997-11-03 22:04:46 (GMT) |
commit | 8607ae2e570c9a9c31419418d5665b4eb4853003 (patch) | |
tree | bfdc0f7ba023966ef24efe4e63647a7fcb19f775 | |
parent | 3a44e1b9fbf914769083239a1c5deb1a71b2862d (diff) | |
download | cpython-8607ae2e570c9a9c31419418d5665b4eb4853003.zip cpython-8607ae2e570c9a9c31419418d5665b4eb4853003.tar.gz cpython-8607ae2e570c9a9c31419418d5665b4eb4853003.tar.bz2 |
Move the Py_{{BEGIN,END}_ALLOW,BLOCK}_THREADS macros in time_sleep()
to inside floatsleep(). This is necessary because floatsleep() does
the error handling and it must have grabbed the interpreter lock and
thread state before it can do so.
-rw-r--r-- | Modules/timemodule.c | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/Modules/timemodule.c b/Modules/timemodule.c index 8b12508..e8de0ac 100644 --- a/Modules/timemodule.c +++ b/Modules/timemodule.c @@ -202,13 +202,9 @@ time_sleep(self, args) double secs; if (!PyArg_Parse(args, "d", &secs)) return NULL; - Py_BEGIN_ALLOW_THREADS - if (floatsleep(secs) != 0) { - Py_BLOCK_THREADS - return NULL; - } - Py_END_ALLOW_THREADS - Py_INCREF(Py_None); + if (floatsleep(secs) != 0) + return NULL; + Py_INCREF(Py_None); return Py_None; } @@ -532,23 +528,29 @@ floatsleep(double secs) 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) { + Py_BLOCK_THREADS PyErr_SetFromErrno(PyExc_IOError); return -1; } + Py_END_ALLOW_THREADS #else /* !HAVE_SELECT */ #ifdef macintosh #define MacTicks (* (long *)0x16A) long deadline; deadline = MacTicks + (long)(secs * 60.0); while (MacTicks < deadline) { + /* XXX Should call some yielding function here */ if (PyErr_CheckSignals()) return -1; } #else /* !macintosh */ #ifdef __WATCOMC__ /* XXX Can't interrupt this sleep */ + Py_BEGIN_ALLOW_THREADS delay((int)(secs * 1000 + 0.5)); /* delay() uses milliseconds */ + Py_END_ALLOW_THREADS #else /* !__WATCOMC__ */ #ifdef MSDOS struct timeb t1, t2; @@ -568,7 +570,9 @@ floatsleep(double secs) } for (;;) { #ifdef QUICKWIN + Py_BEGIN_ALLOW_THREADS _wyield(); + Py_END_ALLOW_THREADS #endif if (PyErr_CheckSignals()) return -1; @@ -580,10 +584,14 @@ floatsleep(double secs) #else /* !MSDOS */ #ifdef MS_WIN32 /* XXX Can't interrupt this sleep */ + Py_BEGIN_ALLOW_THREADS Sleep((int)(secs*1000)); + Py_END_ALLOW_THREADS #else /* !MS_WIN32 */ /* XXX Can't interrupt this sleep */ + Py_BEGIN_ALLOW_THREADS sleep((int)secs); + Py_END_ALLOW_THREADS #endif /* !MS_WIN32 */ #endif /* !MSDOS */ #endif /* !__WATCOMC__ */ |