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/buffer.c | |
| 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/buffer.c')
| -rw-r--r-- | src/buffer.c | 25 |
1 files changed, 23 insertions, 2 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); |