unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
From: Alan Mackenzie <acm@muc.de>
To: martin rudalics <rudalics@gmx.at>
Cc: alex.bennee@linaro.org, 48337@debbugs.gnu.org
Subject: bug#48337: Fwd: 28.0.50; Emacs crashing randomly (possibly minibuffer activity related)
Date: Thu, 13 May 2021 11:54:37 +0000	[thread overview]
Message-ID: <YJ0TfRlzlsfbsAHP@ACM> (raw)
In-Reply-To: <YJz200zEmjR5/cga@ACM>

Hello again, Martin.

On Thu, May 13, 2021 at 09:52:19 +0000, Alan Mackenzie wrote:
> On Thu, May 13, 2021 at 09:54:52 +0200, martin rudalics wrote:
> >  > The deeper cause of the bug is that calling buffer-list-update-hook
> >  > simply doesn't belong in record-window-buffer.  That hook should be
> >  > called when the buffer list changes, not when a window's current buffer
> >  > gets "recorded".

> >  > So, as the main fix, I propose moving the call of buffer-list-update-hook
> >  > to (some of) the places where record-window-buffer gets called, those
> >  > places where the buffer list changes.  There are exactly two such places,
> >  > both in window.c.  This will prevent the chain of events in read_minibuf
> >  > outlined above.

> > Alan, please take one step back and reconsider.  IIUC you added the
> > `record-window-buffer' call to read_minibuf, added the DO-MINIBUF
> > argument to `record-window-buffer' and now decide that
> > `buffer-list-update-hook' doesn't belong into `record-window-buffer'.

> > Aren't you putting the cart before the horse?  That decision might be
> > correct but still constitutes a change that affects all applications
> > running `buffer-list-update-hook'.

> Maybe you're right.  I've never really liked those changes to
> record-window-buffer, they're a bit scruffy.  The requirement is simply
> to push a minibuffer onto w->prev_buffers, where w is the mini-window of
> a frame.

> Maybe I should instead undo those changes to r-w-b, and write a separate
> function for pushing the minibuffer onto w->prev_buffers.  This would
> surely be cleaner.  Whether that function should be in C or in Lisp
> (like record-window-buffer) would need to be decided.  Maybe r-w-b could
> use that new function to avoid duplicating code.

How about the following functions, in which minibuf.c now bypasses
record-window-buffer, instead calling push-window-buffer-onto-prev
direct?  I'm still not convinced that the call to
buffer-list-update-hooks belongs in record-window-buffer, but that
doesn't seem too important any more.  On preliminary testing, these
appear to work:


(defun push-window-buffer-onto-prev (&optional window)
  "Push entry for WINDOW's buffer onto WINDOW's prev-buffers list.
WINDOW must be a live window and defaults to the selected one.

Any duplicate entries for the buffer in the list are removed."
  (let* ((window (window-normalize-window window t))
         (buffer (window-buffer window))
         (w-list (window-prev-buffers window))
         (entry (assq buffer w-list)))
    (when entry
      (setq w-list (assq-delete-all buffer w-list)))
    (let ((start (window-start window))
          (point (window-point window)))
      (setq entry
            (cons buffer
                  (if entry
                      ;; We have an entry, update marker position.
                      (list (set-marker (nth 1 entry) start)
                            (set-marker (nth 2 entry) point))
                    (list (copy-marker start)
                          (copy-marker
                           ;; Preserve window-point-insertion-type
                           ;; (Bug#12855)
                           point (with-current-buffer buffer
                                   window-point-insertion-type))))))
      (set-window-prev-buffers window (cons entry w-list)))))

(defun record-window-buffer (&optional window)
  "Record WINDOW's buffer.
WINDOW must be a live window and defaults to the selected one.

If WINDOW is a minibuffer, it will only be recorded if DO-MINIBUF
is non-nil."
  (let* ((window (window-normalize-window window t))
         (buffer (window-buffer window)))
    ;; Reset WINDOW's next buffers.  If needed, they are resurrected by
    ;; `switch-to-prev-buffer' and `switch-to-next-buffer'.
    (set-window-next-buffers window nil)

    ;; Don't record insignificant buffers.
    (when (not (eq (aref (buffer-name buffer) 0) ?\s))
      (push-window-buffer-onto-prev window)
      (run-hooks 'buffer-list-update-hook))))

> > martin

-- 
Alan Mackenzie (Nuremberg, Germany).





  reply	other threads:[~2021-05-13 11:54 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <87tunasd2u.fsf@linaro.org>
2021-05-10 19:30 ` bug#48337: Fwd: 28.0.50; Emacs crashing randomly (possibly minibuffer activity related) Alex Bennée
2021-05-10 19:34   ` bug#48337: Alex Bennée
2021-05-11  2:24   ` bug#48337: Fwd: 28.0.50; Emacs crashing randomly (possibly minibuffer activity related) Eli Zaretskii
2021-05-11  6:51     ` Alex Bennée
2021-05-11  8:23       ` Alex Bennée
2021-05-11  8:54         ` Alex Bennée
2021-05-11 12:21       ` Eli Zaretskii
2021-05-11 12:54         ` Alex Bennée
2021-05-11 13:42           ` Eli Zaretskii
2021-05-11 13:47             ` Eli Zaretskii
2021-05-11 19:45             ` Alan Mackenzie
2021-05-11 19:55               ` Eli Zaretskii
2021-05-12 18:54                 ` Alan Mackenzie
2021-05-13  7:54                   ` martin rudalics
2021-05-13  9:52                     ` Alan Mackenzie
2021-05-13 11:54                       ` Alan Mackenzie [this message]
2021-05-13 12:09                         ` Alan Mackenzie
2021-05-14 15:20                     ` Gregory Heytings
2021-05-14 16:05                       ` Eli Zaretskii
2021-05-14 17:31                         ` Gregory Heytings
2021-05-14 18:19                           ` Eli Zaretskii
2021-05-15  9:45                             ` Gregory Heytings
2021-05-11 20:14       ` Alan Mackenzie
2021-05-11 22:07         ` Alex Bennée
2021-05-14 16:31           ` Alan Mackenzie
2021-05-14 16:52             ` Alex Bennée
2021-05-14 18:40               ` Alan Mackenzie
2021-05-14 22:35                 ` Alex Bennée
2021-05-15 12:00                   ` Alan Mackenzie
2021-05-16 14:24                     ` Alan Mackenzie

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=YJ0TfRlzlsfbsAHP@ACM \
    --to=acm@muc.de \
    --cc=48337@debbugs.gnu.org \
    --cc=alex.bennee@linaro.org \
    --cc=rudalics@gmx.at \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).