Commit f60f9108 authored by Richard M. Stallman's avatar Richard M. Stallman
Browse files

(x_connection_signal): Just return after calling `signal'.

(X_CONNECTION_LOCK_FLAG): Definition deleted.
(x_connection_signal_dpyinfo): Variable deleted.
(x_connection_signal_1): Function deleted.
(x_connection_close_if_hung): Function deleted.
parent cf149bdf
......@@ -121,10 +121,6 @@ extern void _XEditResCheckMessages ();
#include <string.h>
#ifdef SOLARIS2
#define X_CONNECTION_LOCK_FLAG XlibDisplayWriting
#ifndef min
#define min(a,b) ((a)<(b) ? (a) : (b))
......@@ -4580,55 +4576,19 @@ x_io_error_quitter (display)
/* Handle SIGPIPE, which can happen when the connection to a server
simply goes away. SIGPIPE is handled by x_connection_signal.
It works by sending a no-op command to each X server connection.
When we try a connection that has closed, we get SIGPIPE again.
But this time, it is handled by x_connection_signal_1.
That function knows which connection we were testing,
so it closes that one.
Don't need to do anything, because the write which caused the
SIGPIPE will fail, causing Xlib to invoke the X IO error handler,
which will do the appropriate cleanup for us. */
x_connection_closed never returns,
so if more than one connection was lost at once,
we only find one. But XTread_socket keeps trying them all,
so it will notice the other closed one sooner or later. */
static struct x_display_info *x_connection_signal_dpyinfo;
static SIGTYPE x_connection_signal ();
static SIGTYPE
x_connection_signal_1 (signalnum) /* If we don't have an argument, */
int signalnum; /* some compilers complain in signal calls. */
signal (SIGPIPE, x_connection_signal);
x_connection_closed (x_connection_signal_dpyinfo->display,
"connection was lost");
static SIGTYPE
x_connection_signal (signalnum) /* If we don't have an argument, */
int signalnum; /* some compilers complain in signal calls. */
x_connection_signal_dpyinfo = x_display_list;
sigunblock (sigmask (SIGPIPE));
while (x_connection_signal_dpyinfo)
signal (SIGPIPE, x_connection_signal_1);
x_connection_close_if_hung (x_connection_signal_dpyinfo);
XNoOp (x_connection_signal_dpyinfo->display);
XSync (x_connection_signal_dpyinfo->display, False);
/* Each time we get here, cycle through the displays now open. */
x_connection_signal_dpyinfo = x_connection_signal_dpyinfo->next;
/* We should have found some closed connection. */
abort ();
#ifdef USG
/* USG systems forget handlers when they are used;
must reestablish each time */
signal (signalnum, x_connection_signal);
#endif /* USG */
/* A buffer for storing X error messages. */
......@@ -6244,49 +6204,5 @@ syms_of_xterm ()
staticpro (&Qvendor_specific_keysyms);
Qvendor_specific_keysyms = intern ("vendor-specific-keysyms");
/* Avoid warnings or errors from including Xlibint.h.
We don't need these functions for the rest of this file. */
#undef bzero
#undef bcopy
#undef bcmp
#undef min
#undef max
#define free loserfree
#define malloc losermalloc
#define exit loserexit
#define abort loserabort
/* For XlibDisplayWriting */
#include <X11/Xlibint.h>
/* Check whether display connection DPYINFO is hung
because its thread-interlock is locked.
If it is, close the connection.
Do nothing if this system does not have a thread interlock. */
x_connection_close_if_hung (dpyinfo)
struct x_display_info *dpyinfo;
/* This tests (1) whether X_CONNECTION_LOCK_FLAG is defined at all,
and (2) whether the name it is defined as is itself defined.
(It ought to have been defined by Xlibint.h. */
if (dpyinfo->display->flags & X_CONNECTION_LOCK_FLAG)
/* If the thread-interlock is locked, assume this connection is dead.
This assumes that the library does not make other threads
that can be locking the display legitimately. */
dpyinfo->display->flags &= ~X_CONNECTION_LOCK_FLAG;
x_connection_closed (dpyinfo->display, "connection was lost");
/* Don't put any additional functions here! */
#endif /* not HAVE_X_WINDOWS */
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