changeset 103250:3113546dd713

(x_delete_display): Don't call XrmDestroyDatabase here. (x_delete_terminal): Dissociate resource database from display and then call XrmDestroyDatabase before closing display.
author YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
date Tue, 19 May 2009 00:26:46 +0000
parents 019c8b2b5898
children ed4e37cf73c3
files src/xterm.c
diffstat 1 files changed, 14 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/src/xterm.c	Mon May 18 17:08:19 2009 +0000
+++ b/src/xterm.c	Tue May 19 00:26:46 2009 +0000
@@ -10613,13 +10613,6 @@
 	  tail->next = tail->next->next;
     }
 
-  /* Xt and GTK do this themselves.  */
-#if ! defined (USE_X_TOOLKIT) && ! defined (USE_GTK)
-#ifndef AIX		/* On AIX, XCloseDisplay calls this.  */
-  XrmDestroyDatabase (dpyinfo->xrdb);
-#endif
-#endif
-
   xfree (dpyinfo->x_id_name);
   xfree (dpyinfo->x_dnd_atoms);
   xfree (dpyinfo->color_cells);
@@ -10740,6 +10733,20 @@
       x_destroy_all_bitmaps (dpyinfo);
       XSetCloseDownMode (dpyinfo->display, DestroyAll);
 
+      /* Whether or not XCloseDisplay destroys the associated resource
+	 database depends on the version of libX11.  To avoid both
+	 crash and memory leak, we dissociate the database from the
+	 display and then destroy dpyinfo->xrdb ourselves.  */
+#ifdef HAVE_XRMSETDATABASE
+      XrmSetDatabase (dpyinfo->display, NULL);
+#else
+      dpyinfo->display->db = NULL;
+#endif
+      /* We used to call XrmDestroyDatabase from x_delete_display, but
+	 some older versions of libX11 crash if we call it after
+	 closing all the displays.  */
+      XrmDestroyDatabase (dpyinfo->xrdb);
+
 #ifdef USE_GTK
       xg_display_close (dpyinfo->display);
 #else