Commit 0caaedb1 authored by Paul Eggert's avatar Paul Eggert

Remove configure's --without-sync-input option.

When auditing signal-handling in preparation for cleaning it up,
I found that SYNC_INPUT has race conditions and would be a real
pain to fix.  Since it's an undocumented and deprecated
configure-time option, now seems like a good time to remove it.
Also see <http://bugs.gnu.org/11080#16>.
* configure.ac (SYNC_INPUT, BROKEN_SA_RESTART): Remove.
* admin/CPP-DEFINES (BROKEN_SA_RESTART, SA_RESTART): Remove.
* etc/TODO (Make SYNC_INPUT the default): Remove, as the code now
behaves as if SYNC_INPUT is always true.
* src/alloc.c (_bytes_used, __malloc_extra_blocks, _malloc_internal)
(_free_internal) [!DOUG_LEA_MALLOC]: Remove decls.
(alloc_mutex) [!SYSTEM_MALLOC && !SYNC_INPUT && HAVE_PTHREAD]:
(malloc_hysteresis):
(check_depth) [XMALLOC_OVERRUN_CHECK]:
(MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT):
(__malloc_hook, __realloc_hook, __free_hook, BYTES_USED)
(dont_register_blocks, bytes_used_when_reconsidered)
(bytes_used_when_full, emacs_blocked_free, emacs_blocked_malloc)
(emacs_blocked_realloc, reset_malloc_hooks, uninterrupt_malloc):
[!SYSTEM_MALLOC && !SYNC_INPUT]:
Remove. All uses removed.
(MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): Use a different
implementation, one that depends on whether the new macro
XMALLOC_BLOCK_INPUT_CHECK is defined, not on whether SYNC_INPUT
is defined.
* src/atimer.c (run_timers, handle_alarm_signal):
* src/keyboard.c (pending_signal, poll_for_input_1, poll_for_input)
(handle_async_input, process_pending_signals)
(handle_input_available_signal, init_keyboard):
* src/nsterm.m (ns_read_socket):
* src/process.c (wait_reading_process_output):
* src/regex.c (immediate_quit, IMMEDIATE_QUIT_CHECK):
* src/sysdep.c (emacs_sigaction_init) [SA_RESTART]:
(emacs_write):
* src/xterm.c (XTread_socket):
Assume SYNC_INPUT.
* src/conf_post.h (SA_RESTART) [IRIX6_5]: Do not #undef.
* src/eval.c (handling_signal): Remove.  All uses removed.
* src/lisp.h (ELSE_PENDING_SIGNALS): Remove.
All uses replaced with the SYNC_INPUT version.
(reset_malloc_hooks, uninterrupt_malloc, handling_signal):
Remove decls.
* src/sysdep.c, src/syssignal.h (main_thread) [FORWARD_SIGNAL_TO_MAIN_THREAD]:
Now static.

Fixes: debbugs:12450
parent 634b8cac
2012-09-16 Paul Eggert <eggert@cs.ucla.edu>
Remove configure's --without-sync-input option (Bug#12450).
* configure.ac (SYNC_INPUT, BROKEN_SA_RESTART): Remove.
2012-09-16 Glenn Morris <rgm@gnu.org>
Increase compartmentalization of Nextstep builds rules,
......
......@@ -90,7 +90,6 @@ BROKEN_GETWD
BROKEN_GET_CURRENT_DIR_NAME
BROKEN_NON_BLOCKING_CONNECT
BROKEN_PTY_READ_AFTER_EAGAIN
BROKEN_SA_RESTART
CLASH_DETECTION
DATA_SEG_BITS
DATA_START
......@@ -434,7 +433,6 @@ PTY_OPEN
PTY_TTY_NAME_SPRINTF
PURESIZE
RUN_TIME_REMAP
SA_RESTART
SETPGRP_RELEASES_CTTY
SETUP_SLAVE_PTY
SIGALRM
......
2012-09-16 Paul Eggert <eggert@cs.ucla.edu>
Remove configure's --without-sync-input option (Bug#12450).
* CPP-DEFINES (BROKEN_SA_RESTART, SA_RESTART): Remove.
2012-09-16 Glenn Morris <rgm@gnu.org>
* admin.el (set-version): No more need to set nextstep versions.
......
......@@ -128,11 +128,6 @@ AC_ARG_WITH([mailhost],[AS_HELP_STRING([--with-mailhost=HOSTNAME],
OPTION_DEFAULT_ON([sound],[don't compile with sound support])
OPTION_DEFAULT_ON([sync-input],[don't process async input synchronously])
if test "$with_sync_input" = yes; then
AC_DEFINE(SYNC_INPUT, 1, [Process async input synchronously.])
fi
dnl FIXME currently it is not the last.
dnl This should be the last --with option, because --with-x is
dnl added later on when we find the path of X, and it's best to
......@@ -3949,11 +3944,6 @@ case $opsys in
;;
hpux11)
dnl See comments in sysdep.c:sys_signal.
dnl SA_RESTART resets the timeout of `select' on hpux11.
dnl Defining BROKEN_SA_RESTART is not the same as undef'ing SA_RESTART.
AC_DEFINE(BROKEN_SA_RESTART, 1, [Define if SA_RESTART should only
be used in batch mode.])
dnl It works to open the pty's tty in the parent (Emacs), then
dnl close and reopen it in the child.
AC_DEFINE(USG_SUBTTY_WORKS, 1, [Define for USG systems where it
......
2012-09-16 Paul Eggert <eggert@cs.ucla.edu>
Remove configure's --without-sync-input option (Bug#12450).
* TODO (Make SYNC_INPUT the default): Remove, as the code now
behaves as if SYNC_INPUT is always true.
2012-09-13 Paul Eggert <eggert@cs.ucla.edu>
Use a more backwards-compatible timer format (Bug#12430).
......
......@@ -1229,13 +1229,6 @@ systems for HTML/XML files automatically."
For use by sml-mode, python-mode, tex-mode, scheme-mode, lisp-mode,
haskell-mode, tuareg-mode, ...
** Make SYNC_INPUT the default. [true since 2008-03-11]
All loops using immediate_quit need to be checked to ensure that
C-g can interrupt them, in case of an infinite loop. Once we
switch to using SYNC_INPUT, we can remove the BLOCK_INPUTs in the
allocation functions (allocate_string etc.) without worrying about
data munging.
** Add "link" button class
Add a standard button-class named "link", and make all other link-like
button classes inherit from it. Set the default face of the "link" button
......
2012-09-16 Paul Eggert <eggert@cs.ucla.edu>
Remove configure's --without-sync-input option (Bug#12450).
When auditing signal-handling in preparation for cleaning it up,
I found that SYNC_INPUT has race conditions and would be a real
pain to fix. Since it's an undocumented and deprecated
configure-time option, now seems like a good time to remove it.
Also see <http://bugs.gnu.org/11080#16>.
* alloc.c (_bytes_used, __malloc_extra_blocks, _malloc_internal)
(_free_internal) [!DOUG_LEA_MALLOC]: Remove decls.
(alloc_mutex) [!SYSTEM_MALLOC && !SYNC_INPUT && HAVE_PTHREAD]:
(malloc_hysteresis):
(check_depth) [XMALLOC_OVERRUN_CHECK]:
(MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT):
(__malloc_hook, __realloc_hook, __free_hook, BYTES_USED)
(dont_register_blocks, bytes_used_when_reconsidered)
(bytes_used_when_full, emacs_blocked_free, emacs_blocked_malloc)
(emacs_blocked_realloc, reset_malloc_hooks, uninterrupt_malloc):
[!SYSTEM_MALLOC && !SYNC_INPUT]:
Remove. All uses removed.
(MALLOC_BLOCK_INPUT, MALLOC_UNBLOCK_INPUT): Use a different
implementation, one that depends on whether the new macro
XMALLOC_BLOCK_INPUT_CHECK is defined, not on whether SYNC_INPUT
is defined.
* atimer.c (run_timers, handle_alarm_signal):
* keyboard.c (pending_signal, poll_for_input_1, poll_for_input)
(handle_async_input, process_pending_signals)
(handle_input_available_signal, init_keyboard):
* nsterm.m (ns_read_socket):
* process.c (wait_reading_process_output):
* regex.c (immediate_quit, IMMEDIATE_QUIT_CHECK):
* sysdep.c (emacs_sigaction_init) [SA_RESTART]:
(emacs_write):
* xterm.c (XTread_socket):
Assume SYNC_INPUT.
* conf_post.h (SA_RESTART) [IRIX6_5]: Do not #undef.
* eval.c (handling_signal): Remove. All uses removed.
* lisp.h (ELSE_PENDING_SIGNALS): Remove.
All uses replaced with the SYNC_INPUT version.
(reset_malloc_hooks, uninterrupt_malloc, handling_signal):
Remove decls.
* sysdep.c, syssignal.h (main_thread) [FORWARD_SIGNAL_TO_MAIN_THREAD]:
Now static.
* font.c (Ffont_shape_gstring): Remove unused local.
2012-09-16 Glenn Morris <rgm@gnu.org>
......
This diff is collapsed.
......@@ -369,7 +369,6 @@ run_timers (void)
if (! atimers)
pending_atimers = 0;
#ifdef SYNC_INPUT
if (pending_atimers)
pending_signals = 1;
else
......@@ -377,10 +376,6 @@ run_timers (void)
pending_signals = interrupt_input_pending;
set_alarm ();
}
#else
if (! pending_atimers)
set_alarm ();
#endif
}
......@@ -391,11 +386,7 @@ static void
handle_alarm_signal (int sig)
{
pending_atimers = 1;
#ifdef SYNC_INPUT
pending_signals = 1;
#else
run_timers ();
#endif
}
static void
......
......@@ -458,7 +458,8 @@ unmark_byte_stack (void)
Fsignal (Qquit, Qnil); \
AFTER_POTENTIAL_GC (); \
} \
ELSE_PENDING_SIGNALS \
else if (pending_signals) \
process_pending_signals (); \
} while (0)
......
......@@ -90,7 +90,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
char *_getpty();
#endif
#undef SA_RESTART /* not the same as defining BROKEN_SA_RESTART */
#endif /* IRIX6_5 */
#ifdef MSDOS
......
......@@ -848,14 +848,10 @@ main (int argc, char **argv)
/* Arrange to get warning messages as memory fills up. */
memory_warnings (0, malloc_warning);
/* Call malloc at least once, to run the initial __malloc_hook.
/* Call malloc at least once, to run malloc_initialize_hook.
Also call realloc and free for consistency. */
free (realloc (malloc (4), 4));
# ifndef SYNC_INPUT
/* Arrange to disable interrupt input inside malloc etc. */
uninterrupt_malloc ();
# endif /* not SYNC_INPUT */
#endif /* not SYSTEM_MALLOC */
#if defined (MSDOS) || defined (WINDOWSNT)
......@@ -2143,12 +2139,6 @@ You must run Emacs in batch mode in order to dump it. */)
memory_warnings (my_edata, malloc_warning);
}
#endif /* not WINDOWSNT */
#if defined (HAVE_PTHREAD) && !defined SYNC_INPUT
/* Pthread may call malloc before main, and then we will get an endless
loop, because pthread_self (see alloc.c) calls malloc the first time
it is called on some systems. */
reset_malloc_hooks ();
#endif
#endif /* not SYSTEM_MALLOC */
#ifdef DOUG_LEA_MALLOC
malloc_state_ptr = malloc_get_state ();
......
......@@ -117,12 +117,6 @@ static EMACS_INT when_entered_debugger;
Lisp_Object Vsignaling_function;
/* Set to non-zero while processing X events. Checked in Feval to
make sure the Lisp interpreter isn't called from a signal handler,
which is unsafe because the interpreter isn't reentrant. */
int handling_signal;
/* If non-nil, Lisp code must not be run since some part of Emacs is
in an inconsistent state. Currently, x-create-frame uses this to
avoid triggering window-configuration-change-hook while the new
......@@ -1106,7 +1100,6 @@ unwind_to_catch (struct catchtag *catch, Lisp_Object value)
/* Restore certain special C variables. */
set_poll_suppress_count (catch->poll_suppress_count);
UNBLOCK_INPUT_TO (catch->interrupt_input_blocked);
handling_signal = 0;
immediate_quit = 0;
do
......@@ -1486,7 +1479,7 @@ See also the function `condition-case'. */)
struct handler *h;
struct backtrace *bp;
immediate_quit = handling_signal = 0;
immediate_quit = 0;
abort_on_gc = 0;
if (gc_in_progress || waiting_for_input)
emacs_abort ();
......@@ -2039,9 +2032,6 @@ eval_sub (Lisp_Object form)
struct backtrace backtrace;
struct gcpro gcpro1, gcpro2, gcpro3;
if (handling_signal)
emacs_abort ();
if (SYMBOLP (form))
{
/* Look up its binding in the lexical environment.
......@@ -3104,8 +3094,6 @@ specbind (Lisp_Object symbol, Lisp_Object value)
{
struct Lisp_Symbol *sym;
eassert (!handling_signal);
CHECK_SYMBOL (symbol);
sym = XSYMBOL (symbol);
if (specpdl_ptr == specpdl + specpdl_size)
......@@ -3199,8 +3187,6 @@ specbind (Lisp_Object symbol, Lisp_Object value)
void
record_unwind_protect (Lisp_Object (*function) (Lisp_Object), Lisp_Object arg)
{
eassert (!handling_signal);
if (specpdl_ptr == specpdl + specpdl_size)
grow_specpdl ();
specpdl_ptr->func = function;
......
......@@ -673,8 +673,7 @@ find_interval (register INTERVAL tree, register ptrdiff_t position)
eassert (relative_position <= TOTAL_LENGTH (tree));
if (!handling_signal)
tree = balance_possible_root_interval (tree);
tree = balance_possible_root_interval (tree);
while (1)
{
......
......@@ -84,9 +84,7 @@ int interrupt_input_pending;
pending_atimers separately, to reduce code size. So, any code that
changes interrupt_input_pending or pending_atimers should update
this too. */
#ifdef SYNC_INPUT
int pending_signals;
#endif
#define KBD_BUFFER_SIZE 4096
......@@ -2010,17 +2008,9 @@ static struct atimer *poll_timer;
void
poll_for_input_1 (void)
{
/* Tell ns_read_socket() it is being called asynchronously so it can avoid
doing anything dangerous. */
#ifdef HAVE_NS
++handling_signal;
#endif
if (interrupt_input_blocked == 0
&& !waiting_for_input)
read_avail_input (0);
#ifdef HAVE_NS
--handling_signal;
#endif
}
/* Timer callback function for poll_timer. TIMER is equal to
......@@ -2031,12 +2021,8 @@ poll_for_input (struct atimer *timer)
{
if (poll_suppress_count == 0)
{
#ifdef SYNC_INPUT
interrupt_input_pending = 1;
pending_signals = 1;
#else
poll_for_input_1 ();
#endif
}
}
......@@ -7176,19 +7162,12 @@ tty_read_avail_input (struct terminal *terminal,
return nread;
}
#if defined SYNC_INPUT || defined USABLE_SIGIO
static void
handle_async_input (void)
{
interrupt_input_pending = 0;
#ifdef SYNC_INPUT
pending_signals = pending_atimers;
#endif
/* Tell ns_read_socket() it is being called asynchronously so it can avoid
doing anything dangerous. */
#ifdef HAVE_NS
++handling_signal;
#endif
while (1)
{
int nread;
......@@ -7199,13 +7178,8 @@ handle_async_input (void)
if (nread <= 0)
break;
}
#ifdef HAVE_NS
--handling_signal;
#endif
}
#endif /* SYNC_INPUT || USABLE_SIGIO */
#ifdef SYNC_INPUT
void
process_pending_signals (void)
{
......@@ -7213,24 +7187,17 @@ process_pending_signals (void)
handle_async_input ();
do_pending_atimers ();
}
#endif
#ifdef USABLE_SIGIO
static void
handle_input_available_signal (int sig)
{
#ifdef SYNC_INPUT
interrupt_input_pending = 1;
pending_signals = 1;
#endif
if (input_available_clear_time)
*input_available_clear_time = make_emacs_time (0, 0);
#ifndef SYNC_INPUT
handle_async_input ();
#endif
}
static void
......@@ -11365,9 +11332,7 @@ init_keyboard (void)
input_pending = 0;
interrupt_input_blocked = 0;
interrupt_input_pending = 0;
#ifdef SYNC_INPUT
pending_signals = 0;
#endif
/* This means that command_loop_1 won't try to select anything the first
time through. */
......
......@@ -2107,22 +2107,16 @@ extern char *stack_bottom;
If quit-flag is set to `kill-emacs' the SIGINT handler has received
a request to exit Emacs when it is safe to do. */
#ifdef SYNC_INPUT
extern void process_pending_signals (void);
extern int pending_signals;
#define ELSE_PENDING_SIGNALS \
else if (pending_signals) \
process_pending_signals ();
#else /* not SYNC_INPUT */
#define ELSE_PENDING_SIGNALS
#endif /* not SYNC_INPUT */
extern void process_quit_flag (void);
#define QUIT \
do { \
if (!NILP (Vquit_flag) && NILP (Vinhibit_quit)) \
process_quit_flag (); \
ELSE_PENDING_SIGNALS \
else if (pending_signals) \
process_pending_signals (); \
} while (0)
......@@ -2846,8 +2840,6 @@ extern void memory_warnings (void *, void (*warnfun) (const char *));
/* Defined in alloc.c. */
extern void check_pure_size (void);
extern void allocate_string_data (struct Lisp_String *, EMACS_INT, EMACS_INT);
extern void reset_malloc_hooks (void);
extern void uninterrupt_malloc (void);
extern void malloc_warning (const char *);
extern _Noreturn void memory_full (size_t);
extern _Noreturn void buffer_memory_full (ptrdiff_t);
......@@ -3043,7 +3035,6 @@ extern Lisp_Object Qand_rest;
extern Lisp_Object Vautoload_queue;
extern Lisp_Object Vsignaling_function;
extern Lisp_Object inhibit_lisp_code;
extern int handling_signal;
#if BYTE_MARK_STACK
extern struct catchtag *catchlist;
extern struct handler *handlerlist;
......
......@@ -588,10 +588,7 @@ - (void)menuNeedsUpdate: (NSMenu *)menu
From 10.6 on, we could also use -[NSMenu propertiesToUpdate]: In the
key press case, NSMenuPropertyItemImage (e.g.) won't be set.
*/
if (trackingMenu == 0
/* Also, don't try this if from an event picked up asynchronously,
as lots of lisp evaluation happens in ns_update_menubar. */
|| handling_signal != 0)
if (trackingMenu == 0)
return;
/*fprintf (stderr, "Updating menu '%s'\n", [[self title] UTF8String]); NSLog (@"%@\n", event); */
ns_update_menubar (frame, 1, self);
......
......@@ -3355,16 +3355,12 @@ overwriting cursor (usually when cursor on a tab) */
if (interrupt_input_blocked)
{
interrupt_input_pending = 1;
#ifdef SYNC_INPUT
pending_signals = 1;
#endif
return -1;
}
interrupt_input_pending = 0;
#ifdef SYNC_INPUT
pending_signals = pending_atimers;
#endif
BLOCK_INPUT;
n_emacs_events_pending = 0;
......@@ -3726,7 +3722,7 @@ overwriting cursor (usually when cursor on a tab) */
removed = YES;
}
if (removed)
if (removed)
[eview updateFrameSize: NO];
}
......@@ -3988,7 +3984,6 @@ static Lisp_Object ns_string_to_lispmod (const char *s)
/* count object allocs (About, click icon); on OS X use ObjectAlloc tool */
/*GSDebugAllocationActive (YES); */
BLOCK_INPUT;
handling_signal = 0;
baud_rate = 38400;
Fset_input_interrupt_mode (Qnil);
......@@ -6239,7 +6234,7 @@ - (NSRect)constrainFrameRect:(NSRect)frameRect toScreen:(NSScreen *)screen
NSRect r = [super constrainFrameRect:frameRect toScreen:screen];
return r;
}
if (f->output_data.ns->dont_constrain
|| ns_menu_bar_should_be_hidden ())
return frameRect;
......
......@@ -4395,10 +4395,8 @@ wait_reading_process_output (intmax_t time_limit, int nsecs, int read_kbd,
Otherwise, do pending quit if requested. */
if (read_kbd >= 0)
QUIT;
#ifdef SYNC_INPUT
else
process_pending_signals ();
#endif
/* Exit now if the cell we're waiting for became non-nil. */
if (! NILP (wait_for_cell) && ! NILP (XCAR (wait_for_cell)))
......
......@@ -1831,9 +1831,9 @@ typedef struct
/* The next available element. */
#define COMPILE_STACK_TOP (compile_stack.stack[compile_stack.avail])
/* Explicit quit checking is only used on NTemacs and whenever we
use polling to process input events. */
#if defined emacs && (defined WINDOWSNT || defined SYNC_INPUT) && defined QUIT
/* Explicit quit checking is needed for Emacs, which uses polling to
process input events. */
#ifdef emacs
extern int immediate_quit;
# define IMMEDIATE_QUIT_CHECK \
do { \
......
......@@ -1447,27 +1447,21 @@ emacs_sigaction_init (struct sigaction *action, signal_handler_t handler)
action->sa_handler = handler;
action->sa_flags = 0;
#if defined (SA_RESTART)
/* Emacs mostly works better with restartable system services. If this
flag exists, we probably want to turn it on here.
However, on some systems (only hpux11 at present) this resets the
timeout of `select' which means that `select' never finishes if
it keeps getting signals.
We define BROKEN_SA_RESTART on those systems. */
/* It's not clear why the comment above says "mostly works better". --Stef
When SYNC_INPUT is set, we don't want SA_RESTART because we need to poll
/* SA_RESTART causes interruptible functions with timeouts (e.g.,
'select') to reset their timeout on some platforms (e.g.,
HP-UX 11), which is not what we want. Also, when Emacs is
interactive, we don't want SA_RESTART because we need to poll
for pending input so we need long-running syscalls to be interrupted
after a signal that sets the interrupt_input_pending flag. */
/* Non-interactive keyboard input goes through stdio, where we always
want restartable system calls. */
# if defined (BROKEN_SA_RESTART) || defined (SYNC_INPUT)
if (noninteractive)
# endif
action->sa_flags = SA_RESTART;
#endif
}
#ifdef FORWARD_SIGNAL_TO_MAIN_THREAD
pthread_t main_thread;
static pthread_t main_thread;
#endif
/* If we are on the main thread, handle the signal SIG with HANDLER.
......@@ -1914,11 +1908,9 @@ emacs_write (int fildes, const char *buf, ptrdiff_t nbyte)
{
if (errno == EINTR)
{
#ifdef SYNC_INPUT
/* I originally used `QUIT' but that might causes files to
be truncated if you hit C-g in the middle of it. --Stef */
process_pending_signals ();
#endif
continue;
}
else
......
......@@ -64,8 +64,4 @@ extern void emacs_sigaction_init (struct sigaction *, signal_handler_t);
char *strsignal (int);
#endif
#ifdef FORWARD_SIGNAL_TO_MAIN_THREAD
extern pthread_t main_thread;
#endif
void handle_on_main_thread (int, signal_handler_t);
......@@ -9290,12 +9290,6 @@ add_to_log (const char *format, Lisp_Object arg1, Lisp_Object arg2)
struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
USE_SAFE_ALLOCA;
/* Do nothing if called asynchronously. Inserting text into
a buffer may call after-change-functions and alike and
that would means running Lisp asynchronously. */
if (handling_signal)
return;
fmt = msg = Qnil;
GCPRO4 (fmt, msg, arg1, arg2);
......
......@@ -7129,25 +7129,17 @@ XTread_socket (struct terminal *terminal, int expected, struct input_event *hold
if (interrupt_input_blocked)
{
interrupt_input_pending = 1;
#ifdef SYNC_INPUT
pending_signals = 1;
#endif
return -1;
}
interrupt_input_pending = 0;
#ifdef SYNC_INPUT
pending_signals = pending_atimers;
#endif
BLOCK_INPUT;
/* So people can tell when we have read the available input. */
input_signal_count++;
#ifndef SYNC_INPUT
++handling_signal;
#endif
/* For debugging, this gives a way to fake an I/O error. */
if (terminal->display_info.x == XTread_socket_fake_io_error)
{
......@@ -7236,9 +7228,6 @@ XTread_socket (struct terminal *terminal, int expected, struct input_event *hold
pending_autoraise_frame = 0;
}
#ifndef SYNC_INPUT
--handling_signal;
#endif
UNBLOCK_INPUT;
return count;
......@@ -7788,7 +7777,6 @@ x_connection_closed (Display *dpy, const char *error_message)
error_msg = alloca (strlen (error_message) + 1);
strcpy (error_msg, error_message);
handling_signal = 0;
/* Inhibit redisplay while frames are being deleted. */
specbind (Qinhibit_redisplay, Qt);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment