X-Git-Url: https://git.hcoop.net/bpt/emacs.git/blobdiff_plain/33f9662a640a52593f99f87b8ce1a313dd79e2f4..e3eea8436d864519022dd5825ac079e5ec89af95:/src/blockinput.h diff --git a/src/blockinput.h b/src/blockinput.h index c4c4979bcf..78dce69fe1 100644 --- a/src/blockinput.h +++ b/src/blockinput.h @@ -1,5 +1,6 @@ -/* Interface to blocking complicated interrupt-driven input. - Copyright (C) 1989, 1993 Free Software Foundation, Inc. +/* blockinput.h - interface to blocking complicated interrupt-driven input. + Copyright (C) 1989, 1993, 2002, 2003, 2004, + 2005, 2006 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -15,8 +16,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 -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ +the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +Boston, MA 02110-1301, 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 @@ -37,36 +43,90 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ 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. + interrupt_input_blocked, 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. */ -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; + +/* 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++) -/* 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 - -#define TOTALLY_UNBLOCK_INPUT (interrupt_input_blocked = 0) +/* 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) + +/* 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 */ +/* Don't use a prototype here; it causes trouble in some files. */ +extern void reinvoke_input_signal (); + +#endif /* EMACS_BLOCKINPUT_H */ + +/* arch-tag: 51a9ec86-945a-4966-8f04-2d1341250e03 + (do not change this comment) */