X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/3b7ad313e0d7b351c55cf999474b61cdc18ecad1..5c4aaa79052d55bf9f2c28b49a637c7b3a691337:/src/blockinput.h diff --git a/src/blockinput.h b/src/blockinput.h index a4bf325633..78dce69fe1 100644 --- a/src/blockinput.h +++ b/src/blockinput.h @@ -1,5 +1,6 @@ /* blockinput.h - interface to blocking complicated interrupt-driven input. - Copyright (C) 1989, 1993 Free Software Foundation, Inc. + Copyright (C) 1989, 1993, 2002, 2003, 2004, + 2005, 2006 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -15,9 +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, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, 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 @@ -38,7 +43,7 @@ Boston, MA 02111-1307, 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 @@ -50,6 +55,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,12 +78,55 @@ 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 TOTALLY_UNBLOCK_INPUT (interrupt_input_blocked = 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) + +/* 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) */