X-Git-Url: https://git.hcoop.net/bpt/emacs.git/blobdiff_plain/40a4095a69a5b10047d17fdb0af77123fdcde10f..8510724d46951d651a78424e12b93ccee100c665:/src/blockinput.h diff --git a/src/blockinput.h b/src/blockinput.h index da20e7f1ee..4b1270110d 100644 --- a/src/blockinput.h +++ b/src/blockinput.h @@ -1,12 +1,13 @@ /* blockinput.h - interface to blocking complicated interrupt-driven input. - Copyright (C) 1989, 1993 Free Software Foundation, Inc. + Copyright (C) 1989, 1993, 2001, 2002, 2003, 2004, + 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. This file is part of GNU Emacs. -GNU Emacs is free software; you can redistribute it and/or modify +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 2, 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 @@ -14,9 +15,12 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 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. */ +along with GNU Emacs. If not, see . */ +#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,18 +41,25 @@ 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 int interrupt_input_blocked; +extern volatile 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++) @@ -66,12 +77,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) */