• Paul Eggert's avatar
    Revamp quitting and fix infloops · b01ac672
    Paul Eggert authored
    This fixes some infinite loops that cannot be quitted out of,
    e.g., (defun foo () (nth most-positive-fixnum '#1=(1 . #1#)))
    when byte-compiled and when run under X.  See:
    http://lists.gnu.org/archive/html/emacs-devel/2017-01/msg00577.html
    This also attempts to keep the performance improvements I recently
    added, as much as possible under the constraint that the infloops
    must be caught.  In some cases this fixes infloop bugs recently
    introduced when I removed immediate_quit.
    * src/alloc.c (Fmake_list):
    Use rarely_quit, not maybe_quit, for speed in the usual case.
    * src/bytecode.c (exec_byte_code):
    * src/editfns.c (Fcompare_buffer_substrings):
    * src/fns.c (Fnthcdr):
    * src/syntax.c (scan_words, skip_chars, skip_syntaxes)
    (Fbackward_prefix_chars):
    Use rarely_quit so that users can C-g out of long loops.
    * src/callproc.c (call_process_cleanup, call_process):
    * src/fileio.c (read_non_regular, Finsert_file_contents):
    * src/indent.c (compute_motion):
    * src/syntax.c (scan_words, Fforward_comment):
    Remove now-unnecessary maybe_quit calls.
    * src/callproc.c (call_process):
    * src/doc.c (get_doc_string, Fsnarf_documentation):
    * src/fileio.c (Fcopy_file, read_non_regular, Finsert_file_contents):
    * src/lread.c (safe_to_load_version):
    * src/sysdep.c (system_process_attributes) [GNU_LINUX]:
    Use emacs_read_quit instead of emacs_read in places where
    C-g handling is safe.
    * src/eval.c (maybe_quit): Move comment here from lisp.h.
    * src/fileio.c (Fcopy_file, e_write):
    Use emacs_write_quit instead of emacs_write_sig in places where
    C-g handling is safe.
    * src/filelock.c (create_lock_file): Use emacs_write, not
    plain write, as emacs_write no longer has a problem.
    (read_lock_data): Use emacs_read, not read, as emacs_read
    no longer has a problem.
    * src/fns.c (rarely_quit): Move to lisp.h and rename to
    incr_rarely_quit.  All uses changed..
    * src/fns.c (Fmemq, Fmemql, Fassq, Frassq, Fplist_put, Fplist_member):
    * src/indent.c (compute_motion):
    * src/syntax.c (find_defun_start, back_comment, forw_comment)
    (Fforward_comment, scan_lists, scan_sexps_forward):
    Use incr_rarely_quit so that users can C-g out of long loops.
    * src/fns.c (Fnconc): Move incr_rarely_quit call to within
    inner loop, so that it catches C-g there too.
    * src/keyboard.c (tty_read_avail_input): Remove commented-out
    and now-obsolete code dealing with interrupts.
    * src/lisp.h (rarely_quit, incr_rarely_quit): New functions,
    the latter moved here from fns.c and renamed from rarely_quit.
    (emacs_read_quit, emacs_write_quit): New decls.
    * src/search.c (find_newline, search_buffer, find_newline1):
    Add maybe_quit to catch C-g.
    * src/sysdep.c (get_child_status): Always invoke maybe_quit
    if interruptible, so that the caller need not bother.
    (emacs_nointr_read, emacs_read_quit, emacs_write_quit):
    New functions.
    (emacs_read): Rewrite in terms of emacs_nointr_read.
    Do not handle C-g or signals; that is now for emacs_read_quit.
    (emacs_full_write): Replace PROCESS_SIGNALS two-way arg
    with INTERRUPTIBLE three-way arg.  All uses changed.
    b01ac672
lread.c 142 KB