Mercurial > emacs
view src/blockinput.h @ 15145:86a1f426871e
Include config.h after CRT headers. Include fcntl.h.
(child_process, MAX_CHILDREN, CHILD_ACTIVE): Moved to nt.h.
(DebugPrint): New macro.
(new_child): Create input event structures for child processes.
(delete_child): New function.
(reader_thread): Return nonzero upon failure. Use _sys_read_ahead.
(create_child): Add child_process and parent PID arguments.
Don't create input event or thread structures here.
Fixup Win95 negative process IDs.
(register_child): Don't set consumed event; instead, set thread
status so that select will release it.
(remove_child): Renamed to reap_process. Only free resources
of synchronous children.
(win32_wait): Renamed to sys_wait. Sanity check to make sure
handle to subprocess exists. Don't reclaim thread resources here.
(win32_spawnve): Renamed to sys_spawnve.
Check for proper wait mode first thing.
Convert command name to DOS format.
Quote whitespace and quotes in arguments to subprocess.
Use alloca instead of malloc.
If max subprocesses, return EAGAIN in hopes of another completing.
(sys_select): Add support for socket input. Remove dead code.
Check input from children fairly.
(sys_select) [HAVE_TIMEVAL]: Remove conditional check and code.
(win32_kill_process): Renamed to sys_kill. Use OpenProcess
to terminate process.
(prepate_standard_handles, reset_standard_handles): Moved here
from nt.c.
author | Geoff Voelker <voelker@cs.washington.edu> |
---|---|
date | Fri, 03 May 1996 18:35:50 +0000 |
parents | ee40177f6c68 |
children | fb4c986db0e2 |
line wrap: on
line source
/* blockinput.h - interface to blocking complicated interrupt-driven input. Copyright (C) 1989, 1993 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 2, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* 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 int interrupt_input_blocked; /* Nonzero means an input interrupt has arrived during the current critical section. */ extern int interrupt_input_pending; /* 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 \ (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_RESIGNAL UNBLOCK_INPUT