summaryrefslogtreecommitdiffstats
path: root/Modules
diff options
context:
space:
mode:
authorGreg Ward <gward@python.net>2003-05-27 01:57:21 (GMT)
committerGreg Ward <gward@python.net>2003-05-27 01:57:21 (GMT)
commitd0d592fd3225daa50a56b84b6e3df61ffe8bfea4 (patch)
treeeb86cba725ce6546a65463bc6c7729eb51ffa7e9 /Modules
parent7b4abbb2e20ba375ec7c842378bc57b30d5b1f04 (diff)
downloadcpython-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.c18
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 *