diff README.multi-tty @ 82988:f82e3a6f5ccb

A few more bugfixes and new features. (Sigh.) I obviously need to remember to separate individual changes to multiple commits. src/emacsclient.c: Improved error handling. (decode_options): Changed frame option (again) from -f to -t. (print_help_and_exit): Ditto. (copy_from_to): Check EINTR after write, not EAGAIN. Removed SIGIO hack. (pty_conversation): Handle errors transmitted through the socket. Handle pty errors by not reading from it anymore. (main): Restore correct errno after socket_status failed. Send -tty on -t, not -pty. lisp/server.el (server-process-filter): Watch -tty, not -pty. Use make-frame-on-tty instead of make-terminal-frame. Don't set newframe to t if make-frame-on-tty failed. Don't delete frames here. Print correct message when there are no files to edit, but a new frame was requested. (server-sentinel): Delete the frame after the process. (server-handle-delete-frame): New function for delete-frame-functions. (server-start): Add server-handle-delete-frame to delete-frame-functions. (server-buffer-done): Don't delete frames here. src/alloc.c (mark_ttys): Add prototype. (Fgarbage_collect): Call mark_ttys. src/emacs.c: (shut_down_emacs): Don't flush stdout before reset_sys_modes(). src/process.c (add_keyboard_wait_descriptor_called_flag): Removed. (add_keyboard_wait_descriptor): Removed stdin hack. src/sysdep.c: Unconditionally include sysselect.h. (old_fcntl_flags): Changed to an array. (init_sigio, reset_sigio): Use it. (narrow_foreground_group, widen_foreground_group): Use setpgid, not setpgrp. (old_fcntl_owner): Changed to an array. (init_sys_modes, reset_sys_modes): Use it. Fix fsync() and reset_sigio() calls. src/term.c (Qframe_tty_name, Qframe_tty_type): New variables. (syms_of_term): Initialize them. (Fframe_tty_name, Fframe_tty_type): New functions. (term_init): Call add_keyboard_wait_descriptor(). (Fdelete_tty): New function. (delete_tty): Call delete_keyboard_wait_descriptor(). (get_current_tty): Removed. (mark_ttys): New function. git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-28
author Karoly Lorentey <lorentey@elte.hu>
date Wed, 31 Dec 2003 05:09:29 +0000
parents 1682917e56b4
children f3845715a5f6
line wrap: on
line diff
--- a/README.multi-tty	Tue Dec 30 19:27:57 2003 +0000
+++ b/README.multi-tty	Wed Dec 31 05:09:29 2003 +0000
@@ -45,15 +45,13 @@
 separate terminals.  (This seems to be very useful, emacsclient starts
 up even faster than vi!) :-) You can close the newly opened frame and
 return to the shell without exiting Emacs by pressing C-x 5 0, i.e.,
-delete-frame.  (Note that this does not seem to work yet on the
-original terminal.)  Creating new frames on the same tty with C-x 5 2
+delete-frame.  Creating new frames on the same tty with C-x 5 2
 works exactly as before.  Suspending Emacs is disabled at the moment.
 If you exit emacs, all terminals should be restored to their previous
 states.
 
 X, Mac, Windows and DOS support is broken, probably doesn't even
-compile -- this will be solved later.  Please see the attached README
-for other issues, implementation notes and sub-TODO items.
+compile -- this will be solved later.
 
 Only tested on my GNU/Linux box.
 
@@ -75,6 +73,10 @@
 ** A make-frame-on-tty function has been added to make it easier to
    create frames on new terminals.
 
+** New functions: frame-tty-name, frame-tty-type for accessing
+   terminal parameters, and delete-tty for closing the terminal
+   device.
+
 ** Emacsclient has been extended to support opening a new terminal
    frame.
 
@@ -108,6 +110,8 @@
    succeeds.  MULTIKBOARD is not used.  Secondary terminals don't send
    SIGIO!)
 
+   (Update: They do, now.)
+
 -- other-frame should cycle through the frames on the `current'
    terminal only.  
 
@@ -159,6 +163,10 @@
    (Update: This is bullshit.  There is a read_input_waiting function,
    extend that somehow.)
 
+   (Update of update: The first update was not right either, extending
+   read_input_waiting was not necessary.  Secondary ttys do seem to
+   send signals on input.)
+
 -- Make make-terminal-frame look up the `tty' and `tty-type' frame
    parameters from the currently selected terminal before the global
    default.
@@ -231,56 +239,67 @@
    free()ing memory.  Utterly trivial matter.  I love the C's memory
    management, it puts hair on your chest.)
 
-THINGS TO DO
-------------
+-- Support raw secondary terminals.  (Note that SIGIO works only on
+   the controlling terminal.) Hint: extend read_input_waiting() for
+   multiple ttys and hopefully this will be fixed.
 
-** Understand Emacs's low-level input system (it seems complicated) :-)
-   and maybe rewrite multi-tty input in terms of MULTIKBOARD.
+   (Done, it seems to have been working already for some time.  It
+   seems F_SETOWN does work, after all.  Not sure what made it fail
+   earlier, but it seems to be fixed (there were several changes
+   around request_sigio, maybe one of them did it).
+   read_input_waiting() is only used in sys_select(), don't change
+   it.)
 
-** Find out why does Emacs abort when it wants to close its
+-- Find out why does Emacs abort when it wants to close its
    controlling tty.  Hint: chan_process[] array.  Hey, maybe
    noninterrupt-IO would work, too?  Update: no, there is no process
    for stdin/out.
 
-** Support raw secondary terminals.  (Note that SIGIO works only on
-   the controlling terminal.) Hint: extend read_input_waiting() for
-   multiple ttys and hopefully this will be fixed.
+   (Done.  Added add/delete_keyboard_wait_descriptor to
+   term_init/delete_tty.  The hint was right, in a way.)
 
-** What does interrupt_input do?  I tried to disable it for raw
-   secondary tty support, but it does not seem to do anything useful.
-
-** Issue with SIGIO: it needs to be disabled during redisplay.  See if
+-- Issue with SIGIO: it needs to be disabled during redisplay.  See if
    fcntl() kernel behaviour could be emulated by emacsclient.
 
-** Get rid of the accessor macros in termchar.h, or define macros for
-   all members.
+   (Done.  Simply disabled the SIGIO emulation hack in emacsclient.)
 
-** Make parts of struct tty_output accessible from Lisp.  The device
-   name and the type is sufficient.
-
-** server.el: There are issues with saving files in buffers of closed
+-- server.el: There are issues with saving files in buffers of closed
    clients.  Try editing a file with emacsclient -f, and (without
    saving it) do a delete-frame.  The frame is closed without
    question, and a surprising confirmation prompt appears in another
    frame.
 
-** emacsclient.el, server.el: Handle eval or file open errors when
+   (Done.  delete-frame now asks for confirmation if it still has
+   pending buffers, and modified buffers don't seem to be deleted.)
+
+-- emacsclient.el, server.el: Handle eval or file open errors when
    doing -f.
 
-** Export delete_tty to the Lisp environment, for emacsclient.
+   (Done.)
 
-** Make sure C-g goes to the right frame.  This is hard, as SIGINT
-   doesn't have a tty parameter. :-(
+-- Make parts of struct tty_output accessible from Lisp.  The device
+   name and the type is sufficient.
+
+   (Done, see frame-tty-name and frame-tty-type.)
 
-** Implement support for starting an interactive Emacs session without
-   an initial frame.  (The user would connect to it and open frames
-   later, with emacsclient.)  Not necessarily a good idea.
+-- Export delete_tty to the Lisp environment, for emacsclient.
+
+   (Done, see delete-tty.)
 
-** Move optimalization parameters (costs) from union output_data to
-   a backend-neutral per-device structure.
+
+THINGS TO DO
+------------
 
 ** Find out the best way to support suspending Emacs with multiple
-   ttys.
+   ttys.  My guess: disable it on the controlling tty, but other ttys
+   should pass it on to emacsclient somehow.  (It is (I hope) trivial
+   to extend emacsclient to handle suspend/resume.  A `kill -STOP'
+   almost works right now.)
+
+** Move baud_rate to tty_output.
+
+** Move device-specific parameters (like costs) commonly used by
+   device backends to a common, device-dependent structure.
 
 ** Do tty output through term_hooks, like graphical display backends.
 
@@ -289,6 +308,10 @@
 ** Allow simultaneous X and tty frames.  (Handling input could be
    tricky.)
 
+** Implement support for starting an interactive Emacs session without
+   an initial frame.  (The user would connect to it and open frames
+   later, with emacsclient.)  Not necessarily a good idea.
+
 ** Fix Mac support (I can't do this myself).
 
 ** Fix W32 support (I can't do this myself).
@@ -297,4 +320,35 @@
 
 ** Do a grep on XXX and ?? for more issues.
 
+** Get rid of the accessor macros in termchar.h, or define macros for
+   all members.
+
+** Understand Emacs's low-level input system (it seems complicated) :-)
+   and maybe rewrite multi-tty input in terms of MULTIKBOARD.
+
+** What does interrupt_input do?  I tried to disable it for raw
+   secondary tty support, but it does not seem to do anything useful.
+
+** Make sure C-g goes to the right frame.  This is hard, as SIGINT
+   doesn't have a tty parameter. :-(
+
+** I have seen a case when Emacs with multiple ttys went ate 100% of
+   CPU time.  Strace showed this loop:
+
+
+	getpid()                                = 30284
+	kill(30284, SIGIO)                      = 0
+	--- SIGIO (I/O possible) @ 0 (0) ---
+	ioctl(6, FIONREAD, [0])                 = -1 EIO (Input/output error)
+	ioctl(5, FIONREAD, [0])                 = -1 EIO (Input/output error)
+	ioctl(0, FIONREAD, [0])                 = 0
+	sigreturn()                             = ? (mask now [])
+	gettimeofday({1072842297, 747760}, NULL) = 0
+	gettimeofday({1072842297, 747806}, NULL) = 0
+	select(9, [0 3 5 6], NULL, NULL, {0, 0}) = 2 (in [5 6], left {0, 0})
+	select(9, [0 3 5 6], NULL, NULL, {0, 0}) = 2 (in [5 6], left {0, 0})
+	gettimeofday({1072842297, 748245}, NULL) = 0
+
+   I have not been able to reproduce this.
+
 ;;; arch-tag: 8da1619e-2e79-41a8-9ac9-a0485daad17d