Fix several bugs in the new console resizing code:
authorTaylor R. Campbell <net/mumble/campbell>
Sat, 31 Dec 2005 20:02:16 +0000 (20:02 +0000)
committerTaylor R. Campbell <net/mumble/campbell>
Sat, 31 Dec 2005 20:02:16 +0000 (20:02 +0000)
  - Move initialization of terminal sizes out of UX_initialize_tty
    and into a new function, UX_reinitialize_tty, which does not also
    initialize the stdin/stdout channels, and which UX_initialize_tty
    calls.
  - Call UX_reinitialize_tty, not UX_initialize_tty, in the SIGWINCH
    handler, so that it will not reallocate the stdin/stdout channels
    and potentially overflow the channel table.
  - Don't distribute the CONSOLE-RESIZE event in the CONSOLE-RESIZE
    interrupt handler, since its receivers (recipients?) may perform
    arbitrary computation that should not be performed in interrupt
    handlers.  Instead, signal a thread event to the console thread,
    if there is one, that will distribute the CONSOLE-RESIZE event.

v7/src/microcode/uxsig.c
v7/src/microcode/uxtty.c
v7/src/runtime/intrpt.scm

index a8871a0f1f07807233b560f9435e3e119493822f..bdc13537e8a8f8595fd627ed2a6ddbc8aa06da52 100644 (file)
@@ -1,6 +1,6 @@
 /* -*-C-*-
 
-$Id: uxsig.c,v 1.43 2005/12/25 17:04:39 riastradh Exp $
+$Id: uxsig.c,v 1.44 2005/12/31 20:02:16 riastradh Exp $
 
 Copyright 1990,1991,1992,1993,1994,1996 Massachusetts Institute of Technology
 Copyright 2000,2001,2005 Massachusetts Institute of Technology
@@ -497,8 +497,8 @@ DEFUN_VOID (OS_restartable_exit)
 static
 DEFUN_STD_HANDLER (sighnd_console_resize,
 {
-  extern void EXFUN (UX_initialize_tty, (void));
-  UX_initialize_tty ();
+  extern void EXFUN (UX_reinitialize_tty, (void));
+  UX_reinitialize_tty ();
   request_console_resize_interrupt ();
 })
 
index e24fb2ac38c3ca433fabbc8e0f1c8dfb84bbcea9..fa06b5b7bbdd193b304f43e7cb9997938474ca23 100644 (file)
@@ -1,6 +1,6 @@
 /* -*-C-*-
 
-$Id: uxtty.c,v 1.12 2003/02/14 18:28:24 cph Exp $
+$Id: uxtty.c,v 1.13 2005/12/31 20:02:16 riastradh Exp $
 
 Copyright (c) 1990-1999 Massachusetts Institute of Technology
 
@@ -107,14 +107,10 @@ DEFUN (tputs_write_char, (c), char c)
 }
 
 void
-DEFUN_VOID (UX_initialize_tty)
+DEFUN_VOID (UX_reinitialize_tty)
 {
   extern int EXFUN (atoi, (CONST char *));
-  extern Tchannel EXFUN (OS_open_fd, (int fd));
-  input_channel = (OS_open_fd (STDIN_FILENO));
-  (CHANNEL_INTERNAL (input_channel)) = 1;
-  output_channel = (OS_open_fd (STDOUT_FILENO));
-  (CHANNEL_INTERNAL (output_channel)) = 1;
+
   tty_x_size = (-1);
   tty_y_size = (-1);
   tty_command_beep = ALERT_STRING;
@@ -186,3 +182,14 @@ DEFUN_VOID (UX_initialize_tty)
       tty_command_clear = command;
     }
 }
+
+void
+DEFUN_VOID (UX_initialize_tty)
+{
+  extern Tchannel EXFUN (OS_open_fd, (int fd));
+  input_channel = (OS_open_fd (STDIN_FILENO));
+  (CHANNEL_INTERNAL (input_channel)) = 1;
+  output_channel = (OS_open_fd (STDOUT_FILENO));
+  (CHANNEL_INTERNAL (output_channel)) = 1;
+  UX_reinitialize_tty ();
+}
index 30dbdd10e0a96c85e8c3eb4701e12642b1c2146b..3e9825310af69adfeb3fa21ab74fda4af828cf00 100644 (file)
@@ -1,6 +1,6 @@
 #| -*-Scheme-*-
 
-$Id: intrpt.scm,v 14.26 2005/12/25 17:04:39 riastradh Exp $
+$Id: intrpt.scm,v 14.27 2005/12/31 20:02:16 riastradh Exp $
 
 Copyright 1986,1987,1988,1990,1991,1992 Massachusetts Institute of Technology
 Copyright 1993,1994,2004,2005 Massachusetts Institute of Technology
@@ -127,7 +127,11 @@ USA.
 (define (console-resize-handler interrupt-code interrupt-enables)
   interrupt-code interrupt-enables
   (clear-interrupts! interrupt-bit/global-3)
-  (event-distributor/invoke! event:console-resize))
+  (cond ((console-thread)
+         => (lambda (thread)
+              (signal-thread-event thread
+                (lambda ()
+                  (event-distributor/invoke! event:console-resize)))))))
 
 (define ((illegal-interrupt-handler interrupt-bit)
         interrupt-code interrupt-enables)