Commit a98f1617 authored by Karoly Lorentey's avatar Karoly Lorentey

Fix crashes in `delete-terminal' caused by recursive calls or X displays with live frames.

* 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
parent 4a665758
...@@ -2970,9 +2970,6 @@ fatal (str, arg1, arg2) ...@@ -2970,9 +2970,6 @@ fatal (str, arg1, arg2)
static int deleting_tty = 0;
/* Delete the given tty terminal, closing all frames on it. */ /* Delete the given tty terminal, closing all frames on it. */
static void static void
...@@ -2983,9 +2980,9 @@ delete_tty (struct terminal *terminal) ...@@ -2983,9 +2980,9 @@ delete_tty (struct terminal *terminal)
char *tty_name; char *tty_name;
int last_terminal; int last_terminal;
if (deleting_tty) /* Protect against recursive calls. Fdelete_frame calls us back
/* We get a recursive call when we delete the last frame on this when we delete our last frame. */
terminal. */ if (terminal->deleted)
return; return;
if (terminal->type != output_termcap) if (terminal->type != output_termcap)
...@@ -3022,7 +3019,8 @@ delete_tty (struct terminal *terminal) ...@@ -3022,7 +3019,8 @@ delete_tty (struct terminal *terminal)
tty->next = 0; tty->next = 0;
} }
deleting_tty = 1; /* We must not throw any errors below this line. */
terminal->deleted = 1;
FOR_EACH_FRAME (tail, frame) FOR_EACH_FRAME (tail, frame)
{ {
......
...@@ -299,7 +299,11 @@ struct terminal ...@@ -299,7 +299,11 @@ struct terminal
/* The number of frames that are on this terminal. */ /* The number of frames that are on this terminal. */
int reference_count; 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. */ /* The type of the terminal device. */
enum output_method type; enum output_method type;
......
...@@ -277,7 +277,13 @@ delete_terminal (struct terminal *terminal) ...@@ -277,7 +277,13 @@ delete_terminal (struct terminal *terminal)
{ {
struct terminal **tp; struct terminal **tp;
Lisp_Object tail, frame; 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 /* Check for and close live frames that are still on this
terminal. */ terminal. */
FOR_EACH_FRAME (tail, frame) FOR_EACH_FRAME (tail, frame)
......
...@@ -10837,6 +10837,24 @@ x_delete_terminal (struct terminal *terminal) ...@@ -10837,6 +10837,24 @@ x_delete_terminal (struct terminal *terminal)
{ {
struct x_display_info *dpyinfo = terminal->display_info.x; struct x_display_info *dpyinfo = terminal->display_info.x;
int i; 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; BLOCK_INPUT;
/* Free the fonts in the font table. */ /* Free the fonts in the font table. */
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment