]> git.eshelyaron.com Git - emacs.git/commitdiff
Don't run FOR_EACH_FRAME when there's no frame left (Bug#29961)
authorMartin Rudalics <rudalics@gmx.at>
Fri, 15 Dec 2017 07:30:09 +0000 (08:30 +0100)
committerMartin Rudalics <rudalics@gmx.at>
Fri, 15 Dec 2017 07:30:09 +0000 (08:30 +0100)
This does not fix Bug#29961 but avoids that Emacs segfaults when
trying to shut down because it lost connection to the X server.

* src/dispnew.c (check_glyph_memory):
* src/frame.c (delete_frame): Don't run FOR_EACH_FRAME when
there's no frame left (Bug#29961).

src/dispnew.c
src/frame.c

index b0fc5c31fa13b6ed6a86d2f1bb7fe20b588f0269..d07864718c30cb5de73c8e82880c133fed4ac34f 100644 (file)
@@ -2260,8 +2260,9 @@ check_glyph_memory (void)
   Lisp_Object tail, frame;
 
   /* Free glyph memory for all frames.  */
-  FOR_EACH_FRAME (tail, frame)
-    free_glyphs (XFRAME (frame));
+  if (!NILP (Vframe_list))
+    FOR_EACH_FRAME (tail, frame)
+      free_glyphs (XFRAME (frame));
 
 #if defined GLYPH_DEBUG && defined ENABLE_CHECKING
   /* Check that nothing is left allocated.  */
index 5bafbeddcce7532e93cb444f9979034fae05c657..66d1b5c759e3a12d55364f8cc9fb1e6ccad83b78 100644 (file)
@@ -2058,7 +2058,7 @@ delete_frame (Lisp_Object frame, Lisp_Object force)
 
   /* If we've deleted the last_nonminibuf_frame, then try to find
      another one.  */
-  if (f == last_nonminibuf_frame)
+  if (f == last_nonminibuf_frame && !NILP (Vframe_list))
     {
       last_nonminibuf_frame = 0;
 
@@ -2076,7 +2076,7 @@ delete_frame (Lisp_Object frame, Lisp_Object force)
 
   /* If there's no other frame on the same kboard, get out of
      single-kboard state if we're in it for this kboard.  */
-  if (kb != NULL)
+  if (kb != NULL && !NILP (Vframe_list))
     {
       /* Some frame we found on the same kboard, or nil if there are none.  */
       Lisp_Object frame_on_same_kboard = Qnil;
@@ -2093,7 +2093,9 @@ delete_frame (Lisp_Object frame, Lisp_Object force)
   /* If we've deleted this keyboard's default_minibuffer_frame, try to
      find another one.  Prefer minibuffer-only frames, but also notice
      frames with other windows.  */
-  if (kb != NULL && EQ (frame, KVAR (kb, Vdefault_minibuffer_frame)))
+  if (kb != NULL
+      && EQ (frame, KVAR (kb, Vdefault_minibuffer_frame))
+      && !NILP (Vframe_list))
     {
       /* The last frame we saw with a minibuffer, minibuffer-only or not.  */
       Lisp_Object frame_with_minibuf = Qnil;