X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/ec5d8db72d43e1c7a83954a84518f60229506950..6ab508db632bc2a7820cc3c8ae32c9c9014a6f8c:/src/blockinput.h diff --git a/src/blockinput.h b/src/blockinput.h index 6aa4264994..6d4fde2c9b 100644 --- a/src/blockinput.h +++ b/src/blockinput.h @@ -18,6 +18,10 @@ along with GNU Emacs; see the file COPYING. If not, write to 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 @@ -50,6 +54,12 @@ extern int interrupt_input_blocked; 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++) @@ -67,15 +77,28 @@ extern int interrupt_input_pending; 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 \ - (interrupt_input_blocked--, \ - (interrupt_input_blocked < 0 ? (abort (), 0) : 0), \ - ((interrupt_input_blocked == 0 && interrupt_input_pending != 0) \ - ? (reinvoke_input_signal (), 0) \ - : 0)) + +#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 /* Defined in keyboard.c */ -extern void reinvoke_input_signal P_ ((void)); +/* Don't use a prototype here; it causes trouble in some files. */ +extern void reinvoke_input_signal (); + +#endif /* EMACS_BLOCKINPUT_H */