Core files
- From: Owen Taylor <otaylor redhat com>
- To: gtk-devel-list redhat com
- Subject: Core files
- Date: 29 Jun 1999 22:43:24 -0400
Currently, GDK calls g_error() ( => abort() ) for
X IO errors and X errors.
For X IO errors, this makes no sense, since
an X IO errors almost certainly have no relation
to anything the client does. They are going to
occur either because the server died, or becuase
somebody did an XKillClient.
So, for X IO errors, I'm about to apply the
following patch which makes GDK die nicely
in that case.
The question is what to do about X errors. On
one hand, they typically do indicate something
going wrong, but on the other hand:
1) They occur asynchronously in general, so a
core isn't very useful unless the program
was run with --sync
2) They may occur for unpredictable reasons
(i.e., the plug part of a plug/socket dies
at the wrong time)
3) Enlightment does the wrong thing when you
Annihilate a window and destroys the window
instead of XKillClient()'ing the window.
So this currently causes GTK+ to core dump.
So, I'd like to make the core-dumping not the
default. Given that, there are two options
a) Never dump core, always exit() with a error
on stdout.
b) Dump core only if GTK+ is compiled with
--enable-debug.
Opinions?
Owen
--- gtk+-1.2.3/gdk/gdk.c.nocore Mon May 10 22:31:07 1999
+++ gtk+-1.2.3/gdk/gdk.c Tue Jun 8 12:14:55 1999
@@ -31,6 +31,7 @@
#include <stdlib.h>
#include <string.h>
#include <limits.h>
+#include <errno.h>
#ifdef HAVE_SYS_SELECT_H
#include <sys/select.h>
@@ -1074,8 +1075,27 @@
static int
gdk_x_io_error (Display *display)
{
- g_error ("an x io error occurred");
- return 0;
+ /* This is basically modelled after the code in XLib. We need
+ * an explicit error handler here, so we can disable our atexit()
+ * which would otherwise cause a nice segfault.
+ * We fprintf(stderr, instead of g_warning() because g_warning()
+ * could possibly be redirected to a dialog
+ */
+ if (errno == EPIPE)
+ {
+ fprintf (stderr, "X connection to %s broken (explicit kill or server shutdown).\n", gdk_display ? DisplayString (gdk_display) : gdk_get_display());
+ }
+ else
+ {
+ fprintf (stderr, "Fatal IO error %d (%s) on X server %s.\n",
+ errno, g_strerror (errno),
+ gdk_display ? DisplayString (gdk_display) : gdk_get_display());
+ }
+
+ /* Disable the atexit shutdown for GDK */
+ gdk_initialized = 0;
+
+ exit(1);
}
gchar *
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]