(x_delete_display): Don't call XrmDestroyDatabase here.
authorYAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
Tue, 19 May 2009 00:27:03 +0000 (00:27 +0000)
committerYAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
Tue, 19 May 2009 00:27:03 +0000 (00:27 +0000)
(x_delete_terminal): Dissociate resource database from display and
then call XrmDestroyDatabase before closing display.

src/ChangeLog
src/xterm.c

index 2518a8d..4645317 100644 (file)
@@ -1,3 +1,9 @@
+2009-05-19  YAMAMOTO Mitsuharu  <mituharu@math.s.chiba-u.ac.jp>
+
+       * xterm.c (x_delete_display): Don't call XrmDestroyDatabase here.
+       (x_delete_terminal): Dissociate resource database from display and
+       then call XrmDestroyDatabase before closing display.
+
 2009-05-18  Adrian Robert  <Adrian.B.Robert@gmail.com>
 
        * nsterm.m (ns_read_socket): Remove unused variable.
index f122500..ec6c4d4 100644 (file)
@@ -10613,13 +10613,6 @@ x_delete_display (dpyinfo)
          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_delete_terminal (struct terminal *terminal)
       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