]> git.eshelyaron.com Git - emacs.git/commitdiff
(toplevel): Include <signal.h> and "syssignal.h".
authorGerd Moellmann <gerd@gnu.org>
Mon, 9 Jul 2001 17:15:48 +0000 (17:15 +0000)
committerGerd Moellmann <gerd@gnu.org>
Mon, 9 Jul 2001 17:15:48 +0000 (17:15 +0000)
(vox_configure, vox_close) [SIGIO]: Block/unblock SIGIO
around ioctls.

src/ChangeLog
src/sound.c

index da8913ea9ed6bde477c0d3ca26355adde557721c..67be01f753b55919112cc1498da875f9254b3e92 100644 (file)
@@ -1,3 +1,9 @@
+2001-07-09  Gerd Moellmann  <gerd@gnu.org>
+
+       * sound.c (toplevel): Include <signal.h> and "syssignal.h".
+       (vox_configure, vox_close) [SIGIO]: Block/unblock SIGIO
+       around ioctls.
+
 2001-07-06  Eli Zaretskii  <eliz@is.elta.co.il>
 
        * dosfns.c (syms_of_dosfns): Add \n\ at the end of a line in the
index 62d6cfb170b13127e7620bd4c496bd5642ee76eb..e5c800596565e159c284f050188b5a2f3cc85f3f 100644 (file)
@@ -32,6 +32,8 @@ Boston, MA 02111-1307, USA.  */
 #include "lisp.h"
 #include "dispextern.h"
 #include "atimer.h"
+#include <signal.h>
+#include "syssignal.h"
 
 /* FreeBSD has machine/soundcard.h.  Voxware sound driver docs mention
    sys/soundcard.h.  So, let's try whatever's there.  */
@@ -765,7 +767,13 @@ vox_configure (sd)
   
   xassert (sd->fd >= 0);
 
+  /* On GNU/Linux, it seems that the device driver doesn't like to be
+     interrupted by a signal.  Block the ones we know to cause
+     troubles.  */
   turn_on_atimers (0);
+#ifdef SIGIO
+  sigblock (sigmask (SIGIO));
+#endif
 
   val = sd->format;
   if (ioctl (sd->fd, SNDCTL_DSP_SETFMT, &sd->format) < 0
@@ -796,6 +804,9 @@ vox_configure (sd)
     }
   
   turn_on_atimers (1);
+#ifdef SIGIO
+  sigunblock (sigmask (SIGIO));
+#endif
 }
 
 
@@ -807,10 +818,21 @@ vox_close (sd)
 {
   if (sd->fd >= 0)
     {
-      /* Flush sound data, and reset the device.  */
+      /* On GNU/Linux, it seems that the device driver doesn't like to
+        be interrupted by a signal.  Block the ones we know to cause
+        troubles.  */
+#ifdef SIGIO
+      sigblock (sigmask (SIGIO));
+#endif
       turn_on_atimers (0);
+      
+      /* Flush sound data, and reset the device.  */
       ioctl (sd->fd, SNDCTL_DSP_SYNC, NULL);
+      
       turn_on_atimers (1);
+#ifdef SIGIO
+      sigunblock (sigmask (SIGIO));
+#endif
 
       /* Close the device.  */
       emacs_close (sd->fd);