]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix crashes in `delete-terminal' caused by recursive calls or X displays with live...
authorKaroly Lorentey <lorentey@elte.hu>
Sat, 20 May 2006 12:20:41 +0000 (12:20 +0000)
committerKaroly Lorentey <lorentey@elte.hu>
Sat, 20 May 2006 12:20:41 +0000 (12:20 +0000)
* src/termhooks.h (terminal) <deleted>: New member.

* src/term.c (delete_tty): Use it.
  (deleting_tty): Remove old variable.

* src/terminal.c (delete_terminal): Use terminal->deleted.

* src/xterm.c (x_delete_terminal): Use terminal->deleted.  Delete all
  frames on the display explicitly.

git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-562

src/term.c
src/termhooks.h
src/terminal.c
src/xterm.c

index 00900ae96f499d647c195d2b2c1814adf1db8ca5..3076e8939f19ba6cc15a9c8878e192bcb1826248 100644 (file)
@@ -2970,9 +2970,6 @@ fatal (str, arg1, arg2)
 
 \f
 
-static int deleting_tty = 0;
-
-
 /* Delete the given tty terminal, closing all frames on it. */
 
 static void
@@ -2983,9 +2980,9 @@ delete_tty (struct terminal *terminal)
   char *tty_name;
   int last_terminal;
   
-  if (deleting_tty)
-    /* We get a recursive call when we delete the last frame on this
-       terminal. */
+  /* Protect against recursive calls.  Fdelete_frame calls us back
+     when we delete our last frame.  */
+  if (terminal->deleted)
     return;
 
   if (terminal->type != output_termcap)
@@ -3022,7 +3019,8 @@ delete_tty (struct terminal *terminal)
       tty->next = 0;
     }
 
-  deleting_tty = 1;
+  /* We must not throw any errors below this line.  */
+  terminal->deleted = 1;
 
   FOR_EACH_FRAME (tail, frame)
     {
index 8937a709f857a760a3dedceb55a4d60f6d958ee8..46fb0c453f5ab027729c08cd8d173297ee31fdfe 100644 (file)
@@ -299,7 +299,11 @@ struct terminal
 
   /* The number of frames that are on this terminal. */
   int reference_count;
-  
+
+  /* Nonzero while deleting this terminal.  Used to protect against
+     recursive calls to delete_terminal_hook.  */
+  int deleted;
+
   /* The type of the terminal device. */
   enum output_method type;
 
index fa6a0a4f51ea056de9264fc99f3290459db6b3de..db75e16b6cfd187e8bbade486391a167e1ce88b1 100644 (file)
@@ -277,7 +277,13 @@ delete_terminal (struct terminal *terminal)
 {
   struct terminal **tp;
   Lisp_Object tail, frame;
-  
+
+  /* Protect against recursive calls.  Fdelete_frame calls us back
+     when we delete our last frame.  */
+  if (terminal->deleted)
+    return;
+  terminal->deleted = 1;
+
   /* Check for and close live frames that are still on this
      terminal. */
   FOR_EACH_FRAME (tail, frame)
index 2070c65d76adb1317553b47c2f4258ff39803213..04242f2af3b090c7efb66319ad4a61c7ef4233b8 100644 (file)
@@ -10837,6 +10837,24 @@ x_delete_terminal (struct terminal *terminal)
 {
   struct x_display_info *dpyinfo = terminal->display_info.x;
   int i;
+  Lisp_Object tail, frame;
+
+  /* Protect against recursive calls.  Fdelete_frame calls us back
+     when we delete our last frame.  */
+  if (terminal->deleted)
+    return;
+  terminal->deleted = 1;
+
+  /* Check for and close live frames that are still on this
+     terminal. */
+  FOR_EACH_FRAME (tail, frame)
+    {
+      struct frame *f = XFRAME (frame);
+      if (FRAME_LIVE_P (f) && f->terminal == terminal)
+        {
+          Fdelete_frame (frame, Qt);
+        }
+    }
 
   BLOCK_INPUT;
   /* Free the fonts in the font table.  */