unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: David Kastrup <dak@gnu.org>
Cc: emacs-devel@gnu.org
Subject: Re: Tramp with global-auto-revert-mode.
Date: 15 May 2004 19:01:24 +0200	[thread overview]
Message-ID: <x5vfixtyjf.fsf@lola.goethe.zz> (raw)
In-Reply-To: <86wu3d7jel.fsf@slowfox.dyndns.org>

Kai Grossjohann <kai.grossjohann@gmx.net> writes:

> David Kastrup <dak@gnu.org> writes:
> 
> > Uh, much too complicated.
> 
> I'm afraid I don't understand you: Do you mean that just the last
> step is too complicated, or that the whole procedure that I described
> is too complicated?

The whole procedure.

> At some point, I thought I understood what you were suggesting, but
> now I'm not sure anymore.
> 
> Let me try to describe my understanding with less detail, then please
> tell me if I got it at least at this level.
> 
>     Whenever Tramp is invoked, it looks to see if the connection
>     buffer is busy.  If it is, it knows that Tramp is interrupting
>     itself, so to speak.
> 
>     If this is the case (Tramp is interrupting itself), Tramp "takes
>     over" the command in progress, fetches all output from it and
>     stashes it someplace safe.

Look, you are talking all the time about "Tramp" as if it was a
sentient being.  It isn't.

"Tramp" consists of two entirely different pieces: the user level
routines (of which several can be running at once in different
"threads" or Emacs' equivalence to it) and the filter routine.  Those
are basically independent from each other.

In order avoid unnecessary lockup in process-send-string, and
problems with identifying responses and input, we might not just
indiscriminately call process-send-string when there are already
outstanding commands.

Ok, here is what the filter routine does when it is called: it
collects the stuff from the output until it has a completely reply to
the currently sent command available.  If it has, it takes the
request and marks it as completed (tacking the results to the
request).

[Entry point for getting a command on the way:]
It then takes a look whether there are still outstanding commands in
the queue.  If there are, it takes the next one from the queue and
sends it through, marking it as being in progress.

That's all.  The filter routine never changes, it does just that.
There is only one filter routine at work at most at any time.

Now for the user level stuff: it knows it needs to get commands
through.  So it makes a request data structure and tacks it to the end
of the current queue (or, if the command is particularly urgent, like
when we are doing autorevert checking, to the _front_ of the current
queue) and then calls accept-process-output on the process repeatedly
until the command finally is marked as being processed.  Then it
takes the results and returns.

That is all.

>     Then it does its own thing.
> 
>     Afterwards, it gets the output from the safe place, inserts it
>     into the connection buffer, and makes it appear to the
>     "interrupted" "master" Tramp as if nothing had happened in the
>     meantime.
> 
> You were also talking about a queue of commands, which I'm not
> seeing.  So this would be an indication that I misunderstood you.

Probably.  You don't just want to stuff the pipe with
process-send-string indiscriminately, it may stall at one time, and
then a different thread might feel tempted to stuff its material
right in the wrong place.  So at any time, at most one thread may be
allowed to send strings.  If there is already a reason for the filter
routine to run (because some command is in the process of being
transmitted), then the requesting process will _not_ write to the
tty, but meekly queue his request into a request queue and hope that
the filter routine will at some time be friendly enough to process it.

> (The above does imply a stack of commands, corresponding to
> interruptions of interruptions.)

Quite.  Since Emacs does not have true concurrency, "deeper" commands
in the "user stack" will not get resumed or finished until "higher"
commands are completed.  Which they eventually will, since the filter
routine will cater for everything in the queue.  For stuff like
autorevert it would be a good idea to check whether the queue already
contains some request for the same thing.  If it does, no need to add
another one.  Similar things hold for fetching a particular directory
into the directory buffer, although here the resulting information
_is_ needed, so one needs to call accept-process-output until the
information has arrived, even though it was requested by a different
thread/layer/task/whatyouwantocallit.

> > When output arrives, the currently active filter function will be
> > called with it and _all_ accept-process-output calling threads
> > will get woken up again.  So they will need to check whether their
> > respective work has already been done or aborted by the filter
> > routine.
> 
> Hm.  If more than one thread of execution will be woken up at the
> same time, then surely the above procedure won't work.

Emacs can't do anything "at the same time".  We don't have
concurrency.  It has a stack of outstanding commands started from the
main loop (and a list of things it may call from the main loop).  It
works this stack off top to bottom.

Even if Emacs had separate stacks for the main loops, it would not
schedule between them except when control is explicitly yielded (can
happen with I/O).

-- 
David Kastrup, Kriemhildstr. 15, 44793 Bochum

  reply	other threads:[~2004-05-15 17:01 UTC|newest]

Thread overview: 95+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-05-12 22:54 Tramp with global-auto-revert-mode Luc Teirlinck
2004-05-12 23:26 ` Luc Teirlinck
2004-05-13 23:11   ` Kim F. Storm
2004-05-13 23:24     ` Luc Teirlinck
2004-05-13 23:46       ` Kim F. Storm
2004-05-14  0:08         ` Luc Teirlinck
2004-05-14  1:17           ` Stefan Monnier
2004-05-14  1:32             ` Luc Teirlinck
2004-05-14  2:35               ` Stefan Monnier
2004-05-14  2:53                 ` Luc Teirlinck
2004-05-14  3:08                 ` Luc Teirlinck
2004-05-14  4:16                   ` Stefan Monnier
2004-05-14  4:45                     ` Luc Teirlinck
2004-05-14  5:09                       ` Stefan Monnier
2004-05-14 19:13                         ` Luc Teirlinck
2004-05-14 21:02                       ` Richard Stallman
2004-05-14  5:01                     ` Luc Teirlinck
2004-05-14 23:00                     ` Kim F. Storm
2004-05-15  0:44                       ` Luc Teirlinck
2004-05-15  1:39                       ` Luc Teirlinck
2004-05-15 18:34                         ` Richard Stallman
2004-05-15 20:44                           ` Luc Teirlinck
2004-05-15 23:44                             ` Luc Teirlinck
2004-05-16  0:41                               ` Luc Teirlinck
2004-05-16 13:52                                 ` Andreas Schwab
2004-05-17 11:04                               ` Richard Stallman
2004-05-17 14:20                                 ` Luc Teirlinck
2004-05-16  5:58                             ` Eli Zaretskii
2004-05-16 18:11                               ` Luc Teirlinck
2004-05-16 18:32                                 ` Luc Teirlinck
2004-05-16 20:04                                 ` Luc Teirlinck
2004-05-16 22:41                                   ` Kim F. Storm
2004-05-17  5:21                                     ` Kai Grossjohann
2004-05-17 12:45                                     ` Kim F. Storm
2004-05-17 15:03                                       ` Luc Teirlinck
2004-05-17 15:22                                         ` Kim F. Storm
2004-05-18 16:25                                       ` Stefan Monnier
2004-05-18 17:10                                         ` Luc Teirlinck
2004-05-21 23:44                                           ` Kim F. Storm
2004-05-22  1:08                                             ` Luc Teirlinck
2004-05-22 11:52                                               ` Kim F. Storm
2004-05-23 17:21                                                 ` Michael Albinus
2004-05-17  6:04                                 ` Eli Zaretskii
2004-05-15  2:50                       ` Luc Teirlinck
2004-05-15 13:19                         ` Andreas Schwab
2004-05-15 13:34                           ` Luc Teirlinck
2004-05-15 16:45                             ` Andreas Schwab
2004-05-15 17:49                               ` Luc Teirlinck
2004-05-15 13:51                           ` Luc Teirlinck
2004-05-15 18:26                             ` Eli Zaretskii
2004-05-15  3:23                       ` Luc Teirlinck
2004-05-15 18:02                       ` Luc Teirlinck
2004-05-14 21:02               ` Richard Stallman
2004-05-14  2:31             ` Luc Teirlinck
2004-05-14  5:32               ` Luc Teirlinck
2004-05-14 11:36             ` Kai Grossjohann
2004-05-14 12:06               ` David Kastrup
2004-05-14 17:06                 ` Stefan Monnier
2004-05-14 17:54                   ` David Kastrup
2004-05-14 18:30                     ` Stefan Monnier
2004-05-14 19:08                     ` Kim F. Storm
2004-05-14 19:26                       ` David Kastrup
2004-05-14 20:33                         ` Kim F. Storm
2004-05-14 21:00                           ` David Kastrup
2004-05-14 21:19                             ` Kim F. Storm
2004-05-14 21:33                               ` Stefan Monnier
2004-05-14 22:55                                 ` Kim F. Storm
2004-05-14 23:04                                   ` Stefan Monnier
2004-05-15 18:33                                 ` Richard Stallman
2004-05-14 22:11                               ` David Kastrup
2004-05-14 22:57                                 ` Kim F. Storm
2004-05-14 22:47                           ` Luc Teirlinck
2004-05-14 23:14                             ` Kim F. Storm
2004-05-14 23:38                               ` Luc Teirlinck
2004-05-14 22:50                           ` Luc Teirlinck
2004-05-14 23:00                           ` Luc Teirlinck
2004-05-14 20:40                       ` Kai Grossjohann
2004-05-14 23:26                         ` David Kastrup
2004-05-15 16:19                           ` Kai Grossjohann
2004-05-15 17:01                             ` David Kastrup [this message]
2004-05-15 17:26                               ` Kai Grossjohann
2004-05-15 18:18                                 ` David Kastrup
2004-05-16 14:11                                   ` Kai Grossjohann
2004-05-15 18:33                     ` Richard Stallman
2004-05-16 14:13                       ` Kai Grossjohann
2004-05-17  1:14                         ` Luc Teirlinck
2004-05-17 22:58                         ` Richard Stallman
2004-05-18  3:44                           ` Luc Teirlinck
2004-05-14 20:32                   ` Kai Grossjohann
2004-05-14 21:35                     ` Michael Albinus
2004-05-15 16:22                       ` Kai Grossjohann
2004-05-14 20:29                 ` Kai Grossjohann
2004-05-14 21:02       ` Richard Stallman
2004-05-14  0:54     ` Luc Teirlinck
2004-05-14  2:13     ` Luc Teirlinck

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=x5vfixtyjf.fsf@lola.goethe.zz \
    --to=dak@gnu.org \
    --cc=emacs-devel@gnu.org \
    /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).