diff options
author | Greg Ward <gward@python.net> | 2003-05-27 01:57:21 (GMT) |
---|---|---|
committer | Greg Ward <gward@python.net> | 2003-05-27 01:57:21 (GMT) |
commit | d0d592fd3225daa50a56b84b6e3df61ffe8bfea4 (patch) | |
tree | eb86cba725ce6546a65463bc6c7729eb51ffa7e9 /Modules | |
parent | 7b4abbb2e20ba375ec7c842378bc57b30d5b1f04 (diff) | |
download | cpython-d0d592fd3225daa50a56b84b6e3df61ffe8bfea4.zip cpython-d0d592fd3225daa50a56b84b6e3df61ffe8bfea4.tar.gz cpython-d0d592fd3225daa50a56b84b6e3df61ffe8bfea4.tar.bz2 |
Oops, move the GIL release/reacquire from oss_sync() to _do_ioctl_0():
that way it applies to *only* the ioctl() call, and also happens for the
other blocking ioctls (POST, RESET).
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/ossaudiodev.c | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/Modules/ossaudiodev.c b/Modules/ossaudiodev.c index 139c4cf..4d2184e 100644 --- a/Modules/ossaudiodev.c +++ b/Modules/ossaudiodev.c @@ -291,13 +291,22 @@ static PyObject * _do_ioctl_0(int fd, PyObject *args, char *fname, int cmd) { char argfmt[32] = ":"; + int rv; assert(strlen(fname) <= 30); strcat(argfmt, fname); if (!PyArg_ParseTuple(args, argfmt)) return NULL; - if (ioctl(fd, cmd, 0) == -1) + /* According to hannu@opensound.com, all three of the ioctls that + use this function can block, so release the GIL. This is + especially important for SYNC, which can block for several + seconds. */ + Py_BEGIN_ALLOW_THREADS + rv = ioctl(fd, cmd, 0); + Py_END_ALLOW_THREADS + + if (rv == -1) return PyErr_SetFromErrno(PyExc_IOError); Py_INCREF(Py_None); return Py_None; @@ -353,12 +362,7 @@ oss_speed(oss_audio_t *self, PyObject *args) static PyObject * oss_sync(oss_audio_t *self, PyObject *args) { - int rv; - - Py_BEGIN_ALLOW_THREADS - rv = _do_ioctl_0(self->fd, args, "sync", SNDCTL_DSP_SYNC); - Py_END_ALLOW_THREADS - return rv; + return _do_ioctl_0(self->fd, args, "sync", SNDCTL_DSP_SYNC); } static PyObject * |