1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-25 06:50:46 -08:00

(interrupt_handle): New variable.

(init_crit): Initialize it.
(delete_crit): Cleanup on exit.
(signal_quit): New function.  Signal any threads that are blocked
on a "system" call (provided they have been specially written to
check for this), so the call can fail with EINTR as on Unix.
This commit is contained in:
Richard M. Stallman 1998-05-15 20:53:39 +00:00
parent 85348a1744
commit 1ce3dc2b2d

View file

@ -33,6 +33,7 @@ Boston, MA 02111-1307, USA. */
CRITICAL_SECTION critsect;
extern HANDLE keyboard_handle;
HANDLE input_available = NULL;
HANDLE interrupt_handle = NULL;
void
init_crit ()
@ -42,6 +43,14 @@ init_crit ()
/* For safety, input_available should only be reset by get_next_msg
when the input queue is empty, so make it a manual reset event. */
keyboard_handle = input_available = CreateEvent (NULL, TRUE, FALSE, NULL);
/* interrupt_handle is signalled when quit (C-g) is detected, so that
blocking system calls can be interrupted. We make it a manual
reset event, so that if we should ever have multiple threads
performing system calls, they will all be interrupted (I'm guessing
that would the right response). Note that we use PulseEvent to
signal this event, so that it never remains signalled. */
interrupt_handle = CreateEvent (NULL, TRUE, FALSE, NULL);
}
void
@ -54,6 +63,19 @@ delete_crit ()
CloseHandle (input_available);
input_available = NULL;
}
if (interrupt_handle)
{
CloseHandle (interrupt_handle);
interrupt_handle = NULL;
}
}
void
signal_quit ()
{
/* Make sure this event never remains signalled; if the main thread
isn't in a blocking call, then this should do nothing. */
PulseEvent (interrupt_handle);
}
void