Use AREF and ASIZE.
[bpt/emacs.git] / src / blockinput.h
index c4c4979..6d4fde2 100644 (file)
@@ -1,4 +1,4 @@
-/* Interface to blocking complicated interrupt-driven input.
+/* blockinput.h - interface to blocking complicated interrupt-driven input.
    Copyright (C) 1989, 1993 Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
    Copyright (C) 1989, 1993 Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
@@ -15,8 +15,13 @@ GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with GNU Emacs; see the file COPYING.  If not, write to
 
 You should have received a copy of the GNU General Public License
 along with GNU Emacs; see the file COPYING.  If not, write to
-the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
 
 
+#ifndef EMACS_BLOCKINPUT_H
+#define EMACS_BLOCKINPUT_H
+
+#include "atimer.h"
 
 /* When Emacs is using signal-driven input, the processing of those
    input signals can get pretty hairy.  For example, when Emacs is
 
 /* When Emacs is using signal-driven input, the processing of those
    input signals can get pretty hairy.  For example, when Emacs is
@@ -43,30 +48,57 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
    interrupt_input_pending to a non-zero value.  If that flag is set
    when input becomes unblocked, UNBLOCK_INPUT will send a new SIGIO.  */
 
    interrupt_input_pending to a non-zero value.  If that flag is set
    when input becomes unblocked, UNBLOCK_INPUT will send a new SIGIO.  */
 
-extern unsigned int interrupt_input_blocked;
+extern int interrupt_input_blocked;
 
 /* Nonzero means an input interrupt has arrived
    during the current critical section.  */
 extern int interrupt_input_pending;
 
 
 /* Nonzero means an input interrupt has arrived
    during the current critical section.  */
 extern int interrupt_input_pending;
 
+
+/* Non-zero means asynchronous timers should be run when input is
+   unblocked.  */
+
+extern int pending_atimers;
+
 /* Begin critical section. */
 #define BLOCK_INPUT (interrupt_input_blocked++)
 
 /* Begin critical section. */
 #define BLOCK_INPUT (interrupt_input_blocked++)
 
-/* End critical section. */
-#ifdef SIGIO
-/* If doing interrupt input, and an interrupt came in when input was blocked,
-   reinvoke the interrupt handler now to deal with it.  */
-#define UNBLOCK_INPUT \
-  (interrupt_input_blocked--, \
-   (interrupt_input_blocked < 0 ? (abort (), 0) : 0), \
-   ((interrupt_input_blocked == 0 && interupt_input_pending != 0) \
-    ? (kill (0, SIGIO), 0) \
-    : 0))
-#else
-#define UNBLOCK_INPUT \
-  (interrupt_input_blocked--, \
-   (interrupt_input_blocked < 0 ? (abort (), 0) : 0))
-#endif
+/* End critical section.
+
+   If doing signal-driven input, and a signal came in when input was
+   blocked, reinvoke the signal handler now to deal with it.
+
+   We used to have two possible definitions of this macro - one for
+   when SIGIO was #defined, and one for when it wasn't; when SIGIO
+   wasn't #defined, we wouldn't bother to check if we should re-invoke
+   the signal handler.  But that doesn't work very well; some of the
+   files which use this macro don't #include the right files to get
+   SIGIO.
+
+   So, we always test interrupt_input_pending now; that's not too
+   expensive, and it'll never get set if we don't need to resignal.  */
+
+#define UNBLOCK_INPUT                          \
+  do                                           \
+    {                                          \
+      --interrupt_input_blocked;               \
+      if (interrupt_input_blocked == 0)                \
+       {                                       \
+         if (interrupt_input_pending)          \
+           reinvoke_input_signal ();           \
+         if (pending_atimers)                  \
+           do_pending_atimers ();              \
+       }                                       \
+      else if (interrupt_input_blocked < 0)    \
+       abort ();                               \
+    }                                          \
+  while (0)
 
 #define TOTALLY_UNBLOCK_INPUT (interrupt_input_blocked = 0)
 #define UNBLOCK_INPUT_RESIGNAL UNBLOCK_INPUT
 
 #define TOTALLY_UNBLOCK_INPUT (interrupt_input_blocked = 0)
 #define UNBLOCK_INPUT_RESIGNAL UNBLOCK_INPUT
+
+/* Defined in keyboard.c */
+/* Don't use a prototype here; it causes trouble in some files.  */
+extern void reinvoke_input_signal ();
+
+#endif /* EMACS_BLOCKINPUT_H */