]> code.delx.au - gnu-emacs/blobdiff - src/blockinput.h
Rework C source files to avoid ^(
[gnu-emacs] / src / blockinput.h
index 7501bfc91a058358295153a8b57c277465b3bcf1..bf5137510795bd69982c69a3f4f35d319a9f1bcc 100644 (file)
@@ -1,12 +1,12 @@
 /* blockinput.h - interface to blocking complicated interrupt-driven input.
-   Copyright (C) 1989, 1993, 2001-201 Free Software Foundation, Inc.
+   Copyright (C) 1989, 1993, 2001-2016 Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
 
 GNU Emacs is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
 
 GNU Emacs is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -19,103 +19,54 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 #ifndef EMACS_BLOCKINPUT_H
 #define EMACS_BLOCKINPUT_H
 
-#include "atimer.h"
+INLINE_HEADER_BEGIN
 
-/* When Emacs is using signal-driven input, the processing of those
-   input signals can get pretty hairy.  For example, when Emacs is
-   running under X windows, handling an input signal can entail
-   retrieving events from the X event queue, or making other X calls.
-
-   If an input signal occurs while Emacs is in the midst of some
-   non-reentrant code, and the signal processing invokes that same
-   code, we lose.  For example, malloc and the Xlib functions aren't
-   usually re-entrant, and both are used by the X input signal handler
-   - if we try to process an input signal in the midst of executing
-   any of these functions, we'll lose.
+/* Emacs should avoid doing anything hairy in a signal handler, because
+   so many system functions are non-reentrant.  For example, malloc
+   and the Xlib functions aren't usually re-entrant, so if they were
+   used by the SIGIO handler, we'd lose.
 
    To avoid this, we make the following requirements:
 
-   * Everyone must evaluate BLOCK_INPUT before entering these functions,
-   and then call UNBLOCK_INPUT after performing them.  Calls
-   BLOCK_INPUT and UNBLOCK_INPUT may be nested.
+   * Everyone must evaluate BLOCK_INPUT before performing actions that
+   might conflict with a signal handler, and then call UNBLOCK_INPUT
+   after performing them.  Calls BLOCK_INPUT and UNBLOCK_INPUT may be
+   nested.
 
    * Any complicated interrupt handling code should test
-   interrupt_input_blocked, and put off its work until later.
+   INPUT_BLOCKED_P, and put off its work until later.
 
    * If the interrupt handling code wishes, it may set
-   interrupt_input_pending to a non-zero value.  If that flag is set
-   when input becomes unblocked, UNBLOCK_INPUT will send a new SIGIO.  */
+   pending_signals to a non-zero value.  If that flag is set
+   when input becomes unblocked, UNBLOCK_INPUT will then read
+   input and process timers.
+
+   Historically, Emacs signal handlers did much more than they do now,
+   and this caused many BLOCK_INPUT calls to be sprinkled around the code.
+   FIXME: Remove calls that aren't needed now.  */
 
 extern volatile int interrupt_input_blocked;
 
-/* Nonzero means an input interrupt has arrived
-   during the current critical section.  */
-extern int interrupt_input_pending;
+/* Begin critical section. */
 
+INLINE void
+block_input (void)
+{
+  interrupt_input_blocked++;
+}
 
-/* Non-zero means asynchronous timers should be run when input is
-   unblocked.  */
+extern void unblock_input (void);
+extern void totally_unblock_input (void);
+extern void unblock_input_to (int);
 
-extern int pending_atimers;
+/* In critical section?  */
 
+INLINE bool
+input_blocked_p (void)
+{
+  return interrupt_input_blocked > 0;
+}
 
-/* Begin critical section. */
-#define BLOCK_INPUT (interrupt_input_blocked++)
-
-/* 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.
-
-   Always test interrupt_input_pending; that's not too expensive, and
-   it'll never get set if we don't need to resignal.  This is simpler
-   than dealing here with every configuration option that might affect
-   whether interrupt_input_pending can be nonzero.  */
-
-#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)    \
-       emacs_abort ();                         \
-    }                                          \
-  while (0)
-
-/* Undo any number of BLOCK_INPUT calls,
-   and also reinvoke any pending signal.  */
-
-#define TOTALLY_UNBLOCK_INPUT                  \
-  do if (interrupt_input_blocked != 0)         \
-    {                                          \
-      interrupt_input_blocked = 1;             \
-      UNBLOCK_INPUT;                           \
-    }                                          \
-  while (0)
-
-/* Undo any number of BLOCK_INPUT calls down to level LEVEL,
-   and also (if the level is now 0) reinvoke any pending signal.  */
-
-#define UNBLOCK_INPUT_TO(LEVEL)                                \
-  do                                                   \
-    {                                                  \
-      interrupt_input_blocked = (LEVEL) + 1;           \
-      UNBLOCK_INPUT;                                   \
-    }                                                  \
-  while (0)
-
-#define UNBLOCK_INPUT_RESIGNAL UNBLOCK_INPUT
-
-/* In critical section ? */
-#define INPUT_BLOCKED_P (interrupt_input_blocked > 0)
-
-/* Defined in keyboard.c */
-extern void reinvoke_input_signal (void);
+INLINE_HEADER_END
 
 #endif /* EMACS_BLOCKINPUT_H */