view src/blockinput.h @ 80756:76e75acf7e4e

Fix typos (sync from the trunk). * facemenu.el (facemenu-unlisted-faces): Fix obsolescence declaration. * hi-lock.el (hi-lock-mode): Fix typo in docstring. * icomplete.el (icomplete-compute-delay, icomplete-get-keys): Doc fixes. (icomplete-delay-completions-threshold): Fix typo in docstring. * speedbar.el (speedbar-stealthy-function-list) (speedbar-verbosity-level, speedbar-supported-extension-expressions) (speedbar-update-current-file, speedbar-add-indicator) (speedbar-tag-expand): Reflow docstrings. (speedbar-use-imenu-flag, speedbar-use-tool-tips-flag) (speedbar-ignored-directory-regexp, speedbar-file-unshown-regexp) (speedbar-file-regexp, speedbar-message, speedbar-item-info) (speedbar-files-item-info, speedbar-fetch-replacement-function) (speedbar-maybe-add-localized-support) (speedbar-generic-list-positioned-group-p, speedbar-insert-generic-list) (speedbar-extract-one-symbol, speedbar-recenter-to-top) (speedbar-recenter, speedbar-separator-face): Fix typos in docstrings. (speedbar-ignored-directory-expressions, speedbar-handle-delete-frame) (speedbar-show-info-under-mouse, speedbar-directory-buttons) (speedbar-check-vc-this-line, speedbar-files-line-directory) (speedbar-buffer-buttons, speedbar-buffer-buttons-temp) (speedbar-buffers-line-directory): Doc fixes. * tool-bar.el (tool-bar-add-item): Fix typo in docstring. * emacs-lisp/edebug.el (edebug-unwrap*, edebug-signal) (edebug-restore-status): Doc fixes. (edebug-gensym, edebug-top-level-nonstop, edebug-eval-display) (edebug-eval-result-list, edebug-eval-redisplay, edebug) (edebug-trace): Fix typos in docstrings. * emulation/tpu-edt.el (tpu-match-beginning, tpu-match-end) (tpu-check-match, tpu-goto-breadcrumb, tpu-reset-screen-size) (tpu-toggle-overwrite-mode, tpu-include, tpu-get, tpu-what-line) (tpu-insert-escape, tpu-insert-formfeed, tpu-end-define-macro-key) (tpu-check-search-case, tpu-select, tpu-unselect, tpu-trim-line-ends) (tpu-toggle-control-keys): Fix typos in docstrings. (tpu-kill-buffer): Doc fix. (tpu-make-file-buffer-list, tpu-toggle-regexp, tpu-cut) (tpu-append-region, tpu-delete-current-char, tpu-emacs-replace): Reflow docstrings. * eshell/em-smart.el (eshell-review-quick-commands): Doc fix. * eshell/esh-arg.el (eshell-quote-backslash): Fix typo in docstring. * play/solitaire.el (solitaire, solitaire-mode-map, solitaire-mode-hook) (solitaire-mode, solitaire, solitaire-solve): Fix typos in docstrings. * progmodes/gdb-ui.el (gdb-source-info): Fix typo in docstring. * progmodes/python.el (python-comment-line-p, python-blank-line-p) (python-skip-out): Doc fixes.
author Juanma Barranquero <lekktu@gmail.com>
date Tue, 26 Aug 2008 11:02:51 +0000
parents fc2bcd2a8aad
children 606f2d163a64 29adfc9354e7
line wrap: on
line source

/* blockinput.h - interface to blocking complicated interrupt-driven input.
   Copyright (C) 1989, 1993, 2001, 2002, 2003, 2004,
                 2005, 2006, 2007, 2008  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, 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
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, 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
   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.

   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.

   * Any complicated interrupt handling code should test
   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 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++)

/* 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) */