diff options
| author | Ihor Radchenko | 2023-10-08 11:48:42 +0300 |
|---|---|---|
| committer | Eli Zaretskii | 2023-12-30 09:53:46 +0200 |
| commit | b7a737ef49e787120ea7a7e9f4d4ef04dd1a0723 (patch) | |
| tree | f05276bb8e942e8b33a88d04b5a6beaf392028a8 /src | |
| parent | 0cb252cf21efec49f693f5a8873ed02c1bcbd713 (diff) | |
| download | emacs-b7a737ef49e787120ea7a7e9f4d4ef04dd1a0723.tar.gz emacs-b7a737ef49e787120ea7a7e9f4d4ef04dd1a0723.zip | |
Improve performance of `find-buffer-visiting' (bug#66117)
* src/buffer.c (Fget_truename_buffer): Expose `get_truename_buffer' to
Elisp.
(Ffind_buffer): New subr searching for a live buffer with a given
value of buffer-local variable.
(syms_of_buffer): Register the new added subroutines.
* src/filelock.c (lock_file): Use the new `Fget_truename_buffer' name.
* src/lisp.h:
* test/manual/etags/c-src/emacs/src/lisp.h: Remove no-longer-necessary
extern declarations for `get_truename_buffer'.
* lisp/files.el (find-buffer-visiting): Refactor, using subroutines to
search for buffers instead of slow manual Elisp iterations.
Diffstat (limited to 'src')
| -rw-r--r-- | src/buffer.c | 25 | ||||
| -rw-r--r-- | src/filelock.c | 2 | ||||
| -rw-r--r-- | src/lisp.h | 1 |
3 files changed, 24 insertions, 4 deletions
diff --git a/src/buffer.c b/src/buffer.c index ea0c23192b7..73e9839f883 100644 --- a/src/buffer.c +++ b/src/buffer.c | |||
| @@ -519,8 +519,11 @@ See also `find-buffer-visiting'. */) | |||
| 519 | return Qnil; | 519 | return Qnil; |
| 520 | } | 520 | } |
| 521 | 521 | ||
| 522 | Lisp_Object | 522 | DEFUN ("get-truename-buffer", Fget_truename_buffer, Sget_truename_buffer, 1, 1, 0, |
| 523 | get_truename_buffer (register Lisp_Object filename) | 523 | doc: /* Return the buffer with `file-truename' equal to FILENAME (a string). |
| 524 | If there is no such live buffer, return nil. | ||
| 525 | See also `find-buffer-visiting'. */) | ||
| 526 | (register Lisp_Object filename) | ||
| 524 | { | 527 | { |
| 525 | register Lisp_Object tail, buf; | 528 | register Lisp_Object tail, buf; |
| 526 | 529 | ||
| @@ -533,6 +536,22 @@ get_truename_buffer (register Lisp_Object filename) | |||
| 533 | return Qnil; | 536 | return Qnil; |
| 534 | } | 537 | } |
| 535 | 538 | ||
| 539 | DEFUN ("find-buffer", Ffind_buffer, Sfind_buffer, 2, 2, 0, | ||
| 540 | doc: /* Return the buffer with buffer-local VARIABLE equal to VALUE. | ||
| 541 | If there is no such live buffer, return nil. | ||
| 542 | See also `find-buffer-visiting'. */) | ||
| 543 | (Lisp_Object variable, Lisp_Object value) | ||
| 544 | { | ||
| 545 | register Lisp_Object tail, buf; | ||
| 546 | |||
| 547 | FOR_EACH_LIVE_BUFFER (tail, buf) | ||
| 548 | { | ||
| 549 | if (!NILP (Fequal (value, Fbuffer_local_value(variable, buf)))) | ||
| 550 | return buf; | ||
| 551 | } | ||
| 552 | return Qnil; | ||
| 553 | } | ||
| 554 | |||
| 536 | /* Run buffer-list-update-hook if Vrun_hooks is non-nil and BUF does | 555 | /* Run buffer-list-update-hook if Vrun_hooks is non-nil and BUF does |
| 537 | not have buffer hooks inhibited. */ | 556 | not have buffer hooks inhibited. */ |
| 538 | 557 | ||
| @@ -6010,6 +6029,8 @@ There is no reason to change that value except for debugging purposes. */); | |||
| 6010 | defsubr (&Sbuffer_list); | 6029 | defsubr (&Sbuffer_list); |
| 6011 | defsubr (&Sget_buffer); | 6030 | defsubr (&Sget_buffer); |
| 6012 | defsubr (&Sget_file_buffer); | 6031 | defsubr (&Sget_file_buffer); |
| 6032 | defsubr (&Sget_truename_buffer); | ||
| 6033 | defsubr (&Sfind_buffer); | ||
| 6013 | defsubr (&Sget_buffer_create); | 6034 | defsubr (&Sget_buffer_create); |
| 6014 | defsubr (&Smake_indirect_buffer); | 6035 | defsubr (&Smake_indirect_buffer); |
| 6015 | defsubr (&Sgenerate_new_buffer_name); | 6036 | defsubr (&Sgenerate_new_buffer_name); |
diff --git a/src/filelock.c b/src/filelock.c index c2b306ab47d..9ce51c724b1 100644 --- a/src/filelock.c +++ b/src/filelock.c | |||
| @@ -563,7 +563,7 @@ lock_file (Lisp_Object fn) | |||
| 563 | 563 | ||
| 564 | /* See if this file is visited and has changed on disk since it was | 564 | /* See if this file is visited and has changed on disk since it was |
| 565 | visited. */ | 565 | visited. */ |
| 566 | Lisp_Object subject_buf = get_truename_buffer (fn); | 566 | Lisp_Object subject_buf = Fget_truename_buffer (fn); |
| 567 | if (!NILP (subject_buf) | 567 | if (!NILP (subject_buf) |
| 568 | && NILP (Fverify_visited_file_modtime (subject_buf)) | 568 | && NILP (Fverify_visited_file_modtime (subject_buf)) |
| 569 | && !NILP (Ffile_exists_p (fn)) | 569 | && !NILP (Ffile_exists_p (fn)) |
diff --git a/src/lisp.h b/src/lisp.h index ed1b007d4c5..efd36465e62 100644 --- a/src/lisp.h +++ b/src/lisp.h | |||
| @@ -4664,7 +4664,6 @@ extern void report_overlay_modification (Lisp_Object, Lisp_Object, bool, | |||
| 4664 | Lisp_Object, Lisp_Object, Lisp_Object); | 4664 | Lisp_Object, Lisp_Object, Lisp_Object); |
| 4665 | extern bool overlay_touches_p (ptrdiff_t); | 4665 | extern bool overlay_touches_p (ptrdiff_t); |
| 4666 | extern Lisp_Object other_buffer_safely (Lisp_Object); | 4666 | extern Lisp_Object other_buffer_safely (Lisp_Object); |
| 4667 | extern Lisp_Object get_truename_buffer (Lisp_Object); | ||
| 4668 | extern void init_buffer_once (void); | 4667 | extern void init_buffer_once (void); |
| 4669 | extern void init_buffer (void); | 4668 | extern void init_buffer (void); |
| 4670 | extern void syms_of_buffer (void); | 4669 | extern void syms_of_buffer (void); |