Release the GIL around read(), write(), and select() calls.
Bug spotted by Joerg Lehmann <joerg@luga.de>.
diff --git a/Modules/ossaudiodev.c b/Modules/ossaudiodev.c
index 948ffe7..6196d36 100644
--- a/Modules/ossaudiodev.c
+++ b/Modules/ossaudiodev.c
@@ -385,7 +385,12 @@
     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 @@
     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 @@
     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;