diff options
| author | Paul Eggert | 2017-02-01 15:18:44 -0800 |
|---|---|---|
| committer | Paul Eggert | 2017-02-01 15:23:19 -0800 |
| commit | b01ac672be1277833964d2d53f6dd26560c70343 (patch) | |
| tree | 31b886a5084f20135bec50fe831dcfeed229c619 /src/search.c | |
| parent | 33be50037c2b4cdb002538534e9915c6bad253b7 (diff) | |
| download | emacs-b01ac672be1277833964d2d53f6dd26560c70343.tar.gz emacs-b01ac672be1277833964d2d53f6dd26560c70343.zip | |
Revamp quitting and fix infloops
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.
Diffstat (limited to 'src/search.c')
| -rw-r--r-- | src/search.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/src/search.c b/src/search.c index ed9c12c68fe..084adda097b 100644 --- a/src/search.c +++ b/src/search.c | |||
| @@ -800,6 +800,8 @@ find_newline (ptrdiff_t start, ptrdiff_t start_byte, ptrdiff_t end, | |||
| 800 | *bytepos = lim_byte + next; | 800 | *bytepos = lim_byte + next; |
| 801 | return BYTE_TO_CHAR (lim_byte + next); | 801 | return BYTE_TO_CHAR (lim_byte + next); |
| 802 | } | 802 | } |
| 803 | if (allow_quit) | ||
| 804 | maybe_quit (); | ||
| 803 | } | 805 | } |
| 804 | 806 | ||
| 805 | start_byte = lim_byte; | 807 | start_byte = lim_byte; |
| @@ -905,6 +907,8 @@ find_newline (ptrdiff_t start, ptrdiff_t start_byte, ptrdiff_t end, | |||
| 905 | *bytepos = ceiling_byte + prev + 1; | 907 | *bytepos = ceiling_byte + prev + 1; |
| 906 | return BYTE_TO_CHAR (ceiling_byte + prev + 1); | 908 | return BYTE_TO_CHAR (ceiling_byte + prev + 1); |
| 907 | } | 909 | } |
| 910 | if (allow_quit) | ||
| 911 | maybe_quit (); | ||
| 908 | } | 912 | } |
| 909 | 913 | ||
| 910 | start_byte = ceiling_byte; | 914 | start_byte = ceiling_byte; |
| @@ -1252,6 +1256,7 @@ search_buffer (Lisp_Object string, ptrdiff_t pos, ptrdiff_t pos_byte, | |||
| 1252 | return (n); | 1256 | return (n); |
| 1253 | } | 1257 | } |
| 1254 | n++; | 1258 | n++; |
| 1259 | maybe_quit (); | ||
| 1255 | } | 1260 | } |
| 1256 | while (n > 0) | 1261 | while (n > 0) |
| 1257 | { | 1262 | { |
| @@ -1296,6 +1301,7 @@ search_buffer (Lisp_Object string, ptrdiff_t pos, ptrdiff_t pos_byte, | |||
| 1296 | return (0 - n); | 1301 | return (0 - n); |
| 1297 | } | 1302 | } |
| 1298 | n--; | 1303 | n--; |
| 1304 | maybe_quit (); | ||
| 1299 | } | 1305 | } |
| 1300 | #ifdef REL_ALLOC | 1306 | #ifdef REL_ALLOC |
| 1301 | r_alloc_inhibit_buffer_relocation (0); | 1307 | r_alloc_inhibit_buffer_relocation (0); |
| @@ -3252,6 +3258,8 @@ find_newline1 (ptrdiff_t start, ptrdiff_t start_byte, ptrdiff_t end, | |||
| 3252 | *bytepos = lim_byte + next; | 3258 | *bytepos = lim_byte + next; |
| 3253 | return BYTE_TO_CHAR (lim_byte + next); | 3259 | return BYTE_TO_CHAR (lim_byte + next); |
| 3254 | } | 3260 | } |
| 3261 | if (allow_quit) | ||
| 3262 | maybe_quit (); | ||
| 3255 | } | 3263 | } |
| 3256 | 3264 | ||
| 3257 | start_byte = lim_byte; | 3265 | start_byte = lim_byte; |