From 6492785ee521f3d46a07c07e96a7bc3d72b54f38 Mon Sep 17 00:00:00 2001 From: Greg Ward Date: Fri, 23 May 2003 01:50:37 +0000 Subject: [PATCH] Release the GIL around read(), write(), and select() calls. Bug spotted by Joerg Lehmann . --- Modules/ossaudiodev.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/Modules/ossaudiodev.c b/Modules/ossaudiodev.c index 948ffe7e1e6..6196d367392 100644 --- a/Modules/ossaudiodev.c +++ b/Modules/ossaudiodev.c @@ -385,7 +385,12 @@ oss_read(oss_audio_t *self, PyObject *args) if (rv == NULL) return NULL; cp = PyString_AS_STRING(rv); - if ((count = read(self->fd, cp, size)) < 0) { + + Py_BEGIN_ALLOW_THREADS + count = read(self->fd, cp, size); + Py_END_ALLOW_THREADS + + if (count < 0) { PyErr_SetFromErrno(PyExc_IOError); Py_DECREF(rv); return NULL; @@ -404,7 +409,12 @@ oss_write(oss_audio_t *self, PyObject *args) if (!PyArg_ParseTuple(args, "s#:write", &cp, &size)) { return NULL; } - if ((rv = write(self->fd, cp, size)) == -1) { + + Py_BEGIN_ALLOW_THREADS + rv = write(self->fd, cp, size); + Py_END_ALLOW_THREADS + + if (rv == -1) { return PyErr_SetFromErrno(PyExc_IOError); } else { self->ocount += rv; @@ -435,12 +445,16 @@ oss_writeall(oss_audio_t *self, PyObject *args) FD_SET(self->fd, &write_set_fds); while (size > 0) { + Py_BEGIN_ALLOW_THREADS select_rv = select(self->fd+1, NULL, &write_set_fds, NULL, NULL); + Py_END_ALLOW_THREADS assert(select_rv != 0); /* no timeout, can't expire */ if (select_rv == -1) return PyErr_SetFromErrno(PyExc_IOError); + Py_BEGIN_ALLOW_THREADS rv = write(self->fd, cp, size); + Py_END_ALLOW_THREADS if (rv == -1) { if (errno == EAGAIN) { /* buffer is full, try again */ errno = 0;