all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: "Stephen J. Turnbull" <stephen@xemacs.org>
To: Eli Zaretskii <eliz@gnu.org>
Cc: tromey@redhat.com, emacs-devel@gnu.org
Subject: Re: threads and kill-buffer
Date: Fri, 07 Sep 2012 10:26:31 +0900	[thread overview]
Message-ID: <87harasjw8.fsf@uwakimon.sk.tsukuba.ac.jp> (raw)
In-Reply-To: <83harbct9h.fsf@gnu.org>

Eli Zaretskii writes:

 > Again, I was primarily bothered with preserving the existing
 > semantics, not to allow new features.

You don't need to do anything to preserve existing semantics of
accessing buffers.  Lisp can already run asynchronously, including
killing the current buffer out from under a running function.  The
feature you propose (and I agree with) allows a thread with a dying
current buffer to do something useful with it before current buffer
changes.  The new semantics is due to your feature.  The question is,
in these new semantics, what is the return value of (buffer-live-p
(current-buffer))?  Returning t is not useful.  Returning nil
preserves existing semantics of code that actually checks for liveness
of the current buffer, and allows code that knows about the new
semantics to do something more useful (if that option is available,
which depends on the code).

 > I meant to say that the old code that runs in a single thread will
 > still work, in the presence of other threads that do unrelated things,
 > like fetch news group articles.

Sure, but it doesn't matter what (buffer-live-p (current-buffer))
returns while current buffer is dying, that old code will still work.

 > > Having a buffer killed out from under my code is hardly the first
 > > thing I'd worry about if I were writing a threaded program.
 > 
 > And you'd be wrong: lots of low-level internals in Emacs assume
 > without checking that the current buffer exists and is valid.  E.g.,
 > redisplay will crash and burn if that somehow became false in the
 > middle of its work.

Yeah, and this just isn't going to happen in correct programs.  The
risk is low except in experimental or one-off code, and even there I
only kill buffers that I've created.  Do you really do

    (let ((bl (buffer-list)))
      (kill-buffer (nth (random (length bl)) bl)))

so frequently?  Yes, it's something to worry about in the internals,
but (a) at this point in time it's relatively low priority vs getting
the semantics of threading right and (b) your proposal fixes that.

 > If that's what is desired, then thread B could switch away from that
 > buffer, after killing it, and Bob's our uncle.

In the scenario we're concerned about (defective code that kills
somebody else's buffer), that's not what is desired.  You're
completely missing the point.  This entire discussion is "Is there a
more useful return value than t for (buffer-live-p (current-buffer))
when we are surprised by the current buffer being killed by another
thread?"  (Assuming that the current buffer is preserved for our
thread until it switches away.)  

 > > You could also remove the recursive calls and just loop:
 > > 
 > > (while t (writer) (reader))
 > 
 > And why is this a problem in the context of this discussion?  No
 > buffer is killed anywhere in sight, AFAICS.

But that's the *whole* point of this discussion!  *The buffer killing
takes place out of sight.*




  reply	other threads:[~2012-09-07  1:26 UTC|newest]

Thread overview: 58+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-09-04 20:36 threads and kill-buffer Tom Tromey
2012-09-04 20:43 ` Lars Ingebrigtsen
2012-09-04 21:03 ` Paul Eggert
2012-09-05  2:53 ` Eli Zaretskii
2012-09-05 14:20   ` Sam Steingold
2012-09-05 16:35     ` Eli Zaretskii
2012-09-05 16:50       ` Sam Steingold
2012-09-05 16:54         ` Eli Zaretskii
2012-09-05 19:19         ` Stephen J. Turnbull
2012-09-05 20:34           ` Tom Tromey
2012-09-06  0:20             ` Stephen J. Turnbull
2012-09-06  1:53               ` Tom Tromey
2012-09-06  8:34                 ` Stephen J. Turnbull
2012-09-05 18:13     ` Stefan Monnier
2012-09-05 18:28     ` Tom Tromey
2012-09-05 19:14       ` Stefan Monnier
2012-09-05 18:20   ` Tom Tromey
2012-09-05 19:00     ` Stephen J. Turnbull
2012-09-05 19:10       ` Tom Tromey
2012-09-05 19:50         ` Eli Zaretskii
2012-09-05 20:48           ` Stephen J. Turnbull
2012-09-06  5:16             ` Eli Zaretskii
2012-09-06  9:22               ` Stephen J. Turnbull
2012-09-06 10:58                 ` Eli Zaretskii
2012-09-07  1:26                   ` Stephen J. Turnbull [this message]
2012-09-05 20:25         ` Stephen J. Turnbull
2012-09-05 19:45       ` Eli Zaretskii
2012-09-05 19:46     ` Eli Zaretskii
2012-09-06  2:28       ` Stefan Monnier
2012-09-06  5:24         ` Eli Zaretskii
2012-09-06 12:32           ` Stefan Monnier
2012-09-05  3:49 ` SAKURAI Masashi
2012-09-05  4:34 ` Dmitry Antipov
2012-09-05  9:44   ` martin rudalics
2012-09-05 16:28     ` Eli Zaretskii
2012-09-06  7:19       ` martin rudalics
2012-09-06  7:56         ` Eli Zaretskii
2012-09-06 14:41           ` martin rudalics
2012-09-06 14:55             ` Eli Zaretskii
2012-09-06 16:04               ` martin rudalics
2012-09-06 17:07                 ` Stefan Monnier
2012-09-06 17:37                   ` martin rudalics
2012-09-06 18:22                     ` Eli Zaretskii
2012-09-06 19:25                       ` Eli Zaretskii
2012-09-07  9:52                       ` martin rudalics
2012-09-06 21:28                     ` Stefan Monnier
2012-09-07  9:52                       ` martin rudalics
2012-09-07 14:44                         ` Stefan Monnier
2012-09-07 16:13                           ` martin rudalics
2012-09-07 18:31                             ` Stefan Monnier
2012-09-06 20:49             ` PJ Weisberg
2012-09-07  5:52               ` Eli Zaretskii
2012-09-07 15:28                 ` PJ Weisberg
2012-09-08 14:58                   ` Nix
2012-09-08 15:21                     ` Eli Zaretskii
2012-09-08 19:45                     ` Stefan Monnier
2012-09-05 13:41 ` Stefan Monnier
2012-09-05 14:34   ` Tom Tromey

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

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

  git send-email \
    --in-reply-to=87harasjw8.fsf@uwakimon.sk.tsukuba.ac.jp \
    --to=stephen@xemacs.org \
    --cc=eliz@gnu.org \
    --cc=emacs-devel@gnu.org \
    --cc=tromey@redhat.com \
    /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 external index

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

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.