unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* Are there plans for a multi-threaded Emacs?
@ 2003-11-16 21:46 Frank Schmitt
  2003-11-17  0:49 ` Alex Schroeder
  2003-11-17 19:31 ` Richard Stallman
  0 siblings, 2 replies; 133+ messages in thread
From: Frank Schmitt @ 2003-11-16 21:46 UTC (permalink / raw)


Hello

I'm wondering if there are any plans for implementing multi-threaded
program execution into Gnu Emacs. 
http://groups.google.com/groups?selm=9005292346.AA13875%40denali.sun.com
shows that this issue isn't really new, but AFAIK there isn't something
like this actually implemented, is it?

Of course this might reduce platform independence, but hey: For a
multi-threaded Emacs, I'd be willing to leave my homely home and switch
to whatever system able offering it to me.

MFG Frank

-- 
Did you ever realize how much text fits in eighty columns? If you now consider
that a signature usually consists of up to four lines, this gives you enough
space to spread a tremendous amount of information with your messages. So seize
this opportunity and don't waste your signature with bullshit nobody will read.

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-11-16 21:46 Are there plans for a multi-threaded Emacs? Frank Schmitt
@ 2003-11-17  0:49 ` Alex Schroeder
  2003-11-17  4:06   ` Dhruva Krishnamurthy
  2003-11-17 19:31 ` Richard Stallman
  1 sibling, 1 reply; 133+ messages in thread
From: Alex Schroeder @ 2003-11-17  0:49 UTC (permalink / raw)
  Cc: emacs-devel

Frank Schmitt <ich@Frank-Schmitt.net> writes:

> I'm wondering if there are any plans for implementing multi-threaded
> program execution into Gnu Emacs. 

There are no plans for this, and even if we'd switch to Guile,
multi-threading would not be an option, as far as I remember.  The
last time I read some discussion on this was related to using Guile
and the promise of multi-threading it would offer.

Alex.
-- 
http://www.emacswiki.org/alex/
There is no substitute for experience.

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-11-17  0:49 ` Alex Schroeder
@ 2003-11-17  4:06   ` Dhruva Krishnamurthy
  2003-11-17  4:29     ` Miles Bader
  0 siblings, 1 reply; 133+ messages in thread
From: Dhruva Krishnamurthy @ 2003-11-17  4:06 UTC (permalink / raw)
  Cc: Emacs Devel

Hello,
 Is there some place/person who can elaborate the reason for not
 supporting multi-threading for GNU Emacs. Is it because there is no
 strong case for supporting/requiring a multi-threaded GNU Emacs or the
 sheer complexity in making GNU Emacs a multi-threaded application.

with best regards,
dhruva

On Mon, 17 Nov 2003 01:49:34 +0100, "Alex Schroeder" <alex@emacswiki.org>
said:
> Frank Schmitt <ich@Frank-Schmitt.net> writes:
> 
> > I'm wondering if there are any plans for implementing multi-threaded
> > program execution into Gnu Emacs. 
> 
> There are no plans for this, and even if we'd switch to Guile,
> multi-threading would not be an option, as far as I remember.  The
> last time I read some discussion on this was related to using Guile
> and the promise of multi-threading it would offer.
________________________________________
Dhruva Krishnamurthy
http://schemer.fateback.com/
General:www@furby.fastmail.fm
GNU/FSF:gnu@furby.fastmail.fm 
GNU Emacs:gnu.emacs@furby.fastmail.fm

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-11-17  4:06   ` Dhruva Krishnamurthy
@ 2003-11-17  4:29     ` Miles Bader
  2003-11-30 16:36       ` Kai Grossjohann
  2003-12-06 20:58       ` Kai Grossjohann
  0 siblings, 2 replies; 133+ messages in thread
From: Miles Bader @ 2003-11-17  4:29 UTC (permalink / raw)
  Cc: Emacs Devel, Frank Schmitt, Alex Schroeder

"Dhruva Krishnamurthy" <gnu@furby.fastmail.fm> writes:
>  Is there some place/person who can elaborate the reason for not
>  supporting multi-threading for GNU Emacs. Is it because there is no
>  strong case for supporting/requiring a multi-threaded GNU Emacs or the
>  sheer complexity in making GNU Emacs a multi-threaded application.

Because it's very hard, or at the least would require a lot of work.

Multi-threading would require all of emacs -- including elisp code -- to
be made thread-safe.

Consider a simple bit of elisp code:  (setq GLOBAL (cons 'x GLOBAL))
In a pre-emptively threaded emacs, another thread could run between
accessing GLOBAL and setting it.  Whoops.

-Miles
-- 
((lambda (x) (list x x)) (lambda (x) (list x x)))

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-11-16 21:46 Are there plans for a multi-threaded Emacs? Frank Schmitt
  2003-11-17  0:49 ` Alex Schroeder
@ 2003-11-17 19:31 ` Richard Stallman
  2003-11-17 22:53   ` David Masterson
  1 sibling, 1 reply; 133+ messages in thread
From: Richard Stallman @ 2003-11-17 19:31 UTC (permalink / raw)
  Cc: emacs-devel

    I'm wondering if there are any plans for implementing multi-threaded
    program execution into Gnu Emacs. 

It would be a nice feature, but very difficult.

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-11-17 19:31 ` Richard Stallman
@ 2003-11-17 22:53   ` David Masterson
  2003-11-18  5:57     ` Miles Bader
  2003-11-18  6:52     ` John Wiegley
  0 siblings, 2 replies; 133+ messages in thread
From: David Masterson @ 2003-11-17 22:53 UTC (permalink / raw)


>>>>> Richard Stallman writes:

>     I'm wondering if there are any plans for implementing multi-threaded
>     program execution into Gnu Emacs. 

> It would be a nice feature, but very difficult.

If not multi-threading, could Emacs be made stronger in multi-tasking?
For instance, if the display-engine could be separated from the
lisp-engine parts, then perhaps a mini-scheduler could fork off
lisp-engines as needed (or requested) to process complicated things.
The "engines" would theoretically be lighter weight than Emacs proper,
but not as light-weight as multi-threading would allow.

-- 
David Masterson

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-11-17 22:53   ` David Masterson
@ 2003-11-18  5:57     ` Miles Bader
  2003-11-20 19:19       ` David Masterson
  2003-11-18  6:52     ` John Wiegley
  1 sibling, 1 reply; 133+ messages in thread
From: Miles Bader @ 2003-11-18  5:57 UTC (permalink / raw)
  Cc: emacs-devel

David Masterson <dsm@rawbw.com> writes:
> For instance, if the display-engine could be separated from the
> lisp-engine parts, then perhaps a mini-scheduler could fork off
> lisp-engines as needed (or requested) to process complicated things.
> The "engines" would theoretically be lighter weight than Emacs proper,
> but not as light-weight as multi-threading would allow.

How would this be different than multiple threads, as far as avoiding
typical threading problems (when lisp programs modify global/globally
reachable data)?

-Miles
-- 
Come now, if we were really planning to harm you, would we be waiting here, 
 beside the path, in the very darkest part of the forest?

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-11-17 22:53   ` David Masterson
  2003-11-18  5:57     ` Miles Bader
@ 2003-11-18  6:52     ` John Wiegley
  1 sibling, 0 replies; 133+ messages in thread
From: John Wiegley @ 2003-11-18  6:52 UTC (permalink / raw)


David Masterson <dsm@rawbw.com> writes:

> If not multi-threading, could Emacs be made stronger in
> multi-tasking?  For instance, if the display-engine could be
> separated from the lisp-engine parts, then perhaps a mini-scheduler
> could fork off lisp-engines as needed (or requested) to process
> complicated things.  The "engines" would theoretically be lighter
> weight than Emacs proper, but not as light-weight as multi-threading
> would allow.

Perhaps multi-threading could be allowed in a rather brain-damaged
way, using global-scope critical regions:

    All current Lisp code would run in a MAIN region, in which only
one thread could execute at a time, and each thread would have to give
up control to allow any others to run.

    Then we add (with-critical-region NAME ...), and the ability to
create such regions, so that Gnus, for example, could run in its own
happy little space, blocking if it ever needed to do things outside of
that space (and then grabbing control when the space was available).

    This at least gives the maintainer a way of creating a world apart
that could run in conjunction with the rest of Emacs.  Since what I
think most people want from threading is the ability to give long-
running Emacs modules a chance to do their work while they continue
editing.

John

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-11-18  5:57     ` Miles Bader
@ 2003-11-20 19:19       ` David Masterson
  2003-11-22 21:19         ` Richard Stallman
  0 siblings, 1 reply; 133+ messages in thread
From: David Masterson @ 2003-11-20 19:19 UTC (permalink / raw)
  Cc: emacs-devel

>>>>> Miles Bader writes:

> David Masterson <dsm@rawbw.com> writes:

>> For instance, if the display-engine could be separated from the
>> lisp-engine parts, then perhaps a mini-scheduler could fork off
>> lisp-engines as needed (or requested) to process complicated
>> things.  The "engines" would theoretically be lighter weight than
>> Emacs proper, but not as light-weight as multi-threading would
>> allow.

> How would this be different than multiple threads, as far as
> avoiding typical threading problems (when lisp programs modify
> global/globally reachable data)?

It was just speculation on my part (and not necessarily a very good
one).  In answer to your question, I would guess that a global data
server would be needed to manage such access.  I was envisioning that
major packages (Gnus, VM, Calendar, ...) would each run in their own
lisp engine and that very little data would need to be shared between
the packages.

-- 
David Masterson

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-11-20 19:19       ` David Masterson
@ 2003-11-22 21:19         ` Richard Stallman
  0 siblings, 0 replies; 133+ messages in thread
From: Richard Stallman @ 2003-11-22 21:19 UTC (permalink / raw)
  Cc: emacs-devel, miles

    >> For instance, if the display-engine could be separated from the
    >> lisp-engine parts, then perhaps a mini-scheduler could fork off
    >> lisp-engines as needed (or requested) to process complicated
    >> things.

Nowadays redisplay calls Lisp code, so that would not be a simple approach
to carry out.

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-11-17  4:29     ` Miles Bader
@ 2003-11-30 16:36       ` Kai Grossjohann
  2003-11-30 18:01         ` Vinicius Jose Latorre
                           ` (3 more replies)
  2003-12-06 20:58       ` Kai Grossjohann
  1 sibling, 4 replies; 133+ messages in thread
From: Kai Grossjohann @ 2003-11-30 16:36 UTC (permalink / raw)


Miles Bader <miles@lsi.nec.co.jp> writes:

> Consider a simple bit of elisp code:  (setq GLOBAL (cons 'x GLOBAL))
> In a pre-emptively threaded emacs, another thread could run between
> accessing GLOBAL and setting it.  Whoops.

Well, I don't know a lot about threading, but Java, at least, has the
same problem: you need to synchronize access to a variable to prevent
such things from happening.  By default, synchronized access is turned
off.

So if all of what is now in Emacs continues to run in a single thread,
and you just provide a function to create a new thread and run stuff
in that new thread, then it would be the responsibility of the people
creating threads to make sure that they don't step on each other's
toes.

Then the remaining problem is that possibly a lot of functions cannot
be safely used because they access global variables.  But that is just
something that people will have to live with, and maybe it will get
better over time.  I think that it will be good enough at least for
some packages to do part of their work in the background.

What do people think?  Maybe I missed something obvious...

Kai

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-11-30 16:36       ` Kai Grossjohann
@ 2003-11-30 18:01         ` Vinicius Jose Latorre
  2003-11-30 18:39           ` Kai Grossjohann
  2003-11-30 18:12         ` Benjamin Riefenstahl
                           ` (2 subsequent siblings)
  3 siblings, 1 reply; 133+ messages in thread
From: Vinicius Jose Latorre @ 2003-11-30 18:01 UTC (permalink / raw)
  Cc: emacs-devel


Kai Grossjohann <kai@emptydomain.de> writes:

>  Miles Bader <miles@lsi.nec.co.jp> writes:
>  
>  > Consider a simple bit of elisp code:  (setq GLOBAL (cons 'x GLOBAL))
>  > In a pre-emptively threaded emacs, another thread could run between
>  > accessing GLOBAL and setting it.  Whoops.
>  
>  Well, I don't know a lot about threading, but Java, at least, has the
>  same problem: you need to synchronize access to a variable to prevent
>  such things from happening.  By default, synchronized access is turned
>  off.
>  
>  So if all of what is now in Emacs continues to run in a single thread,
>  and you just provide a function to create a new thread and run stuff
>  in that new thread, then it would be the responsibility of the people
>  creating threads to make sure that they don't step on each other's
>  toes.
>  
>  Then the remaining problem is that possibly a lot of functions cannot
>  be safely used because they access global variables.  But that is just
>  something that people will have to live with, and maybe it will get
>  better over time.  I think that it will be good enough at least for
>  some packages to do part of their work in the background.
>  
>  What do people think?  Maybe I missed something obvious...

I also don't know a lot about threads, but CHILL (old) language also has a
mechanism of mutual exclusion.  So, one could define a thread, other defines
another thread, if both of them need to share some resource (variables) they
define a region of mutual exclusion where the resources (variables) can be
accessed only by procedure calling.

Maybe I also missed something obvious...

Vinicius

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-11-30 16:36       ` Kai Grossjohann
  2003-11-30 18:01         ` Vinicius Jose Latorre
@ 2003-11-30 18:12         ` Benjamin Riefenstahl
  2003-11-30 19:40         ` Nic Ferrier
  2003-12-01 16:04         ` Ted Zlatanov
  3 siblings, 0 replies; 133+ messages in thread
From: Benjamin Riefenstahl @ 2003-11-30 18:12 UTC (permalink / raw)
  Cc: emacs-devel

Hi Kai,


Kai Grossjohann <kai@emptydomain.de> writes:
> Well, I don't know a lot about threading, but Java, at least, has
> the same problem: you need to synchronize access to a variable to
> prevent such things from happening.  By default, synchronized access
> is turned off.
>
> [...]
>
> What do people think?  Maybe I missed something obvious...

Just a thought: The Asm/C/Java model of threads is not the only
possibility.

Another model is to create isolated contexts/interpreters for each
thread and require explicit coding to communicate between the threads
and for setting up variables that are synchronized between them.  This
is easier to use in a migration from a single-thread model, and I
think it is also easier and safer to program in general.

OTOH, with a system that does so much in LISP as Emacs does, even
going to the trouble of dump and undump, this model can lead to a lot
of duplicated state, which of course costs memory and also may create
inconsistencies at the user level, when customizations only apply to
one thread but not to the other.

As I said, just a thought...


benny

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-11-30 18:01         ` Vinicius Jose Latorre
@ 2003-11-30 18:39           ` Kai Grossjohann
  0 siblings, 0 replies; 133+ messages in thread
From: Kai Grossjohann @ 2003-11-30 18:39 UTC (permalink / raw)


Vinicius Jose Latorre <vinicius@cpqd.com.br> writes:

> I also don't know a lot about threads, but CHILL (old) language also has a
> mechanism of mutual exclusion.  So, one could define a thread, other defines
> another thread, if both of them need to share some resource (variables) they
> define a region of mutual exclusion where the resources (variables) can be
> accessed only by procedure calling.

I think the point of the post I followed up to was that lots of code
already accesses global (and hence, potentially shared) variables
WITHOUT defining a region of mutual exclusion.

Kai

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-11-30 16:36       ` Kai Grossjohann
  2003-11-30 18:01         ` Vinicius Jose Latorre
  2003-11-30 18:12         ` Benjamin Riefenstahl
@ 2003-11-30 19:40         ` Nic Ferrier
  2003-12-01 16:04         ` Ted Zlatanov
  3 siblings, 0 replies; 133+ messages in thread
From: Nic Ferrier @ 2003-11-30 19:40 UTC (permalink / raw)
  Cc: emacs-devel

Kai Grossjohann <kai@emptydomain.de> writes:

> Miles Bader <miles@lsi.nec.co.jp> writes:
> 
> > Consider a simple bit of elisp code:  (setq GLOBAL (cons 'x GLOBAL))
> > In a pre-emptively threaded emacs, another thread could run between
> > accessing GLOBAL and setting it.  Whoops.
> 
> Well, I don't know a lot about threading, but Java, at least, has the
> same problem: you need to synchronize access to a variable to prevent
> such things from happening.  By default, synchronized access is turned
> off.
> 
> So if all of what is now in Emacs continues to run in a single thread,
> and you just provide a function to create a new thread and run stuff
> in that new thread, then it would be the responsibility of the people
> creating threads to make sure that they don't step on each other's
> toes.
> 
> Then the remaining problem is that possibly a lot of functions cannot
> be safely used because they access global variables.  But that is just
> something that people will have to live with, and maybe it will get
> better over time.  I think that it will be good enough at least for
> some packages to do part of their work in the background.
> 
> What do people think?  Maybe I missed something obvious...

I think there are 2 big problems:

1. emacs _is_ global variables, there aren't any thread safe routines
right now because thread safety has not been an issue uptil now. So
display, buffer manipulation, everything becomes a thread problem.

2. I think dynamic scope also makes this a lot more complicated
because you're not talking about just globals anymore but variables
passed from a proc into a thread-proc and onwards. Very tricky.


Nic

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-11-30 16:36       ` Kai Grossjohann
                           ` (2 preceding siblings ...)
  2003-11-30 19:40         ` Nic Ferrier
@ 2003-12-01 16:04         ` Ted Zlatanov
  2003-12-02 14:45           ` Ted Lemon
  2003-12-03 17:16           ` Richard Stallman
  3 siblings, 2 replies; 133+ messages in thread
From: Ted Zlatanov @ 2003-12-01 16:04 UTC (permalink / raw)


On Sun, 30 Nov 2003, kai@emptydomain.de wrote:

> Then the remaining problem is that possibly a lot of functions
> cannot be safely used because they access global variables.  But
> that is just something that people will have to live with, and maybe
> it will get better over time.  I think that it will be good enough
> at least for some packages to do part of their work in the
> background.

I think migrating Emacs towards a threading model is possible:

- start with all primitive or ELisp functions assumed NOT thread-safe

- allow threads to run, but any access to a function needs to be
  synchronous.  At first, this will effectively make threads simple
  switched tasks, and will probably make Emacs slower.

- gradually migrate functions, starting with the primitives, towards
  whatever threading model Emacs assumes.  Use some kind of function
  attribute to mark thread-safe behavior.  With time, threads will
  become efficient and fast.

The internal implementation of threads will be the difficult part.
It took Perl a LONG time to get working threads internally.

I think heavyweight threads (multiple processes) is not a good choice
for Emacs, because of the heavy interaction and data passing between
the internal functions.

Ted

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-01 16:04         ` Ted Zlatanov
@ 2003-12-02 14:45           ` Ted Lemon
  2003-12-02 15:48             ` Per Abrahamsen
  2003-12-02 17:44             ` Ted Zlatanov
  2003-12-03 17:16           ` Richard Stallman
  1 sibling, 2 replies; 133+ messages in thread
From: Ted Lemon @ 2003-12-02 14:45 UTC (permalink / raw)
  Cc: emacs-devel

On Dec 1, 2003, at 10:04 AM, Ted Zlatanov wrote:
> I think migrating Emacs towards a threading model is possible:

Maybe this is a stupid question, but what's the payoff you're expecting 
when you're done with this project?   What is it about Emacs that makes 
it worth a major rewrite in order to make it multithreaded?   I realize 
that multithreading will introduce small conveniences in some cases, 
but in general writing multithreaded code is a total pain in the neck, 
so my guess is that the cost of those small conveniences would be more 
than they'd be worth, and you might be able to get them cheaper using 
some other technique, if you could identify what they are.

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-02 14:45           ` Ted Lemon
@ 2003-12-02 15:48             ` Per Abrahamsen
  2003-12-02 17:18               ` David Kastrup
  2003-12-02 17:27               ` Stefan Monnier
  2003-12-02 17:44             ` Ted Zlatanov
  1 sibling, 2 replies; 133+ messages in thread
From: Per Abrahamsen @ 2003-12-02 15:48 UTC (permalink / raw)


Ted Lemon <mellon@fugue.com> writes:

> What is it about Emacs that makes it worth a major rewrite in order
> to make it multithreaded?

Gnus.

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-02 15:48             ` Per Abrahamsen
@ 2003-12-02 17:18               ` David Kastrup
  2003-12-03 12:38                 ` Per Abrahamsen
  2003-12-02 17:27               ` Stefan Monnier
  1 sibling, 1 reply; 133+ messages in thread
From: David Kastrup @ 2003-12-02 17:18 UTC (permalink / raw)


Per Abrahamsen <abraham@dina.kvl.dk> writes:

> Ted Lemon <mellon@fugue.com> writes:
> 
> > What is it about Emacs that makes it worth a major rewrite in order
> > to make it multithreaded?
> 
> Gnus.

gnus-asynchronous's value is nil

*If nil, inhibit all Gnus asynchronicity.
If non-nil, let the other asynch variables be heeded.

You can customize this variable.

Defined in `gnus-async'.

-- 
David Kastrup, Kriemhildstr. 15, 44793 Bochum

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-02 15:48             ` Per Abrahamsen
  2003-12-02 17:18               ` David Kastrup
@ 2003-12-02 17:27               ` Stefan Monnier
  2003-12-02 18:53                 ` Simon Josefsson
  1 sibling, 1 reply; 133+ messages in thread
From: Stefan Monnier @ 2003-12-02 17:27 UTC (permalink / raw)


>> What is it about Emacs that makes it worth a major rewrite in order
>> to make it multithreaded?
> Gnus.

Wouldn't Gnus be happy enough with cooperative multithreading ?

I keep thinking that we should provide a way to specify background tasks
that we can run while idle.  It can already be done in elisp, but it's
rather painful.


        Stefan

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-02 14:45           ` Ted Lemon
  2003-12-02 15:48             ` Per Abrahamsen
@ 2003-12-02 17:44             ` Ted Zlatanov
  1 sibling, 0 replies; 133+ messages in thread
From: Ted Zlatanov @ 2003-12-02 17:44 UTC (permalink / raw)


On Tue, 2 Dec 2003, mellon@fugue.com wrote:

On Dec 1, 2003, at 10:04 AM, Ted Zlatanov wrote:
>> I think migrating Emacs towards a threading model is possible:
> 
> Maybe this is a stupid question, but what's the payoff you're
> expecting when you're done with this project?  What is it about
> Emacs that makes it worth a major rewrite in order to make it
> multithreaded?  I realize that multithreading will introduce small
> conveniences in some cases, but in general writing multithreaded
> code is a total pain in the neck, so my guess is that the cost of
> those small conveniences would be more than they'd be worth, and you
> might be able to get them cheaper using some other technique, if you
> could identify what they are.

Per already mentioned Gnus.  Generally any place in Emacs where you
could be doing task A while task B is waiting for a blocking resource.
Also, an event-driven model for user interaction would be easier to
implement in a way that's functional for the user.

In a way, this is a very valid question - what can't be done with
processes that threads can do?  You can do almost everything without
threads, but the cost is very high in terms of portability, resource
usage, and ease of use.  Furthermore, as I mentioned, processes are
much harder to couple (for data sharing) than threads.

Ideally, you won't have to worry about multithreading if you don't
want to.  Java allows programmers to mark functions as synchronous,
so only one of it can be running at once.  I proposed doing this by
default for all Emacs functions, and then making them thread-safe
step by step.

Ted

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-02 17:27               ` Stefan Monnier
@ 2003-12-02 18:53                 ` Simon Josefsson
  2003-12-03 13:03                   ` Per Abrahamsen
  0 siblings, 1 reply; 133+ messages in thread
From: Simon Josefsson @ 2003-12-02 18:53 UTC (permalink / raw)
  Cc: emacs-devel

Stefan Monnier <monnier@IRO.UMontreal.CA> writes:

>>> What is it about Emacs that makes it worth a major rewrite in order
>>> to make it multithreaded?
>> Gnus.
>
> Wouldn't Gnus be happy enough with cooperative multithreading ?

I believe so too.

> I keep thinking that we should provide a way to specify background tasks
> that we can run while idle.  It can already be done in elisp, but it's
> rather painful.

Yes.  Like David Kastrup indicated, Gnus can already do several things
in the background, but it is far from what you would expect from a
normal multi-threaded mail reader.  Blocking the GUI to wait for data
from the network is poor engineering.

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-02 17:18               ` David Kastrup
@ 2003-12-03 12:38                 ` Per Abrahamsen
  0 siblings, 0 replies; 133+ messages in thread
From: Per Abrahamsen @ 2003-12-03 12:38 UTC (permalink / raw)


David Kastrup <dak@gnu.org> writes:

> gnus-asynchronous's value is nil

It only helps for slow I/O, there are plenty of operations in Gnus
that are CPU bound.  Creating large summary buffers for example.

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-02 18:53                 ` Simon Josefsson
@ 2003-12-03 13:03                   ` Per Abrahamsen
  0 siblings, 0 replies; 133+ messages in thread
From: Per Abrahamsen @ 2003-12-03 13:03 UTC (permalink / raw)


Simon Josefsson <jas@extundo.com> writes:

> Blocking the GUI to wait for data from the network is poor
> engineering.

Blocking the GUI to wait for the result of a computation is poor
engineering as well.

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-01 16:04         ` Ted Zlatanov
  2003-12-02 14:45           ` Ted Lemon
@ 2003-12-03 17:16           ` Richard Stallman
  2003-12-03 17:58             ` Ted Zlatanov
  2003-12-03 20:01             ` Are there plans for a multi-threaded Emacs? Nic Ferrier
  1 sibling, 2 replies; 133+ messages in thread
From: Richard Stallman @ 2003-12-03 17:16 UTC (permalink / raw)
  Cc: emacs-devel

    I think migrating Emacs towards a threading model is possible:

    - start with all primitive or ELisp functions assumed NOT thread-safe

    - allow threads to run, but any access to a function needs to be
      synchronous.  At first, this will effectively make threads simple
      switched tasks, and will probably make Emacs slower.

Many sections of Lisp code would need to have locking in order
to run correctly with multiple threads.  For instance, everything
of the form

  (setq global-list (cons foo global-list))

would need locking.

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-03 17:16           ` Richard Stallman
@ 2003-12-03 17:58             ` Ted Zlatanov
  2003-12-03 23:38               ` Martin Stjernholm
  2003-12-03 20:01             ` Are there plans for a multi-threaded Emacs? Nic Ferrier
  1 sibling, 1 reply; 133+ messages in thread
From: Ted Zlatanov @ 2003-12-03 17:58 UTC (permalink / raw)


On Wed, 03 Dec 2003, rms@gnu.org wrote:

    > I think migrating Emacs towards a threading model is possible:
> 
>     - start with all primitive or ELisp functions assumed NOT
>       thread-safe
> 
>     - allow threads to run, but any access to a function needs to be
>       synchronous.  At first, this will effectively make threads
>       simple switched tasks, and will probably make Emacs slower.
> 
> Many sections of Lisp code would need to have locking in order
> to run correctly with multiple threads.  For instance, everything
> of the form
> 
>   (setq global-list (cons foo global-list))
> 
> would need locking.

What I proposed is that *all* functions start with the "synchronous"
atribute.  This would apply to primitives as well.

Then, they would be gradually rewritten.  For instance, a thread-safe
setq would act just like the regular setq, but it would lock its
arguments with semaphores before modifying them.  The thread-safe
setq can then be marked "asynchronous."

To deal with the example above, all buffers, variables, processes,
etc. that a synchronous function affects will have to be
thread-locked also.  So that needs to be an extension to my earlier
definition of "synchronous" - not only should concurrent copies of the
same function be forbidden, but also any objects that are used
elsewhere need to trigger thread-locking while the function is in a
scope that involves those objects.  I don't know how feasible that is.

Eventually pieces of code like the above would need to be rewritten
using atomic functions in order to avoid these problems.  For
instance, (push foo global-list) would work better above because the
push function can be made thread-safe.  I know push is not the
perfect example, but the point is that atomic modifications need to
be done atomically.

Ted

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-03 17:16           ` Richard Stallman
  2003-12-03 17:58             ` Ted Zlatanov
@ 2003-12-03 20:01             ` Nic Ferrier
  2003-12-03 20:29               ` Stefan Monnier
  1 sibling, 1 reply; 133+ messages in thread
From: Nic Ferrier @ 2003-12-03 20:01 UTC (permalink / raw)
  Cc: Ted Zlatanov, emacs-devel

Richard Stallman <rms@gnu.org> writes:

>     I think migrating Emacs towards a threading model is possible:
> 
>     - start with all primitive or ELisp functions assumed NOT thread-safe
> 
>     - allow threads to run, but any access to a function needs to be
>       synchronous.  At first, this will effectively make threads simple
>       switched tasks, and will probably make Emacs slower.
> 
> Many sections of Lisp code would need to have locking in order
> to run correctly with multiple threads.  For instance, everything
> of the form
> 
>   (setq global-list (cons foo global-list))
> 
> would need locking.

And anything doing similar things using dynamic scope as well (at
least when a variable isn't local to the function but from a
previously called function). So that's about everything.


Nic

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-03 20:01             ` Are there plans for a multi-threaded Emacs? Nic Ferrier
@ 2003-12-03 20:29               ` Stefan Monnier
  2003-12-03 21:42                 ` Robert J. Chassell
  2003-12-04  7:33                 ` Richard Stallman
  0 siblings, 2 replies; 133+ messages in thread
From: Stefan Monnier @ 2003-12-03 20:29 UTC (permalink / raw)
  Cc: Ted Zlatanov, rms, emacs-devel

> And anything doing similar things using dynamic scope as well (at
> least when a variable isn't local to the function but from a
> previously called function). So that's about everything.

I think the nastiest aspect I know of is the interaction of dynamic scope
with buffer-local bindings:

  (with-current-buffer A
    (setq default-directory fooA)
    (let ((default-directory barA))
      (with-current-buffer B
        (setq default-directory fooB)
        (let ((default-directory barB))
          (with-current-buffer A default-directory)))))

This will return `barA': i.e. the value of default-directory in buffer A is
temporarilly changed to barA.  But this is a "global" variable (from
a threading point of view) changed by a let-binding (generally considered
as a thread-local, stack-allocated variable).

So I think fine-grained threading in elisp is basically out.
But maybe if we add one lock per buffer and we make `with-current-buffer'
acquire&release the lock we might get a workable model, albeit with
a necessarily very coarse grain which is probably OK for most uses.
Of course, extreme care will still be needed, but that's OK.


        Stefan

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-03 20:29               ` Stefan Monnier
@ 2003-12-03 21:42                 ` Robert J. Chassell
  2003-12-04  7:33                   ` Richard Stallman
  2003-12-04  7:33                 ` Richard Stallman
  1 sibling, 1 reply; 133+ messages in thread
From: Robert J. Chassell @ 2003-12-03 21:42 UTC (permalink / raw)


Stefan Monnier <monnier@IRO.UMontreal.CA> wrote:

   But maybe if we add one lock per buffer and we make
   `with-current-buffer' acquire&release the lock we might get a
   workable model, albeit with a necessarily very coarse grain ....

Yes.  From a user interface point of view, the interactive unit is the
buffer (or a closely associated group of buffers, as in Gnus).  Users
work with buffers.  Only programmers, developers, and people on the
emacs-devel list think otherwise.... :)

When a buffer is operating asynchronously, then nothing should affect
it except a Control-c in the buffer itself.  The
process/thread/whatever gets updated *afterwards*.  

>From a user's point of view, when you run the process in the buffer,
it is as if the buffer were run by another instance of Emacs, but with
an environment that is identical to the start of the process.  (Maybe
this is how it is done; a new instance is spawned.)  The independent
buffer process goes on its own.  After it stops, it is updated.  And
after that, maybe, it updates the rest.

   Of course, extreme care will still be needed, but that's OK.

Yes.  Very true!

-- 
    Robert J. Chassell                         Rattlesnake Enterprises
    http://www.rattlesnake.com                  GnuPG Key ID: 004B4AC8
    http://www.teak.cc                             bob@rattlesnake.com

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-03 17:58             ` Ted Zlatanov
@ 2003-12-03 23:38               ` Martin Stjernholm
  2003-12-04 13:05                 ` Ted Zlatanov
  0 siblings, 1 reply; 133+ messages in thread
From: Martin Stjernholm @ 2003-12-03 23:38 UTC (permalink / raw)
  Cc: emacs-devel

Ted Zlatanov <tzz@lifelogs.com> wrote:

> What I proposed is that *all* functions start with the "synchronous"
> atribute.  This would apply to primitives as well.
>
> Then, they would be gradually rewritten.  For instance, a thread-safe
> setq would act just like the regular setq, but it would lock its
> arguments with semaphores before modifying them.  The thread-safe
> setq can then be marked "asynchronous."

What about simply having a single mutex for everything? It's
essentially always held, and a thread only relinquishes it to do
blocking operations. Immediately afterwards it reacquires the lock.

This way Emacs is still effectively single threaded (in the sense that
only one thread runs at a time) but it is possible to use the
threading paradigm to do blocking operations. It's comparatively easy
to implement since all data access still goes on as usual. It's
necessary to make the C level thread safe only in the small regions
where the lock is released.

I take it this would essentially be the same as your starting point,
where all functions are synchronous - nothing runs at the same time as
anything else. There are however only small benefits to go further:

o  To be able to run several threads simultaneously in multicpu or
   hyperthreaded systems.
o  To get OS level preemption between threads.

Preemption can be simulated on the elisp level by making sure that no
significant amount of code gets to run without relinquishing the lock.
I.e. there is a function that gets called regularly that only releases
the lock, yields (if the thread implementation supports it) and then
takes the lock again.

Another possibility is to do no preemption at all, and instead
introduce an elisp function `yield' that does the above. CPU bound
code should call it explicitly every once in a while. That has the
nice property that other elisp code does not have to use locks to
avoid preemption in sensitive areas. This means "old fashioned"
cooperative multitasking, and malfunctioning code can still lock up
everything, but that's not any worse than the situation today so I
don't regard it as a significant problem.

I see these benefits with this model compared to a "fully"
multithreaded variant:

o  Fairly small changes in the C code.
o  No significant change in the elisp execution model, at least not if
   preemption is avoided.
o  Little overhead in locking - there's no fine grained locking on
   individual data structures.

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-03 20:29               ` Stefan Monnier
  2003-12-03 21:42                 ` Robert J. Chassell
@ 2003-12-04  7:33                 ` Richard Stallman
  2003-12-04 13:14                   ` Ted Zlatanov
  2003-12-04 15:41                   ` Stefan Monnier
  1 sibling, 2 replies; 133+ messages in thread
From: Richard Stallman @ 2003-12-04  7:33 UTC (permalink / raw)
  Cc: tzz, nferrier, emacs-devel

Dynamic binding causes no trouble for multiple threads if each thread has
its own binding stack and switching threads swaps the bindings.

However, code like

  (setq global-list (cons foo global-list))

is a completely separate issue.  The problem here is that thread
switching needs to be prevented between the access to global-list
and the modification of global-list.  Of course, the potential
for collision exists because global-list may be referred to elsewhere.
But it does not depend on dynamic bindings.  If nobody ever binds
global-list, if its global binding is the only one, the problem
still occurs.

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-03 21:42                 ` Robert J. Chassell
@ 2003-12-04  7:33                   ` Richard Stallman
  2003-12-04 15:37                     ` Stefan Monnier
  0 siblings, 1 reply; 133+ messages in thread
From: Richard Stallman @ 2003-12-04  7:33 UTC (permalink / raw)
  Cc: emacs-devel

       But maybe if we add one lock per buffer and we make
       `with-current-buffer' acquire&release the lock we might get a
       workable model, albeit with a necessarily very coarse grain ....

A lock on with-current-buffer can't really solve the problem,
because only a few of the functions that modify a buffer
use with-current-buffer.

However, perhaps you're thinking of allowing a few specially-designated
asynchronous threads, each of which would edit only its own buffer or buffers
so that they won't get in each others' way, that might work if the code
that runs in these specially-designated threads is specially written to
be safe in such a thread.

That might be a workable idea.

In other words, there would be one thread that has full capability to run
anything, including old unmodified code, and any number of other threads
that run only specially-designed thread-safe code.  This approach
MIGHT be workable.  The devil is in the details, so someone would
probably have to study them.

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-03 23:38               ` Martin Stjernholm
@ 2003-12-04 13:05                 ` Ted Zlatanov
  2003-12-04 14:07                   ` David Kastrup
  2003-12-04 17:22                   ` Martin Stjernholm
  0 siblings, 2 replies; 133+ messages in thread
From: Ted Zlatanov @ 2003-12-04 13:05 UTC (permalink / raw)


On Thu, 04 Dec 2003, mast@lysator.liu.se wrote:

> What about simply having a single mutex for everything? It's
> essentially always held, and a thread only relinquishes it to do
> blocking operations. Immediately afterwards it reacquires the lock.

> I take it this would essentially be the same as your starting point,
> where all functions are synchronous - nothing runs at the same time
> as anything else. There are however only small benefits to go
> further:
> 
> o  To be able to run several threads simultaneously in multicpu or
>    hyperthreaded systems.
> o  To get OS level preemption between threads.

Those two benefits make a big difference.  Today's Pentiums have
hyper-threading technology, so even a single processor can act as
two.  The best cooperative multitasking can't make use of multiple
processors as well as premptive multithreading.  Cooperative
multitasking definitely has benefits - time-critical applications for
instance, but I don't think that applies to Emacs.

> I see these benefits with this model compared to a "fully"
> multithreaded variant:
> 
> o Fairly small changes in the C code.  

> o No significant change in the elisp execution model, at least not
> if preemption is avoided.  

> o Little overhead in locking - there's no fine grained locking on
> individual data structures.

I agree with all those.  Converting a single-threaded application to
multithreaded, especially one as complex as Emacs, is a daunting
task.  I think it's worthwhile.

Ted

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-04  7:33                 ` Richard Stallman
@ 2003-12-04 13:14                   ` Ted Zlatanov
  2003-12-04 15:41                   ` Stefan Monnier
  1 sibling, 0 replies; 133+ messages in thread
From: Ted Zlatanov @ 2003-12-04 13:14 UTC (permalink / raw)


On Thu, 04 Dec 2003, rms@gnu.org wrote:

> Dynamic binding causes no trouble for multiple threads if each
> thread has its own binding stack and switching threads swaps the
> bindings.
> 
> However, code like
> 
>   (setq global-list (cons foo global-list))
> 
> is a completely separate issue.  The problem here is that thread
> switching needs to be prevented between the access to global-list
> and the modification of global-list.  Of course, the potential for
> collision exists because global-list may be referred to elsewhere.
> But it does not depend on dynamic bindings.  If nobody ever binds
> global-list, if its global binding is the only one, the problem
> still occurs.

Why not just lock all other threads that use that global symbol (it is
bound in that thread)?  I apologize if I'm missing the point here.

Ted

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-04 13:05                 ` Ted Zlatanov
@ 2003-12-04 14:07                   ` David Kastrup
  2003-12-04 14:58                     ` Nic Ferrier
  2003-12-04 16:17                     ` Kim F. Storm
  2003-12-04 17:22                   ` Martin Stjernholm
  1 sibling, 2 replies; 133+ messages in thread
From: David Kastrup @ 2003-12-04 14:07 UTC (permalink / raw)
  Cc: emacs-devel

Ted Zlatanov <tzz@lifelogs.com> writes:

> > I see these benefits with this model compared to a "fully"
> > multithreaded variant:
> > 
> > o Fairly small changes in the C code.  
> 
> > o No significant change in the elisp execution model, at least not
> > if preemption is avoided.  
> 
> > o Little overhead in locking - there's no fine grained locking on
> > individual data structures.
> 
> I agree with all those.  Converting a single-threaded application to
> multithreaded, especially one as complex as Emacs, is a daunting
> task.  I think it's worthwhile.

Not everything that is worthwhile gets done.  In order to even have a
minuscule chance of having reasonably parallel executable code, we
need to have lexical instead of dynamic scope.  Parallizing code that
is depending on changes of a global namespace for every involved local
variable is near to impossible.

So changing Emacs' scopes to lexical is a prerequisite for any
meaningful attempt at multithreading, anyway.

If we can't find the resources and volunteers for doing this step, we
will certainly not get beyond to the even more ambitious task of
multithreading for which it is an absolutely indispensible
prerequisite in my opinion.

Apart from giving people perhaps more enthusiasm for working on the
lexical binding problem, I don't see what actually workable
perspectives the multithreading buys us.  Even then, it would be
unfair to suggest people that if their desire is to get
multithreading, that finishing some lexical binding project will make
their goal come into easy reach.  It is a prerequisite in my opinion,
but quite far from making the ultimate goal easy to achieve.

-- 
David Kastrup, Kriemhildstr. 15, 44793 Bochum

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-04 14:07                   ` David Kastrup
@ 2003-12-04 14:58                     ` Nic Ferrier
  2003-12-04 15:44                       ` David Kastrup
  2003-12-04 16:17                     ` Kim F. Storm
  1 sibling, 1 reply; 133+ messages in thread
From: Nic Ferrier @ 2003-12-04 14:58 UTC (permalink / raw)
  Cc: emacs-devel


> So changing Emacs' scopes to lexical is a prerequisite for any
> meaningful attempt at multithreading, anyway.

Except that it's more important that Emacs uses dynamic scope than
multi-threading. Dynamic scope is _one_ of the reasons Emacs has been
sucessfull. 

rms wrote a paper about the design of Emacs which, I think,
succesfully justifies the choice of dynamic scope:

  http://www.gnu.org/software/emacs/emacs-paper.html


Nic

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-04  7:33                   ` Richard Stallman
@ 2003-12-04 15:37                     ` Stefan Monnier
  2003-12-04 18:06                       ` Thien-Thi Nguyen
  0 siblings, 1 reply; 133+ messages in thread
From: Stefan Monnier @ 2003-12-04 15:37 UTC (permalink / raw)
  Cc: bob, emacs-devel

> A lock on with-current-buffer can't really solve the problem,
> because only a few of the functions that modify a buffer
> use with-current-buffer.

I don't think we can have a fool-proof solution short of using separate
processes with explicit communication.  So my proposal is just to allow
wildly dangerous multi-threading and provide a few synchronising constructs
such that if people really want to, they can write multithreaded code,
although at a cost of extreme care.

> However, perhaps you're thinking of allowing a few specially-designated
> asynchronous threads, each of which would edit only its own buffer or buffers
> so that they won't get in each others' way, that might work if the code
> that runs in these specially-designated threads is specially written to
> be safe in such a thread.

Yes, that's the idea.  I was thinking in terms of "what's the minimal amount
of parallelism needed to get similar benefits as current async-I/O (via
process-filters) but for CPU-bound tasks, such as Gnus's construction of the
summary buffer".  I think in all the important cases, the CPU-bound tasks
runs in a single buffer and that buffer is not modified/used by other code,
so locking at that level makes sense.

> MIGHT be workable.  The devil is in the details, so someone would

Yes, my proposition only addresses the issue from a "threading model for
the elisp programmer" point of view.  Given the extensive internal use of
global variables in the C code, a significant amount of code-review would
be needed to get rid of problems such as the regexp.c code being
non-reentrant, unless we do the preemption manually in Feval and even then,
we'll probably encounter unexpected problems.


        Stefan

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-04  7:33                 ` Richard Stallman
  2003-12-04 13:14                   ` Ted Zlatanov
@ 2003-12-04 15:41                   ` Stefan Monnier
  1 sibling, 0 replies; 133+ messages in thread
From: Stefan Monnier @ 2003-12-04 15:41 UTC (permalink / raw)
  Cc: tzz, nferrier, emacs-devel

> Dynamic binding causes no trouble for multiple threads if each thread has
> its own binding stack and switching threads swaps the bindings.

That works fine in "normal" dynamically-scoped languaged.
But can we really do that in elisp ?
I mean, how could we make it work in my example of let-binding a buffer-local
variable such as `default-directory' and then switching buffers back and
forth ?  I know such cases are rare but do exist.
Maybe there's a way, but I haven't been able to figure it out ?


        Stefan

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-04 14:58                     ` Nic Ferrier
@ 2003-12-04 15:44                       ` David Kastrup
  0 siblings, 0 replies; 133+ messages in thread
From: David Kastrup @ 2003-12-04 15:44 UTC (permalink / raw)
  Cc: emacs-devel

Nic Ferrier <nferrier@tapsellferrier.co.uk> writes:

> > So changing Emacs' scopes to lexical is a prerequisite for any
> > meaningful attempt at multithreading, anyway.
> 
> Except that it's more important that Emacs uses dynamic scope than
> multi-threading. Dynamic scope is _one_ of the reasons Emacs has been
> sucessfull. 
> 
> rms wrote a paper about the design of Emacs which, I think,
> succesfully justifies the choice of dynamic scope:
> 
>   http://www.gnu.org/software/emacs/emacs-paper.html

In this paper, Stallman writes

  It is not necessary for dynamic scope to be the only scope rule
  provided, just useful for it to be available.

And one has to realize the costs associated with dynamic scopes:
essentially it means that every function, no matter how large or
small, receives and uses the global binding table as an implicit
argument.  This has some principal advantages as those outlined by
Stallman in the paper.  It also has huge disadvantages where code
generation and verification are concerned.  Those disadvantages are
what makes the prospect of multithreading in connection with dynamical
scope unrealistic: there will always be contention and locking issues
with the universally accessed resource of the binding table.

-- 
David Kastrup, Kriemhildstr. 15, 44793 Bochum

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-04 16:17                     ` Kim F. Storm
@ 2003-12-04 15:58                       ` Nic Ferrier
  2003-12-04 16:26                         ` non-blocking sockets (was Re: Are there plans for a multi-threaded Emacs?) Nic Ferrier
  2003-12-04 19:55                       ` Are there plans for a multi-threaded Emacs? Ted Zlatanov
  1 sibling, 1 reply; 133+ messages in thread
From: Nic Ferrier @ 2003-12-04 15:58 UTC (permalink / raw)
  Cc: emacs-devel

storm@cua.dk (Kim F. Storm) writes:

> I still wonder why people want multi-threading in Elisp -- IMHO, emacs
> works just fine without it!
> 
> I admit (synchronous) GNUS is a problem, but except for that, I don't
> really see that much code which will benefit vastly from being executed
> by a multi-threaded emacs.
> 
> And for GNUS, you can just run two instances of emacs on your
> multi-tasking OS.
> 
> Likewise, if you have some vast app writting in Elisp, just start
> a second emacs to run it.

I had wanted threads in elisp a while ago when I was working far away
from my home site. I was sending mail using my home MTA from Emacs on
a windows desktop. It was slow, really, really slow at connecting to
the MTA.

I've solved the problem now of course, I use a laptop with GNU on it
and run a local MTA and have that send stuff to my home MTA.

But if Emacs had threads I wouldn't have needed to do that.


Hmmm... maybe if most of the threading issues are with socket
communication then better sentinels would be a good idea. Maybe a
callback API for setting up and reading/writing to sockets would
really useful. Such an API would be a doddle to write of course.


Nic

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-04 14:07                   ` David Kastrup
  2003-12-04 14:58                     ` Nic Ferrier
@ 2003-12-04 16:17                     ` Kim F. Storm
  2003-12-04 15:58                       ` Nic Ferrier
  2003-12-04 19:55                       ` Are there plans for a multi-threaded Emacs? Ted Zlatanov
  1 sibling, 2 replies; 133+ messages in thread
From: Kim F. Storm @ 2003-12-04 16:17 UTC (permalink / raw)


David Kastrup <dak@gnu.org> writes:

> Ted Zlatanov <tzz@lifelogs.com> writes:
> 
> > I agree with all those.  Converting a single-threaded application to
> > multithreaded, especially one as complex as Emacs, is a daunting
> > task.  I think it's worthwhile.
> 
> Not everything that is worthwhile gets done.  

I don't really agree that this is worthwhile.

IMO, there are many other improvements that are more important than
multi-threading.  Of course, if we had unlimited development _and_
_testing_ resources, it would be a nice thing to add, but I don't like
the idea of adding something _really complex_ like that which may
potentially de-stabilize emacs for a long time.

Even if you add multi-threading to Elisp, the applications need to be
made aware of that.  How much -additional- work would be it be to
rework, say, GNUS to be multi-threaded?

Actually, a lot of code could already be improved today with better
use of process filters and sentinels, but that hasn't been done.
So even if we had multi-threading, I doubt that it would be widely
used.

> So changing Emacs' scopes to lexical is a prerequisite for any
> meaningful attempt at multithreading, anyway.

The lexical binding could be on a per-project or per-file basis,
rather than an over-all change to Elisp.  That would allow projects
which requires multi-threading to use lexical scoping.  _IF_ they
use dynamic scoping, it will result in unexplicable errors, but
the byte-compiler might warn against such uses, so we don't need
run-time checking.

IIRC the plans to add lexical scoping to Elisp is per-file, and
rumours is that there already exist patches to achieve this.

> 
> Apart from giving people perhaps more enthusiasm for working on the
> lexical binding problem, I don't see what actually workable
> perspectives the multithreading buys us.  Even then, it would be
> unfair to suggest people that if their desire is to get
> multithreading, that finishing some lexical binding project will make
> their goal come into easy reach.  It is a prerequisite in my opinion,
> but quite far from making the ultimate goal easy to achieve.

I still wonder why people want multi-threading in Elisp -- IMHO, emacs
works just fine without it!

I admit (synchronous) GNUS is a problem, but except for that, I don't
really see that much code which will benefit vastly from being executed
by a multi-threaded emacs.

And for GNUS, you can just run two instances of emacs on your
multi-tasking OS.

Likewise, if you have some vast app writting in Elisp, just start
a second emacs to run it.

Problem solved!

-- 
Kim F. Storm <storm@cua.dk> http://www.cua.dk

^ permalink raw reply	[flat|nested] 133+ messages in thread

* non-blocking sockets (was Re: Are there plans for a multi-threaded Emacs?)
  2003-12-04 15:58                       ` Nic Ferrier
@ 2003-12-04 16:26                         ` Nic Ferrier
  2003-12-05 11:35                           ` Kim F. Storm
  0 siblings, 1 reply; 133+ messages in thread
From: Nic Ferrier @ 2003-12-04 16:26 UTC (permalink / raw)
  Cc: emacs-devel

Nic Ferrier <nferrier@tapsellferrier.co.uk> writes:

> Hmmm... maybe if most of the threading issues are with socket
> communication then better sentinels would be a good idea. Maybe a
> callback API for setting up and reading/writing to sockets would
> really useful. Such an API would be a doddle to write of course.

Doh!

Elisp 21 already has non-blocking sockets... I don't remember them
from the last time I did any socket stuff but they are there.

So one big win would be to convert as much network reliant code to
using non-blocking sockets which someone already said.


Since 'open-network-stream-nowait' returns nil when it's not
supported it seems fairly safe to add it to all networking
code. Maybe a new form is needed:

   open-network-stream-nowait-if-possible

which does an nbio connection if it can but otherwise a normal one.


If your system doesn't support nbio then you'll still have to wait
for Emacs threads for faster network connections   /8->


Nic

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-04 13:05                 ` Ted Zlatanov
  2003-12-04 14:07                   ` David Kastrup
@ 2003-12-04 17:22                   ` Martin Stjernholm
  2003-12-04 18:01                     ` David Kastrup
  2003-12-04 20:18                     ` Ted Zlatanov
  1 sibling, 2 replies; 133+ messages in thread
From: Martin Stjernholm @ 2003-12-04 17:22 UTC (permalink / raw)
  Cc: emacs-devel

Ted Zlatanov <tzz@lifelogs.com> wrote:

>> o  To be able to run several threads simultaneously in multicpu or
>>    hyperthreaded systems.
>> o  To get OS level preemption between threads.
>
> Those two benefits make a big difference.

The last does not since it's quite feasible to simulate, as I've
outlined. (I know that from practical experience with this threading
model in a language environment fairly similar to elisp.)

> Today's Pentiums have hyper-threading technology, so even a single
> processor can act as two.

True. Hyperthreading is becoming more commonplace.

> The best cooperative multitasking can't make use of multiple
> processors as well as premptive multithreading.

I don't see how preemption per se can improve parallell execution.
Fine grained locking can, but it's hard to avoid making it too fine
grained so that the locking itself becomes more time consuming than
the speedup from the improved parallellism it achieves.

> Cooperative multitasking definitely has benefits - time-critical
> applications for instance, but I don't think that applies to Emacs.

One thing that does apply to Emacs, and very heavily too, is that
cooperative task switching makes it a lot easier to cope with the
threading issues at the application level - it becomes an opt-in
feature instead of an opt-out, i.e. code that doesn't need or want to
bother with thread safety remains safe. This is important even if the
considerable transitional work to thread safe existing code is
disregarded. Thread locking is still a complex issue that easily leads
to bugs (and often very tricky ones too), so it's a big advantage to
not have to bother about it in the vast majority of code.

> /.../ Converting a single-threaded application to multithreaded,
> especially one as complex as Emacs, is a daunting task.  I think it's
> worthwhile.

I gather then that one important goal for you with the thread support
is to make Emacs utilize true parallell execution better, i.e. it's
for performance reasons and not only to let elisp developers take
advantage of the threading paradigm.

I don't regard that performance gain as significant, at least not
compared to the amount of work involved. Emacs is still an interactive
application, and as such it essentially only responds to user actions.
Granted, there are some elisp packages that occasionally can be very
heavily cpu bound, but they are afterall only a few exceptions. The
only case when true parallell execution would improve things are when
two or more such tasks are run concurrently. I regard that as an
extremely rare situation, but you would probably disagree?

Anyway, a way to cope with such heavy tasks could be to make it easy
to fork a separate interpreter with its own data set. It would then
only take the main interpreter lock explicitly and rarely to
communicate its results and request new data, or perhaps even be
restricted to communication through a pipe.

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-04 17:22                   ` Martin Stjernholm
@ 2003-12-04 18:01                     ` David Kastrup
  2003-12-04 18:31                       ` Martin Stjernholm
  2003-12-04 20:18                     ` Ted Zlatanov
  1 sibling, 1 reply; 133+ messages in thread
From: David Kastrup @ 2003-12-04 18:01 UTC (permalink / raw)
  Cc: Ted Zlatanov, emacs-devel

Martin Stjernholm <mast@lysator.liu.se> writes:

> Ted Zlatanov <tzz@lifelogs.com> wrote:
> 
> >> o  To be able to run several threads simultaneously in multicpu or
> >>    hyperthreaded systems.
> >> o  To get OS level preemption between threads.
> >
> > Those two benefits make a big difference.
> 
> The last does not since it's quite feasible to simulate, as I've
> outlined. (I know that from practical experience with this threading
> model in a language environment fairly similar to elisp.)
> 
> > Today's Pentiums have hyper-threading technology, so even a single
> > processor can act as two.
> 
> True. Hyperthreading is becoming more commonplace.
> 
> > The best cooperative multitasking can't make use of multiple
> > processors as well as premptive multithreading.
> 
> I don't see how preemption per se can improve parallell execution.

It's not preemption, but preemption aware coding, and it does not
improve parallel execution but is a prerequisite for it.

> Fine grained locking can, but it's hard to avoid making it too fine
> grained so that the locking itself becomes more time consuming than
> the speedup from the improved parallellism it achieves.

For that reason it is important to have as few locks necessary as
possible.  And having to lock on the binding table would be
prohibitively expensive.

> Anyway, a way to cope with such heavy tasks could be to make it easy
> to fork a separate interpreter with its own data set. It would then
> only take the main interpreter lock explicitly and rarely to
> communicate its results and request new data, or perhaps even be
> restricted to communication through a pipe.

`fork' is a system call that is not available for a considerable
number of Emacs runtime platforms.  Relying on it might not be the
best choice for such a feature, apart from the obvious problems with
having two copies of Emacs with open buffers of their own around.

-- 
David Kastrup, Kriemhildstr. 15, 44793 Bochum

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-04 15:37                     ` Stefan Monnier
@ 2003-12-04 18:06                       ` Thien-Thi Nguyen
  0 siblings, 0 replies; 133+ messages in thread
From: Thien-Thi Nguyen @ 2003-12-04 18:06 UTC (permalink / raw)
  Cc: bob, rms, emacs-devel

Stefan Monnier <monnier@IRO.UMontreal.CA> writes:

   Yes, that's the idea.  I was thinking in terms of "what's the minimal
   amount of parallelism needed to get similar benefits as current
   async-I/O (via process-filters) but for CPU-bound tasks, such as
   Gnus's construction of the summary buffer".  I think in all the
   important cases, the CPU-bound tasks runs in a single buffer and that
   buffer is not modified/used by other code, so locking at that level
   makes sense.

this is a nice idea, the "locked-loopback-buffer" abstraction.  locking
requires declaration of all variables needed to be passed in, unlocking
passes out new values (if any) plus the modified buffer text.  you can
even avoid threads entirely.  for implementation, fork an inferior emacs
and use the already-in-place async-I/O facilities.  two afternoons and a
nap!  who needs multi-threadache anyway?

thi

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-04 18:01                     ` David Kastrup
@ 2003-12-04 18:31                       ` Martin Stjernholm
  2003-12-04 19:26                         ` David Kastrup
  0 siblings, 1 reply; 133+ messages in thread
From: Martin Stjernholm @ 2003-12-04 18:31 UTC (permalink / raw)
  Cc: Ted Zlatanov, emacs-devel

David Kastrup <dak@gnu.org> wrote:

> It's not preemption, but preemption aware coding, and it does not
> improve parallel execution but is a prerequisite for it.

Maybe we have a terminology problem here. I don't regard thread yields
due to blocking operations or cooperative yielding as preemption.
Instead I reserve that term for uncooperative yielding when a time
slice is up. It's perfectly fine to have several executing tasks in
parallell without ever stopping any of them uncooperatively.

>> Fine grained locking can, but it's hard to avoid making it too fine
>> grained so that the locking itself becomes more time consuming than
>> the speedup from the improved parallellism it achieves.
>
> For that reason it is important to have as few locks necessary as
> possible.  And having to lock on the binding table would be
> prohibitively expensive.

Another reason to have only a single interpreter lock and no
preemption. It's hardly so expensive that it would take significant
time compared to blocking operations, is it?

>> Anyway, a way to cope with such heavy tasks could be to make it easy
>> to fork a separate interpreter with its own data set. It would then
>> only take the main interpreter lock explicitly and rarely to
>> communicate its results and request new data, or perhaps even be
>> restricted to communication through a pipe.
>
> `fork' is a system call that is not available for a considerable
> number of Emacs runtime platforms.

Sorry, I was not entirely clear. I meant only starting a new
interpreter with its own data set in some suitable way, be it with a
thread or a new process. The behavior of the unix fork(2) system call
is actually not very suitable since the new interpreter should not
have a copy of all the data in the original instance.

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-04 18:31                       ` Martin Stjernholm
@ 2003-12-04 19:26                         ` David Kastrup
  2003-12-04 22:05                           ` Martin Stjernholm
  0 siblings, 1 reply; 133+ messages in thread
From: David Kastrup @ 2003-12-04 19:26 UTC (permalink / raw)
  Cc: Ted Zlatanov, emacs-devel

Martin Stjernholm <mast@lysator.liu.se> writes:

> David Kastrup <dak@gnu.org> wrote:
> 
> > It's not preemption, but preemption aware coding, and it does not
> > improve parallel execution but is a prerequisite for it.
> 
> Maybe we have a terminology problem here. I don't regard thread
> yields due to blocking operations or cooperative yielding as
> preemption.

The whole proposal was geared towards parallel execution of
computation-intensive tasks (like gnus summarizing and scoring) with
the editing foreground task.  If we are not talking about
multithreading, of course talking about preemption is idle.  But if
you remember, one topic that was brought up in this discussion was
hyperthreading.  Cooperative yielding can't make use of
hyperthreading.  Tasks that require cooperative yielding must not
share any resources with any other task in between synchronization
points (yield points, whatever).  So they can't make use of multiple
CPUs available.  For multiple CPUs, you need thread safe programming.

> Instead I reserve that term for uncooperative yielding when a time
> slice is up. It's perfectly fine to have several executing tasks in
> parallel without ever stopping any of them uncooperatively.

But it will not be able to make use of multiple CPUs.  And even with
cooperative multitasking you need separate stacks for several
resources, for every task, or you can only yield when at the top
level of bindings/stacks/whatever.

> >> Fine grained locking can, but it's hard to avoid making it too
> >> fine grained so that the locking itself becomes more time
> >> consuming than the speedup from the improved parallellism it
> >> achieves.
> >
> > For that reason it is important to have as few locks necessary as
> > possible.  And having to lock on the binding table would be
> > prohibitively expensive.
> 
> Another reason to have only a single interpreter lock and no
> preemption. It's hardly so expensive that it would take significant
> time compared to blocking operations, is it?

I don't see any usefulness at all.  Certainly every nontrivial task
will need to use the interpreter?  So where is the gain?

-- 
David Kastrup, Kriemhildstr. 15, 44793 Bochum

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-04 16:17                     ` Kim F. Storm
  2003-12-04 15:58                       ` Nic Ferrier
@ 2003-12-04 19:55                       ` Ted Zlatanov
  2003-12-04 20:30                         ` Stefan Monnier
  1 sibling, 1 reply; 133+ messages in thread
From: Ted Zlatanov @ 2003-12-04 19:55 UTC (permalink / raw)


On 04 Dec 2003, storm@cua.dk wrote:

> David Kastrup <dak@gnu.org> writes:
> 
>> Ted Zlatanov <tzz@lifelogs.com> writes:

>> > Converting a single-threaded application to multithreaded,
>> > especially one as complex as Emacs, is a daunting task.  I think
>> > it's worthwhile.
>> 
>> Not everything that is worthwhile gets done.  
> 
> I don't really agree that this is worthwhile.
> 
> IMO, there are many other improvements that are more important than
> multi-threading.  Of course, if we had unlimited development _and_
> _testing_ resources, it would be a nice thing to add, but I don't
> like the idea of adding something _really complex_ like that which
> may potentially de-stabilize emacs for a long time.

I meant it's worthwhile to add multithreading to Emacs, not that it
should override other, more important tasks for the Emacs developers.
I'm sorry if I gave the wrong impression.

> Even if you add multi-threading to Elisp, the applications need to
> be made aware of that.  How much -additional- work would be it be to
> rework, say, GNUS to be multi-threaded?

Specifically with Gnus the work would be pretty extensive.  Gnus
relies on a lot of buffer-local and global variables.  I'd personally
commit quite a few hours to that project because it will be fun.

> Actually, a lot of code could already be improved today with better
> use of process filters and sentinels, but that hasn't been done.  So
> even if we had multi-threading, I doubt that it would be widely
> used.

I don't think process filters would help much if I wanted to look up
several entries in a hashtable in parallel to build an article
summary buffer.  Right now, doing this sequentially is the only way,
and consequently doing fancy things while building the summary buffer
is not a good idea.

What I mean is, say we have N articles in a mail-group (in Gnus, seen
in the summary buffer).  For each article, I want to look up certain
things in a hashtable.  I am sure that the lookups will not involve
any variable modifications.  I'd rather start N or (fraction of N)
threads than do N sequential lookups.

This is just an example for Gnus, because I'm most familiar with that
application.  I'm sure that other applications, for instance anything
that does parallel independent calculations, will benefit from
multithreading as opposed to process filters or sentinels.

> I still wonder why people want multi-threading in Elisp -- IMHO,
> emacs works just fine without it!

For example, gnuclient could be used to get immediate results instead
of waiting for the current task to complete.  That would be useful.

> I admit (synchronous) GNUS is a problem, but except for that, I
> don't really see that much code which will benefit vastly from being
> executed by a multi-threaded emacs.

I don't think vast improvements can be expected, either.  It will
improve the user experience, though.

> And for GNUS, you can just run two instances of emacs on your
> multi-tasking OS.
> 
> Likewise, if you have some vast app writting in Elisp, just start
> a second emacs to run it.
> 
> Problem solved!

Come on, that's giving up on the problem.  I already run two copies of
Emacs, one for editing and one for Gnus.  There's problems with that.
For instance, files I open in the one that quits first don't get in
the .session file because the second one overwrites the .session
file.

Ted

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-04 17:22                   ` Martin Stjernholm
  2003-12-04 18:01                     ` David Kastrup
@ 2003-12-04 20:18                     ` Ted Zlatanov
  2003-12-04 23:00                       ` Martin Stjernholm
  2003-12-05 13:56                       ` Benjamin Riefenstahl
  1 sibling, 2 replies; 133+ messages in thread
From: Ted Zlatanov @ 2003-12-04 20:18 UTC (permalink / raw)


On Thu, 04 Dec 2003, mast@lysator.liu.se wrote:

Ted Zlatanov <tzz@lifelogs.com> wrote:

>> The best cooperative multitasking can't make use of multiple
>> processors as well as preemptive multithreading.
> 
> I don't see how preemption per se can improve parallell execution.
> Fine grained locking can, but it's hard to avoid making it too fine
> grained so that the locking itself becomes more time consuming than
> the speedup from the improved parallellism it achieves.

Not all threads need to be aware of each other.  Not all threads will
compete for the same resources.  Not all threads, in a cooperative
setup, will cooperate with each other due to programmer or design
error.  Also, I actually think it's easier to program for preemptive
multithreading because you write thread-safe code instead of
reengineering your code to fit the cooperative model.

>> /.../ Converting a single-threaded application to multithreaded,
>> especially one as complex as Emacs, is a daunting task.  I think
>> it's worthwhile.
> 
> I gather then that one important goal for you with the thread
> support is to make Emacs utilize true parallell execution better,
> i.e. it's for performance reasons and not only to let elisp
> developers take advantage of the threading paradigm.

Yes.

> I don't regard that performance gain as significant, at least not
> compared to the amount of work involved. Emacs is still an
> interactive application, and as such it essentially only responds to
> user actions.  Granted, there are some elisp packages that
> occasionally can be very heavily cpu bound, but they are afterall
> only a few exceptions. The only case when true parallell execution
> would improve things are when two or more such tasks are run
> concurrently. I regard that as an extremely rare situation, but you
> would probably disagree?

It's rare currently because it's not possible.  I think the
application will come once the support for them is built.

Here's more examples: font-locking a buffer; reading or writing a
file.  Cooperative or preemptive multithreading would make them a more
pleasant user experience.

> Anyway, a way to cope with such heavy tasks could be to make it easy
> to fork a separate interpreter with its own data set. It would then
> only take the main interpreter lock explicitly and rarely to
> communicate its results and request new data, or perhaps even be
> restricted to communication through a pipe.

Heavyweight threads are a problem because, as I mentioned already,
Emacs is such a tightly coupled environment.  I think lightweight
threads are better for performance.

Ted

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-04 19:55                       ` Are there plans for a multi-threaded Emacs? Ted Zlatanov
@ 2003-12-04 20:30                         ` Stefan Monnier
  2003-12-04 20:58                           ` Ted Zlatanov
  0 siblings, 1 reply; 133+ messages in thread
From: Stefan Monnier @ 2003-12-04 20:30 UTC (permalink / raw)
  Cc: emacs-devel

> I don't think process filters would help much if I wanted to look up
> several entries in a hashtable in parallel to build an article
> summary buffer.  Right now, doing this sequentially is the only way,
> and consequently doing fancy things while building the summary buffer
> is not a good idea.

So you want to reduce the time it takes to build a summary buffer?
I agree that it would be good to build the summary buffer "in the
background" so I can do something else during this time, but if you want to
use parallelism to make things faster, then I think you're barking up the
wrong tree: Emacs is not optimized for speed and there are probably much
easier ways to make it faster.  Easier and safer as well (after all,
parallelising doesn't always speed things up, far from it).


        Stefan

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-04 20:30                         ` Stefan Monnier
@ 2003-12-04 20:58                           ` Ted Zlatanov
  2003-12-04 22:49                             ` Stefan Monnier
  2003-12-05  8:58                             ` Are there plans for a multi-threaded Emacs? Thien-Thi Nguyen
  0 siblings, 2 replies; 133+ messages in thread
From: Ted Zlatanov @ 2003-12-04 20:58 UTC (permalink / raw)


On 04 Dec 2003, monnier@iro.umontreal.ca wrote:

>> I don't think process filters would help much if I wanted to look
>> up several entries in a hashtable in parallel to build an article
>> summary buffer.  Right now, doing this sequentially is the only
>> way, and consequently doing fancy things while building the summary
>> buffer is not a good idea.
> 
> So you want to reduce the time it takes to build a summary buffer?
> I agree that it would be good to build the summary buffer "in the
> background" so I can do something else during this time, but if you
> want to use parallelism to make things faster, then I think you're
> barking up the wrong tree: Emacs is not optimized for speed and
> there are probably much easier ways to make it faster.  Easier and
> safer as well (after all, parallelising doesn't always speed things
> up, far from it).

The point is not to make Emacs *faster* but to make the user
experience better :) When Emacs can *respond* faster due to preemptive
multithreading, the user can start reading a message thread while the
summary buffer is being built, or the user can cancel the summary
build and leave the group if something else came up.  C-g is the only
option to do the latter right now, and for instance nnrss servers in
Gnus can be very slow so I often find myself hitting C-g when they
take too long.  I understand all this can be hacked into place, but
is it really necessary to avoid multithreading so desperately?

Plus, I am pretty sure that when an application uses N processors
instead of one (as Emacs might with true preemptive multithreading)
there is at least some speed improvement.  With the good ole Pentiums
this was not such an issue, but today's processors are definitely
better at simulating multiples (hyperthreading) or cooperating
(Xeons).  I don't have benchmarks, sorry, but at least on Solaris the
performance of a machine increases by at least 80% with each
additional SPARC processor.

Ted

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-04 19:26                         ` David Kastrup
@ 2003-12-04 22:05                           ` Martin Stjernholm
  0 siblings, 0 replies; 133+ messages in thread
From: Martin Stjernholm @ 2003-12-04 22:05 UTC (permalink / raw)
  Cc: Ted Zlatanov, emacs-devel

David Kastrup <dak@gnu.org> wrote:

> The whole proposal was geared towards parallel execution of
> computation-intensive tasks (like gnus summarizing and scoring) with
> the editing foreground task.

This discussion thread has been both about how threading should be
solved and what should be achieved with the solution. True parallel
execution is not the only discussed goal. In my opinion that goal is
fairly unimportant - the big win is instead to be able to use the
thread paradigm which in some cases is more convenient than the
alternative, i.e. callback driven programming.

As for the problem with Gnus, a threading model with a global lock is
a worthwhile improvement: It would allow that cpu intensive process to
be interrupted regularly to let Emacs respond to user actions. The big
win here is imho that Emacs remains responsive; it doesn't bother me
at all that the few milliseconds of work to achieve that is added to
the total time of the score buffer generation instead of being carried
out on another cpu.

The issue of preemption at the elisp level only affects what kind of
changes need to be done in Gnus to achieve these regular interrupts:
If there is no preemption, regular yield calls have to be added at
points where the state is consistent enough. Otherwise proper locking
has to be implemented.

> Cooperative yielding can't make use of hyperthreading.

Yes it can. Seems to me you are confusing cooperative yielding and
preemption with the use of a single global lock. A single global lock
prohibits both parallel execution and underlying preemption.
Preemption/cooperative yielding doesn't say anything about the kind of
locking being used.

> Tasks that require cooperative yielding must not share any resources
> with any other task in between synchronization points (yield points,
> whatever).

Depends on what you mean with sharing a resource. To be precise, they
can't leave any shared resource in an inconsistent state across a
yield point, and they can't assume anything about the state of any
shared resource afterwards.

Of course, even in a cooperative environment mutexes are useful to
lock out other threads from a resource that potentially is shared but
that the current thread want to retain exclusive access to.

> And even with cooperative multitasking you need separate stacks for
> several resources, for every task, /.../

Of course. That's one of two things a thread consists of (the other is
a promise of future cpu time).

>> Another reason to have only a single interpreter lock and no
>> preemption. It's hardly so expensive that it would take significant
>> time compared to blocking operations, is it?
>
> I don't see any usefulness at all.  Certainly every nontrivial task
> will need to use the interpreter?  So where is the gain?

Blocking operations, like waiting on a mutex or reading from a file or
socket, can leave the interpreter free to do other things. All
blocking operations can be fixed to not need direct access to the
interpreter data. In many cases it's such blocking operations that
make Emacs unresponsive. The alternative to threads is to rewrite all
such code to use callbacks (and in some cases the OS doesn't even
provide the necessary interface for callbacks, e.g. gethostbyname(3)).

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-04 20:58                           ` Ted Zlatanov
@ 2003-12-04 22:49                             ` Stefan Monnier
  2003-12-05 12:17                               ` Ted Zlatanov
  2003-12-05  8:58                             ` Are there plans for a multi-threaded Emacs? Thien-Thi Nguyen
  1 sibling, 1 reply; 133+ messages in thread
From: Stefan Monnier @ 2003-12-04 22:49 UTC (permalink / raw)
  Cc: emacs-devel

> take too long.  I understand all this can be hacked into place, but
> is it really necessary to avoid multithreading so desperately?

Nobody is avoiding it here.  We're just explaining to you why nobody
bothered to do it yet and why none of us feels the urge to do it:
lots of work, unclear payoff.

> Plus, I am pretty sure that when an application uses N processors
> instead of one (as Emacs might with true preemptive multithreading)
> there is at least some speed improvement.

Your being pretty sure does not magically eliminate all the known
counter examples.

> (Xeons).  I don't have benchmarks, sorry, but at least on Solaris the
> performance of a machine increases by at least 80% with each
> additional SPARC processor.

Such naive sweeping claims would tend to ruin your credibility, I'm afraid.
Yes, things can be made to work well, but do you have an idea of the
amount of work it takes to do that ?


        Stefan

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-04 20:18                     ` Ted Zlatanov
@ 2003-12-04 23:00                       ` Martin Stjernholm
  2003-12-05 12:06                         ` Ted Zlatanov
  2003-12-05 13:56                       ` Benjamin Riefenstahl
  1 sibling, 1 reply; 133+ messages in thread
From: Martin Stjernholm @ 2003-12-04 23:00 UTC (permalink / raw)
  Cc: emacs-devel

Ted Zlatanov <tzz@lifelogs.com> wrote:

> Not all threads need to be aware of each other.  Not all threads will
> compete for the same resources.

True, but these are arguments against a single lock. They have nothing
to do with preemption and cooperative yielding. Imho the advantages of
a single lock outweighs these.

> Not all threads, in a cooperative setup, will cooperate with each
> other due to programmer or design error.

Indeed. As I've said earlier, this is already the situation today.
Threads with cooperative yielding would provide a tool which I believe
makes it fairly simple to solve these cases. Some changes are
necessary, but otoh changes are necessary in the preemptive case too
since proper locking needs to be implemented.

> Also, I actually think it's easier to program for preemptive
> multithreading because you write thread-safe code instead of
> reengineering your code to fit the cooperative model.

Well, it's just as much reengineering to thread safe existing code as
to implement cooperative switching in it.

Anyway, it's not really an either-or situation. Thread tools like
mutexes are useful also in a cooperative environment. The difference
is that there's more control of where thread switches can take place
in the cooperative case. It's also possible to add a form like this:

    (auto-yield
      (while (big-task-not-finished)
        (work-on-big-task)))

`auto-yield' would instruct the elisp interpreter to yield
automatically inside the code block whenever it thinks it's time for
it. I.e. you'd get preemption inside that specific code block.

> Here's more examples: font-locking a buffer; reading or writing a
> file.

Reading or writing are blocking operations, so they would be executed
in parallel anyway.

Font locking is otoh cpu bound, but to get advantage of true
parallelism you'd need a situation where you do font locking at the
same time as something else that's cpu bound, e.g. Gnus scoring.
Otherwise it works fine to interrupt it to do display updates and so
on.

> Heavyweight threads are a problem because, as I mentioned already,
> Emacs is such a tightly coupled environment.  I think lightweight
> threads are better for performance.

Yes, I don't think it'd be useful very often either.

This is actually an argument against fine grained locking too: When
much code contend for the same resources and those are covered by many
small locks, much time will be spent in context switching due to
outlocking.

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-04 20:58                           ` Ted Zlatanov
  2003-12-04 22:49                             ` Stefan Monnier
@ 2003-12-05  8:58                             ` Thien-Thi Nguyen
  2003-12-05 11:58                               ` Ted Zlatanov
  2003-12-05 12:12                               ` Ted Zlatanov
  1 sibling, 2 replies; 133+ messages in thread
From: Thien-Thi Nguyen @ 2003-12-05  8:58 UTC (permalink / raw)
  Cc: emacs-devel

Ted Zlatanov <tzz@lifelogs.com> writes:

   Plus, I am pretty sure that when an application uses N processors
   instead of one (as Emacs might with true preemptive multithreading)

perhaps you still don't understand the root problem: "true preemptive
multithreading" requires a certain program architecture to take
advantage of it (including but not limited to: how the functions are
written, placement of data, access patterns to the data, external
interface requirements).  if emacs does not have this particular nature,
force-fitting it to make it so is a royal PITA.  if you don't force-fit
it, you will never get the true preemptive multithreading "experience".

   there is at least some speed improvement.  [...]

here's an analogy: rollerskates on two separate people and they both go
fast.  rollerskates on a potato-sack race pair and you get injuries and
lawsuits, coredumps and bug reports.  (and the pair still goes slow.)

thi

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: non-blocking sockets (was Re: Are there plans for a multi-threaded Emacs?)
  2003-12-04 16:26                         ` non-blocking sockets (was Re: Are there plans for a multi-threaded Emacs?) Nic Ferrier
@ 2003-12-05 11:35                           ` Kim F. Storm
  0 siblings, 0 replies; 133+ messages in thread
From: Kim F. Storm @ 2003-12-05 11:35 UTC (permalink / raw)
  Cc: emacs-devel

Nic Ferrier <nferrier@tapsellferrier.co.uk> writes:

> Nic Ferrier <nferrier@tapsellferrier.co.uk> writes:
> 
> > Hmmm... maybe if most of the threading issues are with socket
> > communication then better sentinels would be a good idea. Maybe a
> > callback API for setting up and reading/writing to sockets would
> > really useful. Such an API would be a doddle to write of course.
> 
> Doh!
> 
> Elisp 21 already has non-blocking sockets... I don't remember them
> from the last time I did any socket stuff but they are there.

Yes I know (I added it :-).

Problem is that often people whine about the things that are missing,
rather than trying to use the things that are already there.

> 
> So one big win would be to convert as much network reliant code to
> using non-blocking sockets which someone already said.
> 
Indeed!

Sending and receiving mail could definitely run "in the background"
using non-blocking i/o.

> 
> Since 'open-network-stream-nowait' returns nil when it's not
> supported it seems fairly safe to add it to all networking
> code. Maybe a new form is needed:
> 
>    open-network-stream-nowait-if-possible
> 
> which does an nbio connection if it can but otherwise a normal one.
> 

I considered this when I created the interface (the low-level function
is make-network-process), but I found that there is no general way in
which you could use either nbio or bio with the same sentinels and
filters, as the sequence of events is different.  

IMO it is better not to make an open-network-stream-nowait-if-possible
which pretends it is simpler than it really is!  Using nbio _is_ a
little more tricky that blocking io.

> 
> If your system doesn't support nbio then you'll still have to wait
> for Emacs threads for faster network connections   /8->
> 

Personally, I wouldn't care about such systems.

-- 
Kim F. Storm <storm@cua.dk> http://www.cua.dk

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-05  8:58                             ` Are there plans for a multi-threaded Emacs? Thien-Thi Nguyen
@ 2003-12-05 11:58                               ` Ted Zlatanov
  2003-12-05 12:12                               ` Ted Zlatanov
  1 sibling, 0 replies; 133+ messages in thread
From: Ted Zlatanov @ 2003-12-05 11:58 UTC (permalink / raw)


On 05 Dec 2003, ttn@glug.org wrote:

> Ted Zlatanov <tzz@lifelogs.com> writes:
> 
>    Plus, I am pretty sure that when an application uses N processors
>    instead of one (as Emacs might with true preemptive
>    multithreading)
> 
> perhaps you still don't understand the root problem: "true
> preemptive multithreading" requires a certain program architecture
> to take advantage of it (including but not limited to: how the
> functions are written, placement of data, access patterns to the
> data, external interface requirements).  if emacs does not have this
> particular nature, force-fitting it to make it so is a royal PITA.
> if you don't force-fit it, you will never get the true preemptive
> multithreading "experience".

You and Stefan are right, I generalized too much.  I meant a specific
type of application, and I think Emacs can be such.  I do understand
the issues involved.  I just wrote carelessly.

Ted

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-04 23:00                       ` Martin Stjernholm
@ 2003-12-05 12:06                         ` Ted Zlatanov
  2003-12-05 13:16                           ` Martin Stjernholm
  2003-12-05 14:46                           ` David Kastrup
  0 siblings, 2 replies; 133+ messages in thread
From: Ted Zlatanov @ 2003-12-05 12:06 UTC (permalink / raw)


On Fri, 05 Dec 2003, mast@lysator.liu.se wrote:

> Reading or writing are blocking operations, so they would be
> executed in parallel anyway.

Right, but if the read or write don't need to block the UI thread, why
should they?  Take for example auto-save files.  When I'm editing a
large document on a NFS filesystem, Emacs often will pause completely
while auto-saving the document.  If a separate thread or process could
auto-save the document while I could keep working, that would be very
nice.  It wouldn't add new functionality, but it would improve the
user experience.

> This is actually an argument against fine grained locking too: When
> much code contend for the same resources and those are covered by
> many small locks, much time will be spent in context switching due
> to outlocking.

Yes, this is why Solaris is so slow on single-processor machines also.
Fine-grained locking exacts a baseline penalty.  Multi-threading may
need to be a completely separate branch of Emacs, if it ever happens.

Ted

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-05  8:58                             ` Are there plans for a multi-threaded Emacs? Thien-Thi Nguyen
  2003-12-05 11:58                               ` Ted Zlatanov
@ 2003-12-05 12:12                               ` Ted Zlatanov
  2003-12-05 20:37                                 ` Luke A. Olbrish
  1 sibling, 1 reply; 133+ messages in thread
From: Ted Zlatanov @ 2003-12-05 12:12 UTC (permalink / raw)


On 05 Dec 2003, ttn@glug.org wrote:

> Ted Zlatanov <tzz@lifelogs.com> writes:
> 
>    Plus, I am pretty sure that when an application uses N processors
>    instead of one (as Emacs might with true preemptive
>    multithreading)
> 
> perhaps you still don't understand the root problem: "true
> preemptive multithreading" requires a certain program architecture
> to take advantage of it (including but not limited to: how the
> functions are written, placement of data, access patterns to the
> data, external interface requirements).  if emacs does not have this
> particular nature, force-fitting it to make it so is a royal PITA.
> if you don't force-fit it, you will never get the true preemptive
> multithreading "experience".

You and Stefan are right, I generalized too much.  I meant a specific
type of application, and I think Emacs can be such.  I've given
several examples of cases where multithreading or any sort of
multitasking would help, and I've repeatedly explained why I think
lightweight threads instead of heavyweight threads would be better
(because of the tight coupling of applications and functions inside
Emacs).  I think preemptive threading in particular will be the most
useful implementation, but cooperative multithreading is a valid
solution as well.

Ted

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-04 22:49                             ` Stefan Monnier
@ 2003-12-05 12:17                               ` Ted Zlatanov
  2003-12-05 13:06                                 ` Thien-Thi Nguyen
                                                   ` (2 more replies)
  0 siblings, 3 replies; 133+ messages in thread
From: Ted Zlatanov @ 2003-12-05 12:17 UTC (permalink / raw)


On 04 Dec 2003, monnier@iro.umontreal.ca wrote:

>> take too long.  I understand all this can be hacked into place, but
>> is it really necessary to avoid multithreading so desperately?
> 
> Nobody is avoiding it here.  We're just explaining to you why nobody
> bothered to do it yet and why none of us feels the urge to do it:
> lots of work, unclear payoff.

I was referring to hacking things into place in that particular
example, where multithreading seemed like a natural approach, not the
attitude of this group.  Sorry if it seemed otherwise.  The attitude
of this group of developers is wonderful.

>> Plus, I am pretty sure that when an application uses N processors
>> instead of one (as Emacs might with true preemptive multithreading)
>> there is at least some speed improvement.
> 
> Your being pretty sure does not magically eliminate all the known
> counter examples.

You're right.  I had specific applications in mind, not any general
application.  In the general case that is not necessarily true,
because not all applications can take advantage of multithreading of
course.  I think that Emacs in particular can use it right now, and
that applications will develop in time that will take full advantage
of multithreading.

>> (Xeons).  I don't have benchmarks, sorry, but at least on Solaris
>> the performance of a machine increases by at least 80% with each
>> additional SPARC processor.
> 
> Such naive sweeping claims would tend to ruin your credibility, I'm
> afraid.

OK, here's some Novell benchmarks that show significant increases in
performance with additional processors in Solaris in a particular
application (LDAP server):

http://www.novell.com/info/collateral/docs/4621167.01/4621167.html

I work with Solaris for a living, so I feel justified in making that
claim based on what I know - years of experience, Sun's published
benchmarks, vendors' benchmarks.  I think you'll find that Solaris
specifically is known to scale very well with additional processors,
at the penalty of being pretty slow on a single-processor machine.

The Linux kernel (2.5 especially), to give another example, scales
well with additional processors too, even when hyper-threading instead
of a real additional processor is used.  See this article for an
overview and benchmarks:

http://www-106.ibm.com/developerworks/linux/library/l-htl/

Note I did not say that an *application's* performance increases by at
least 80%.  The machine's performance, given processes or threads
within them that can be effectively run on separate processors by the
OS scheduler, is what increases.  This is generally understood but
perhaps my language was not clear enough.

> Yes, things can be made to work well, but do you have an idea of the
> amount of work it takes to do that ?

Specifically in the context of Emacs, I do not know the internals well
enough to judge that.  I hope I can help with the work in any way I
can, no matter what the eventual "multithreading or not" decision is.

Ted

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-05 12:17                               ` Ted Zlatanov
@ 2003-12-05 13:06                                 ` Thien-Thi Nguyen
  2003-12-05 14:44                                 ` David Kastrup
  2003-12-07 23:55                                 ` Stefan Monnier
  2 siblings, 0 replies; 133+ messages in thread
From: Thien-Thi Nguyen @ 2003-12-05 13:06 UTC (permalink / raw)
  Cc: emacs-devel

Ted Zlatanov <tzz@lifelogs.com> writes:

   Specifically in the context of Emacs, I do not know the internals
   well enough to judge that.  I hope I can help with the work in any
   way I can, no matter what the eventual "multithreading or not"
   decision is.

the decision is made by whoever does the work, so if you decide to do
it, you need to research the internals (such as by participating in this
thread :-).  so far so good.  it seems to me you are on the right track
even if you don't know how far it is to the station...

personally, i would like to see a "multi-threaded emacs" page on the
emacs wiki where thoughts and links to thoughts can accumulate [surf
surf] wow -- even as i ponder this, there is already such a page!  so,
it is now up to you to practice your organizational skills.  the
question is not "why should it be done?" but "who will do it?"

thi

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-05 12:06                         ` Ted Zlatanov
@ 2003-12-05 13:16                           ` Martin Stjernholm
  2003-12-05 21:30                             ` Ted Zlatanov
  2003-12-05 14:46                           ` David Kastrup
  1 sibling, 1 reply; 133+ messages in thread
From: Martin Stjernholm @ 2003-12-05 13:16 UTC (permalink / raw)
  Cc: emacs-devel

Ted Zlatanov <tzz@lifelogs.com> wrote:

> On Fri, 05 Dec 2003, mast@lysator.liu.se wrote:
>
>> Reading or writing are blocking operations, so they would be
>> executed in parallel anyway.
>
> Right, but if the read or write don't need to block the UI thread, why
> should they?

I didn't say they should, rather the opposite. Maybe I wasn't entirely
clear: They would be executed in parallel even with the single lock
approach.

Emacs would handle each event in a different thread (using a thread
pool, probably, since starting threads often aren't cheap) so that the
main thread always remains idle and can respond to new events. Due to
the single lock, there would still be no concurrency problems in code
that isn't adapted.

It's just a matter of reviewing the most important places doing
blocking I/O and turn on unlocked operation there (if it isn't turned
on by default). Note that only the actual system call is run unlocked,
so no surrounding C or elisp code needs to be adapted with locks. What
needs to be done in the review is to add code that rechecks the state
afterwards and fails gracefully if it has changed too much.

A nice thing is that this is opt-in; there's no need to go through and
thread safe everything - even if it only is enabled in a few common
places there's an improvement in responsiveness.

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-04 20:18                     ` Ted Zlatanov
  2003-12-04 23:00                       ` Martin Stjernholm
@ 2003-12-05 13:56                       ` Benjamin Riefenstahl
  2003-12-05 21:33                         ` non-blocking auto-save (was: Are there plans for a multi-threaded Emacs?) Ted Zlatanov
  1 sibling, 1 reply; 133+ messages in thread
From: Benjamin Riefenstahl @ 2003-12-05 13:56 UTC (permalink / raw)
  Cc: emacs-devel

Hi Ted,


Just an immediate reaction to your examples:

Ted Zlatanov <tzz@lifelogs.com> writes:
> font-locking a buffer;

Isn't font-locking done in parallel (in a cooperative manner) already
with lazy-lock?

> reading or writing a file.

Reading, yes, but writing, I'm not so sure.  I think usually I want to
be sure that a file is completely written, before I start some other
action.

Also I'm sure that both reading and writing can be done asynchronously
without having all of Emacs being multi-threaded.  Even if you don't
have support from the OS this can be implemented with cooperative
means, just reading/writing reasonable chunks during idle time.


benny

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-05 12:17                               ` Ted Zlatanov
  2003-12-05 13:06                                 ` Thien-Thi Nguyen
@ 2003-12-05 14:44                                 ` David Kastrup
  2003-12-07 23:55                                 ` Stefan Monnier
  2 siblings, 0 replies; 133+ messages in thread
From: David Kastrup @ 2003-12-05 14:44 UTC (permalink / raw)
  Cc: emacs-devel

Ted Zlatanov <tzz@lifelogs.com> writes:

> On 04 Dec 2003, monnier@iro.umontreal.ca wrote:

[...]

> >> (Xeons).  I don't have benchmarks, sorry, but at least on Solaris
> >> the performance of a machine increases by at least 80% with each
> >> additional SPARC processor.
> > 
> > Such naive sweeping claims would tend to ruin your credibility,
> > I'm afraid.
> 
> OK, here's some Novell benchmarks that show significant increases in
> performance with additional processors in Solaris in a particular
> application (LDAP server):
> 
> http://www.novell.com/info/collateral/docs/4621167.01/4621167.html
> 
> I work with Solaris for a living, so I feel justified in making that
> claim based on what I know - years of experience, Sun's published
> benchmarks, vendors' benchmarks.

Sun would hardly publish benchmarks centered around applications that
don't gain from multithreading/multitasking.

We are not talking about an LDAP server, but Emacs.  Ironically,
using applications like preview-latex or in general comint-mode,
Emacs will show _vast_ speed improvements (decidedly more than 100%)
under multiprocessor machines for most operating systems, and the
reason is a scheduling anomaly for almost all operating systems on
single processor machines that keeps pipes from getting more than
minimal fill levels: as soon as there is something in the pipe, the
pipe filling process gets starved from CPU, and so even a tight loop
of
  for (;;) write(1,"\n",1);
will never manage to get more than a single character processed by
Emacs' filter functions.  With a multiple CPU box, this does not
happen as the pipe fills even while Emacs is processing the last bit.

I have gotten real time speed improvements even by starting a
completely useless busy loop that would get the scheduler involved
more often than when Emacs and the comint-run application where just
passing the CPU among each other.

So here you have a situation where a two-processor machine will
increase speed by decidedly more than 100%, and that even without
Emacs itself being multithreading.  I'd be careful about just what
conclusions to draw from this.

Similar from Solaris benchmarks.

> Note I did not say that an *application's* performance increases by
> at least 80%.  The machine's performance, given processes or threads
> within them that can be effectively run on separate processors by
> the OS scheduler, is what increases.  This is generally understood
> but perhaps my language was not clear enough.
> 
> Specifically in the context of Emacs, I do not know the internals
> well enough to judge that.  I hope I can help with the work in any
> way I can, no matter what the eventual "multithreading or not"
> decision is.

My personal opinion is that the Lisp machine would need to get
reorganized significantly to even get a modicum of advantage.  And
that implies, among others, a clean separation between global entities
and locally bound entities that I don't see usefully implemented
without lexical binding.  I may sound as though I was riding a hobby
horse here, but I am not involved in that work, and while I consider
it an issue of architectural cleanliness, I have my doubts about the
feasability of change here.  The longer it is postponed, the more
painful a change will get.  And a change in there would bear quite
more consequences to existing Lisp files than, say, the current
garbage collector and memory layout changes.

One may be able to duct tape some measure of multithreading even on
top of pervasive dynamic binding, but to be honest, I fear the
outcome.

-- 
David Kastrup, Kriemhildstr. 15, 44793 Bochum

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-05 12:06                         ` Ted Zlatanov
  2003-12-05 13:16                           ` Martin Stjernholm
@ 2003-12-05 14:46                           ` David Kastrup
  2003-12-05 15:07                             ` Martin Stjernholm
  1 sibling, 1 reply; 133+ messages in thread
From: David Kastrup @ 2003-12-05 14:46 UTC (permalink / raw)
  Cc: emacs-devel

Ted Zlatanov <tzz@lifelogs.com> writes:

> On Fri, 05 Dec 2003, mast@lysator.liu.se wrote:
> 
> > Reading or writing are blocking operations, so they would be
> > executed in parallel anyway.
> 
> Right, but if the read or write don't need to block the UI thread,
> why should they?  Take for example auto-save files.  When I'm
> editing a large document on a NFS filesystem, Emacs often will pause
> completely while auto-saving the document.  If a separate thread or
> process could auto-save the document while I could keep working,
> that would be very nice.  It wouldn't add new functionality, but it
> would improve the user experience.

And just version of the buffer would it autosave when I was allowed to
edit the file _while_ it was saving it?

-- 
David Kastrup, Kriemhildstr. 15, 44793 Bochum

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-05 14:46                           ` David Kastrup
@ 2003-12-05 15:07                             ` Martin Stjernholm
  0 siblings, 0 replies; 133+ messages in thread
From: Martin Stjernholm @ 2003-12-05 15:07 UTC (permalink / raw)
  Cc: Ted Zlatanov, emacs-devel

David Kastrup <dak@gnu.org> wrote:

> And just version of the buffer would it autosave when I was allowed to
> edit the file _while_ it was saving it?

Does it matter? Buffer changes aren't transaction based anyway. For
recovery purposes, it'd be enough if a block of a suitable size, say
256 kb or so, was copied from the buffer to be written asynchronously,
and a marker is used keep track of the position for the next block.

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-05 12:12                               ` Ted Zlatanov
@ 2003-12-05 20:37                                 ` Luke A. Olbrish
  2003-12-05 21:45                                   ` Ted Zlatanov
  2003-12-08  0:10                                   ` Stefan Monnier
  0 siblings, 2 replies; 133+ messages in thread
From: Luke A. Olbrish @ 2003-12-05 20:37 UTC (permalink / raw)
  Cc: emacs-devel

Ted Zlatanov <tzz@lifelogs.com> writes:

> You and Stefan are right, I generalized too much.  I meant a specific
> type of application, and I think Emacs can be such.  I've given
> several examples of cases where multithreading or any sort of
> multitasking would help, and I've repeatedly explained why I think
> lightweight threads instead of heavyweight threads would be better
> (because of the tight coupling of applications and functions inside
> Emacs).  I think preemptive threading in particular will be the most
> useful implementation, but cooperative multithreading is a valid
> solution as well.

Lightweight threads versus heavyweight threads?  By lightweight do you
mean user space threads or green threads?  They tend to only provide a
nice abstraction for certain applications, as the operating system
will block the process if any of the user space threads block.  There
is significant evidence to show that event driven models are quite
efficient for single processor machines.  Read the paper: "Flash: an
Efficient and Portable Web Server".  The creators implement an event
driven model for web serving and get significantly better performance
than staple web servers like apache.  Even lightweight threads have
associated baggage with threading and it seems like people think
threading will magically create more processing power.

If you mean lightweight threads in the sense of a general OS
development trend to make OS threading more of a lightweight
operation, then its OS specific and independent of emacs.

-- 
Luke Anthony Olbrish
<luke.olbrish@cc.gatech.edu>

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-05 13:16                           ` Martin Stjernholm
@ 2003-12-05 21:30                             ` Ted Zlatanov
  0 siblings, 0 replies; 133+ messages in thread
From: Ted Zlatanov @ 2003-12-05 21:30 UTC (permalink / raw)


I think your plan sounds reasonable, and it's definitely less
disruptive of existing practices.

Ted

^ permalink raw reply	[flat|nested] 133+ messages in thread

* non-blocking auto-save (was: Are there plans for a multi-threaded Emacs?)
  2003-12-05 13:56                       ` Benjamin Riefenstahl
@ 2003-12-05 21:33                         ` Ted Zlatanov
  0 siblings, 0 replies; 133+ messages in thread
From: Ted Zlatanov @ 2003-12-05 21:33 UTC (permalink / raw)


On Fri, 05 Dec 2003, Benjamin.Riefenstahl@epost.de wrote:

> Also I'm sure that both reading and writing can be done
> asynchronously without having all of Emacs being multi-threaded.
> Even if you don't have support from the OS this can be implemented
> with cooperative means, just reading/writing reasonable chunks
> during idle time.

OK, that would be a very nice feature then if auto-save could be
non-blocking.  Can this be done with the current Emacs feature set?

Thanks
Ted

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-05 20:37                                 ` Luke A. Olbrish
@ 2003-12-05 21:45                                   ` Ted Zlatanov
  2003-12-08  0:10                                   ` Stefan Monnier
  1 sibling, 0 replies; 133+ messages in thread
From: Ted Zlatanov @ 2003-12-05 21:45 UTC (permalink / raw)


On Fri, 05 Dec 2003, luke.olbrish@cc.gatech.edu wrote:

> If you mean lightweight threads in the sense of a general OS
> development trend to make OS threading more of a lightweight
> operation, then its OS specific and independent of emacs.

I have always understood lightweight threads to be those that share
memory space, and heavyweight threads to be those that have a separate
memory space (data, stack, and heap) and are usually separate
processes.  I believe the current Emacs process sentinels allow
heavyweight threading.

Ted

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-11-17  4:29     ` Miles Bader
  2003-11-30 16:36       ` Kai Grossjohann
@ 2003-12-06 20:58       ` Kai Grossjohann
  2003-12-07  0:15         ` Thien-Thi Nguyen
  2003-12-07  4:16         ` Martin Stjernholm
  1 sibling, 2 replies; 133+ messages in thread
From: Kai Grossjohann @ 2003-12-06 20:58 UTC (permalink / raw)


Miles Bader <miles@lsi.nec.co.jp> writes:

> Consider a simple bit of elisp code:  (setq GLOBAL (cons 'x GLOBAL))
> In a pre-emptively threaded emacs, another thread could run between
> accessing GLOBAL and setting it.  Whoops.

Somebody suggested to avoid this by putting big locks around
everything and then to relax them.

I made the suggestion to "just" let the implementor of the new thread
code worry about such things: if you start a new thread then you're
responsible for letting it run code that doesn't access globals in
problematic ways.

Apparently, the big-lock suggestion is better, but why?

Kai

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-06 20:58       ` Kai Grossjohann
@ 2003-12-07  0:15         ` Thien-Thi Nguyen
  2003-12-07 14:52           ` Kai Grossjohann
  2003-12-07  4:16         ` Martin Stjernholm
  1 sibling, 1 reply; 133+ messages in thread
From: Thien-Thi Nguyen @ 2003-12-07  0:15 UTC (permalink / raw)
  Cc: emacs-devel

Kai Grossjohann <kai@emptydomain.de> writes:

   Apparently, the big-lock suggestion is better, but why?

because it is likely even new code will need to use old code, and if old
code is ignorant of the new conventions, you will have problems.  if new
conventions can be followed in a ways harmonious w/ the old code, you
are ok, but that is not guaranteed.  that is probably the impetus behind
the big-lock approach.

it is like implementing (or even simulating) a flip-flop (dig out your
introductory logic design book): order w/in the device matters although
it doesn't matter outside.

thi

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-06 20:58       ` Kai Grossjohann
  2003-12-07  0:15         ` Thien-Thi Nguyen
@ 2003-12-07  4:16         ` Martin Stjernholm
  2003-12-07 14:53           ` Kai Grossjohann
  1 sibling, 1 reply; 133+ messages in thread
From: Martin Stjernholm @ 2003-12-07  4:16 UTC (permalink / raw)
  Cc: emacs-devel

Kai Grossjohann <kai@emptydomain.de> wrote:

> Somebody suggested to avoid this by putting big locks around
> everything and then to relax them.

That was me, I guess.

> I made the suggestion to "just" let the implementor of the new thread
> code worry about such things: if you start a new thread then you're
> responsible for letting it run code that doesn't access globals in
> problematic ways.

Would a thread like that would be used from the elisp level?

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-07  0:15         ` Thien-Thi Nguyen
@ 2003-12-07 14:52           ` Kai Grossjohann
  2003-12-07 16:58             ` Thien-Thi Nguyen
  0 siblings, 1 reply; 133+ messages in thread
From: Kai Grossjohann @ 2003-12-07 14:52 UTC (permalink / raw)


Thien-Thi Nguyen <ttn@glug.org> writes:

> because it is likely even new code will need to use old code, and if old
> code is ignorant of the new conventions, you will have problems.  if new
> conventions can be followed in a ways harmonious w/ the old code, you
> are ok, but that is not guaranteed.  that is probably the impetus behind
> the big-lock approach.

I see.  Hm.  I thought that people "just" need to be careful which
"old code" they call.  And if the old code doesn't work, it would get
rewritten.

But I guess the big-lock suggestion leads to bad performance in
problematic cases, whereas my suggestion leads to wrong results in
problematic cases.  And bad performance is better than wrong results.

Kai

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-07  4:16         ` Martin Stjernholm
@ 2003-12-07 14:53           ` Kai Grossjohann
  2003-12-07 23:00             ` Martin Stjernholm
  0 siblings, 1 reply; 133+ messages in thread
From: Kai Grossjohann @ 2003-12-07 14:53 UTC (permalink / raw)


Martin Stjernholm <mast@lysator.liu.se> writes:

> Kai Grossjohann <kai@emptydomain.de> wrote:
>
>> Somebody suggested to avoid this by putting big locks around
>> everything and then to relax them.
>
> That was me, I guess.

Yes.  Sorry for forgetting your name, and I couldn't find the right
post in this huge thread.

>> I made the suggestion to "just" let the implementor of the new thread
>> code worry about such things: if you start a new thread then you're
>> responsible for letting it run code that doesn't access globals in
>> problematic ways.
>
> Would a thread like that would be used from the elisp level?

That was my idea.

Kai

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-07 14:52           ` Kai Grossjohann
@ 2003-12-07 16:58             ` Thien-Thi Nguyen
  0 siblings, 0 replies; 133+ messages in thread
From: Thien-Thi Nguyen @ 2003-12-07 16:58 UTC (permalink / raw)
  Cc: emacs-devel

Kai Grossjohann <kai@emptydomain.de> writes:

   I see.  Hm.  I thought that people "just" need to be careful which
   "old code" they call.  And if the old code doesn't work, it would get
   rewritten.

that's the theory, but in practice even the most simple pieces of new
code rely heavily on old code.  generally, this methodology exposes the
user to an indeterminate window where the extent and impact of the
changes to be made are unknown.  this may be acceptable but there is a
danger that the unknown becomes the permanently unknowable if no one
looks at it.  this is the problem (by design) w/ usloth and their
output, for example.

   But I guess the big-lock suggestion leads to bad performance in
   problematic cases, whereas my suggestion leads to wrong results in
   problematic cases.  And bad performance is better than wrong results.

that's a very succinct way to put it!

thi

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-07 14:53           ` Kai Grossjohann
@ 2003-12-07 23:00             ` Martin Stjernholm
  0 siblings, 0 replies; 133+ messages in thread
From: Martin Stjernholm @ 2003-12-07 23:00 UTC (permalink / raw)
  Cc: emacs-devel

Kai Grossjohann <kai@emptydomain.de> wrote:

>>> I made the suggestion to "just" let the implementor of the new thread
>>> code worry about such things: if you start a new thread then you're
>>> responsible for letting it run code that doesn't access globals in
>>> problematic ways.
>>
>> Would a thread like that be used from the elisp level?
>
> That was my idea.

I think a very sound design principle is to keep apart errors on
different implementation levels. I.e. bugs on a higher level shouldn't
have effects on a lower. E.g. if you make an elisp error, say moving
the point and changing the same buffer from two threads, you shouldn't
get an internally inconsistent buffer state which likely will cause
Emacs to dump core later on or disbehave in subtle ways (maybe some
markers get lost and simply cease to be kept up-to-date). The elisp
programmer would have a hard time tracking down an error like that,
and would probably report it as a bug in the core instead.

Another problem related to that is that the elisp programmer would
need to have extensive knowledge of the internals to know what would
be safe to do. For instance, all buffers are linked together, which
means there would probably be a race simply creating a new buffer from
a thread. That's not obvious to the elisp programmer - buffers appear
to be independent entities in elisp.

Also, it wouldn't only be a matter of adding a `create-thread' elisp
function and leave the rest to the elisp hacker. It'd still be
necessary to do away with the global state used directly by the
interpreter, e.g. the binding environment (which I've gathered is
global now). I.e. potentially a lot of global variables would have to
be moved to some thread state struct, and all the code that access
them must be updated accordingly. Something similar would of course be
necessary for the single lock solution too, but in that case it would
suffice to have swap functions that copies and restores the global
state from a thread state struct, so the code that uses global
variables wouldn't have to be changed.

I also suspect the garbage collector would be a problem if it isn't
inherently thread safe. It probably needs to have a lock that excludes
all other activities while it runs.

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-05 12:17                               ` Ted Zlatanov
  2003-12-05 13:06                                 ` Thien-Thi Nguyen
  2003-12-05 14:44                                 ` David Kastrup
@ 2003-12-07 23:55                                 ` Stefan Monnier
  2003-12-08 16:54                                   ` Ted Zlatanov
  2 siblings, 1 reply; 133+ messages in thread
From: Stefan Monnier @ 2003-12-07 23:55 UTC (permalink / raw)
  Cc: emacs-devel

>>> (Xeons).  I don't have benchmarks, sorry, but at least on Solaris
>>> the performance of a machine increases by at least 80% with each
>>> additional SPARC processor.
>> 
>> Such naive sweeping claims would tend to ruin your credibility, I'm
>> afraid.

> OK, here's some Novell benchmarks that show significant increases in
> performance with additional processors in Solaris in a particular
> application (LDAP server):

> http://www.novell.com/info/collateral/docs/4621167.01/4621167.html

> I work with Solaris for a living, so I feel justified in making that
> claim based on what I know - years of experience, Sun's published

Solaris is indeed fairly well designed w.r.t scalability (at the cost of
single-proc performance, of course).  But that only means that Solaris is
not an obstacle: it will not magically make your application scalable
unless your application was designed for it.

Making Emacs scalable is probably best done by starting all over
from scratch.  The current structure of the C code together with the
semantics of elisp means that it's about as far from scalable as you'll
ever get.

Now, that doesn't mean you can't do it, but just that it's going to be a lot
of work and it might introduce subtle incompatibilities, so you need a lot
of motivation to start the effort and you'll need really good arguments to
convince RMS that breaking compatibility is worth the pay off.  Now what is
the payoff ?  Speed.  Given the fact that elisp is known to be slow, and
that pretty much no work has been done to speed up Emacs in the last
N years, I get the impression that nobody really cares about speed here.

What people do care about a little is the "non-blocking thingy" which might
require some form of multithreading but does not require any kind of
scalability and does not require nearly as much work (and as much breakage
of backward compatibility).
So I'd recommend people start with this if they want to work on something
like that.  Once this is done, we might be able to start thinking about
scalability.


        Stefan

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-05 20:37                                 ` Luke A. Olbrish
  2003-12-05 21:45                                   ` Ted Zlatanov
@ 2003-12-08  0:10                                   ` Stefan Monnier
  2003-12-08  1:26                                     ` Luke A. Olbrish
  1 sibling, 1 reply; 133+ messages in thread
From: Stefan Monnier @ 2003-12-08  0:10 UTC (permalink / raw)
  Cc: Ted Zlatanov, emacs-devel

> efficient for single processor machines.  Read the paper: "Flash: an
> Efficient and Portable Web Server".  The creators implement an event
> driven model for web serving and get significantly better performance
> than staple web servers like apache.  Even lightweight threads have

Note that there's a reason why Apache does not use an event-driven approach:
it's a lot more painful to write.  So comparing performance of X with Apache
is kind of like comparing the performance of sed with the performance of
Emacs.  Except that some people do try to make Apache faster (even though
it's not the main focus of development, far from it), whereas noone does
that for Emacs.

So I think if we want some kind of parallelism, the most important aspect
for Emacs would be convenience of elisp coding rather than efficiency.


        Stefan


PS: by the way, single-proc multithreading using an event-driven model
    can be done (and is done) in Emacs with the current code-base.
    It's just inconvenient and thus little used.

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-08  0:10                                   ` Stefan Monnier
@ 2003-12-08  1:26                                     ` Luke A. Olbrish
  0 siblings, 0 replies; 133+ messages in thread
From: Luke A. Olbrish @ 2003-12-08  1:26 UTC (permalink / raw)
  Cc: emacs-devel

Stefan Monnier <monnier@iro.umontreal.ca> writes:

>> efficient for single processor machines.  Read the paper: "Flash: an
>> Efficient and Portable Web Server".  The creators implement an event
>> driven model for web serving and get significantly better performance
>> than staple web servers like apache.  Even lightweight threads have
>
> Note that there's a reason why Apache does not use an event-driven approach:
> it's a lot more painful to write.  So comparing performance of X with Apache
> is kind of like comparing the performance of sed with the performance of
> Emacs.  Except that some people do try to make Apache faster (even though
> it's not the main focus of development, far from it), whereas noone does
> that for Emacs.

My comments stem more from Ted's use of various thread implementation
keywords than the concept of threads.

It is very true that threading models tend to be more flexible than
event driven models.  Though I wonder if some more thought was put
into building an event driven paradigm for a language, if programmers
could often get what they want without resorting to threads.  Many
programmers do not know how to properly create threaded programs.
Ideally, a nice event driven mechanism and a nice threading mechanism
would exist and programmers would be free to choose the best paradigm
for their program.

> So I think if we want some kind of parallelism, the most important aspect
> for Emacs would be convenience of elisp coding rather than efficiency.

Well if we are going to get into a discussion of the convenience of
elisp, maybe its time to discuss dynamic scoping.  This would be a
personal peeve though and many mind find the willy-nilly identifier
capabilities of dynamic scoping to be convenient.

-- 
Luke Anthony Olbrish
<luke.olbrish@cc.gatech.edu>

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-07 23:55                                 ` Stefan Monnier
@ 2003-12-08 16:54                                   ` Ted Zlatanov
  2003-12-08 17:09                                     ` David Kastrup
  2003-12-08 18:25                                     ` What's the problem? (Was: Are there plans for a multi-threaded Emacs?) Luke Gorrie
  0 siblings, 2 replies; 133+ messages in thread
From: Ted Zlatanov @ 2003-12-08 16:54 UTC (permalink / raw)


On 07 Dec 2003, monnier@iro.umontreal.ca wrote:

> Making Emacs scalable is probably best done by starting all over
> from scratch.  The current structure of the C code together with the
> semantics of elisp means that it's about as far from scalable as
> you'll ever get.
> 
> Now, that doesn't mean you can't do it, but just that it's going to
> be a lot of work and it might introduce subtle incompatibilities, so
> you need a lot of motivation to start the effort and you'll need
> really good arguments to convince RMS that breaking compatibility is
> worth the pay off.  Now what is the payoff ?  Speed.  Given the fact
> that elisp is known to be slow, and that pretty much no work has
> been done to speed up Emacs in the last N years, I get the
> impression that nobody really cares about speed here.

I have faith that the applications will come, once the core supports
them.  Just think, for instance, of a mapcar that spreads out onto as
many processors as possible - doesn't that sound exciting?

In addition, I should point out that speed in itself is not my stated
goal.  Yes, maybe there will be some speed improvements, but that's
not what I've been asking for.  Multithreading makes software more
responsive to the user, especially if the UI thread can be separated
from the other threads.  Even if the software is actually slower, it
will serve the user better when it's more responsive, and it will seem
faster.  I'm generalizing quite a bit, but have you ever waited for a
web browser to load all the images before proceeding to use the web
page?  That's what using Emacs feels like sometimes, as wonderful as
it is.

That being said, I realize that asking the Emacs developers to drop
other work to write multi-threading support is a tough call, and I'm
not the one to make it.  I just hope the core developers get excited
enough about the possibilities that they will plan for some sort of
multithreading.

> What people do care about a little is the "non-blocking thingy"
> which might require some form of multithreading but does not require
> any kind of scalability and does not require nearly as much work
> (and as much breakage of backward compatibility).  So I'd recommend
> people start with this if they want to work on something like that.
> Once this is done, we might be able to start thinking about
> scalability.

I'm convinced, based on the many posts made, that the best way to
approach multithreading is slowly and incrementally.  I would not
dream of imposing any particular implementation, but it does seem that
most people prefer a single "main" thread and no preemption, since
those would preserve backwards compatibility best.

Ted

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-08 16:54                                   ` Ted Zlatanov
@ 2003-12-08 17:09                                     ` David Kastrup
  2003-12-08 18:10                                       ` Ted Zlatanov
  2003-12-08 22:02                                       ` Martin Stjernholm
  2003-12-08 18:25                                     ` What's the problem? (Was: Are there plans for a multi-threaded Emacs?) Luke Gorrie
  1 sibling, 2 replies; 133+ messages in thread
From: David Kastrup @ 2003-12-08 17:09 UTC (permalink / raw)
  Cc: emacs-devel

Ted Zlatanov <tzz@lifelogs.com> writes:

> On 07 Dec 2003, monnier@iro.umontreal.ca wrote:
> 
> > Now, that doesn't mean you can't do it, but just that it's going
> > to be a lot of work and it might introduce subtle
> > incompatibilities, so you need a lot of motivation to start the
> > effort and you'll need really good arguments to convince RMS that
> > breaking compatibility is worth the pay off.  Now what is the
> > payoff ?  Speed.  Given the fact that elisp is known to be slow,
> > and that pretty much no work has been done to speed up Emacs in
> > the last N years, I get the impression that nobody really cares
> > about speed here.
> 
> I have faith that the applications will come, once the core supports
> them.  Just think, for instance, of a mapcar that spreads out onto
> as many processors as possible - doesn't that sound exciting?

No.  We are talking about an editor here, not a number crunching
package.  One fundamental difference is that a vast majority of Emacs
Lisp constructs is _supposed_ to have side effects, in spite of being
written in a functional language.

> In addition, I should point out that speed in itself is not my
> stated goal.  Yes, maybe there will be some speed improvements, but
> that's not what I've been asking for.  Multithreading makes software
> more responsive to the user, especially if the UI thread can be
> separated from the other threads.  Even if the software is actually
> slower, it will serve the user better when it's more responsive, and
> it will seem faster.  I'm generalizing quite a bit, but have you
> ever waited for a web browser to load all the images before
> proceeding to use the web page?  That's what using Emacs feels like
> sometimes, as wonderful as it is.

Emacs is not a browser, it is an editor.  If I execute some keystrokes
that will mark a region and then press the delete key before the
operation that will mark the region actually has completed, I won't be
happy if it instead deletes what happens to be at the time marked by
something else.  I don't want Emacs to start executing keystrokes
before it has processed the previous keystrokes.  I _want_ Emacs in
general to process the things in the correct order when editing.

> That being said, I realize that asking the Emacs developers to drop
> other work to write multi-threading support is a tough call, and I'm
> not the one to make it.  I just hope the core developers get excited
> enough about the possibilities that they will plan for some sort of
> multithreading.

See above comment from Stefan.

-- 
David Kastrup, Kriemhildstr. 15, 44793 Bochum

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-08 17:09                                     ` David Kastrup
@ 2003-12-08 18:10                                       ` Ted Zlatanov
  2003-12-08 22:02                                       ` Martin Stjernholm
  1 sibling, 0 replies; 133+ messages in thread
From: Ted Zlatanov @ 2003-12-08 18:10 UTC (permalink / raw)


On 08 Dec 2003, dak@gnu.org wrote:

> We are talking about an editor here, not a number crunching package.

> Emacs is not a browser, it is an editor.

David, with all due respect, this is not correct.  Applications such
as Gnus (pretty heavy on arithmetic for article scoring, for instance)
and eshell make Emacs much more than an editor.  W3, which I'm sure
you are aware of, is a full-featured web browser.  There is a
spreadsheet package for Emacs.  Clearly, Emacs is being used for many
tasks, often at the same time.

> If I execute some keystrokes that will mark a region and then press
> the delete key before the operation that will mark the region
> actually has completed, I won't be happy if it instead deletes what
> happens to be at the time marked by something else.  I don't want
> Emacs to start executing keystrokes before it has processed the
> previous keystrokes.  I _want_ Emacs in general to process the
> things in the correct order when editing.

I agree with you.

Ted

^ permalink raw reply	[flat|nested] 133+ messages in thread

* What's the problem? (Was: Are there plans for a multi-threaded Emacs?)
  2003-12-08 16:54                                   ` Ted Zlatanov
  2003-12-08 17:09                                     ` David Kastrup
@ 2003-12-08 18:25                                     ` Luke Gorrie
  2003-12-08 19:56                                       ` Ted Zlatanov
                                                         ` (4 more replies)
  1 sibling, 5 replies; 133+ messages in thread
From: Luke Gorrie @ 2003-12-08 18:25 UTC (permalink / raw)


Ted Zlatanov <tzz@lifelogs.com> writes:

> I'm convinced, based on the many posts made, that the best way to
> approach multithreading is slowly and incrementally.

What's the biggest problem that threads are intended to solve?

Is it that it's too hard or ugly to write concurrent programs in Elisp
today? If so, what are some examples of bad cases that cause users
pain and _really_ can't be rewritten neatly and with happy concurrency
properties in plain old Elisp after some rethinking?

(Sorry if I have missed definitive examples earlier in the thread!)

People are writing concurrent programs in Elisp today. Most programs
interacting with external processes and sockets do so without blocking
Emacs. Can't we all just do the same?

Cheers,
Luke

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: What's the problem? (Was: Are there plans for a multi-threaded Emacs?)
  2003-12-08 18:25                                     ` What's the problem? (Was: Are there plans for a multi-threaded Emacs?) Luke Gorrie
@ 2003-12-08 19:56                                       ` Ted Zlatanov
  2003-12-08 20:56                                         ` David Kastrup
  2003-12-08 21:01                                         ` Stefan Monnier
  2003-12-08 19:57                                       ` What's the problem? Simon Josefsson
                                                         ` (3 subsequent siblings)
  4 siblings, 2 replies; 133+ messages in thread
From: Ted Zlatanov @ 2003-12-08 19:56 UTC (permalink / raw)


On 08 Dec 2003, luke@bluetail.com wrote:

> What's the biggest problem that threads are intended to solve?

(I'm talking about my own comments in this thread, and I'll try to
summarize things)

The interactive user experience, when tasks can be parallelized or
backgrounded, could be *improved.*  This is not a problem to be
solved, it's an incremental improvement from the user's viewpoint.

> Is it that it's too hard or ugly to write concurrent programs in
> Elisp today? If so, what are some examples of bad cases that cause
> users pain and _really_ can't be rewritten neatly and with happy
> concurrency properties in plain old Elisp after some rethinking?

Note I don't claim these can't be rewritten in a concurrent fashion.
I simply gave examples that could stand to be improved.  The majority
of examples are in Gnus, because that's the Elisp application I know
best.

- auto-save on a slow file system or through Tramp

- Gnus mail retrieval, summary thread building, registry lookups

- independent hashtable lookups and calculations in parallel would be
  a very nice improvement in themselves, and I'm sure there are many
  applications that can use them

> People are writing concurrent programs in Elisp today. Most programs
> interacting with external processes and sockets do so without
> blocking Emacs. Can't we all just do the same?

There seems to be interest in a real multithreading solution, be it
cooperative or preemptive, or an event-driven API.  I'm OK with any
solution as long as it improves the user experience, and I'll work
with whatever API is best.  I would like that API to exist, though,
and that doesn't seem to be the case with concurrency in Emacs
today.  Am I wrong?

If it appears from this thread that I have a particular interest in a
radical rewrite of Emacs, that is not true.  It just seems to me,
because of the tight internal coupling of Emacs functions and
variables, that lightweight threads would be a good choice for the
internal implementation of the API because they have less baggage
than process sentinels and share data more easily.  I also mentioned
that today's hardware and OS support for it generally means that
either multiple processors or the illusion of them is available to
applications that are willing to make use of those capabilities.

Ted

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: What's the problem?
  2003-12-08 18:25                                     ` What's the problem? (Was: Are there plans for a multi-threaded Emacs?) Luke Gorrie
  2003-12-08 19:56                                       ` Ted Zlatanov
@ 2003-12-08 19:57                                       ` Simon Josefsson
  2003-12-09 23:45                                         ` Juri Linkov
  2003-12-09 19:28                                       ` What's the problem? (Was: Are there plans for a multi-threaded Emacs?) Ted Zlatanov
                                                         ` (2 subsequent siblings)
  4 siblings, 1 reply; 133+ messages in thread
From: Simon Josefsson @ 2003-12-08 19:57 UTC (permalink / raw)
  Cc: emacs-devel

Luke Gorrie <luke@bluetail.com> writes:

> Ted Zlatanov <tzz@lifelogs.com> writes:
>
>> I'm convinced, based on the many posts made, that the best way to
>> approach multithreading is slowly and incrementally.
>
> What's the biggest problem that threads are intended to solve?
>
> Is it that it's too hard or ugly to write concurrent programs in Elisp
> today?

It is too hard and ugly to write concurrent programs in elisp today,
but that is not the only reason.

> If so, what are some examples of bad cases that cause users pain and
> _really_ can't be rewritten neatly and with happy concurrency
> properties in plain old Elisp after some rethinking?
>
> (Sorry if I have missed definitive examples earlier in the thread!)
>
> People are writing concurrent programs in Elisp today. Most programs
> interacting with external processes and sockets do so without blocking
> Emacs. Can't we all just do the same?

No.

I believe several examples have been given already, but the most
prominent I notice frequently is generating summary buffers in Gnus.
This is CPU bound.  Most of the time is NOT spent waiting from network
IO, even for 64kbps users, if you profile large groups.  It is spent
traversing internal data structures, sorting and filtering the
headers.  If this is done asynchronously, it would still lock up
Emacs.

Another example is getting new mail in Gnus.  This is probably more
network bound than CPU bound, but doing it asynchronously would still
lock up Emacs completely for many seconds, which is unacceptable.  If
you use Gnus as a offline reader, getting new mail may take minutes.

The most interesting examples doesn't exist, though, because people
have simply not implemented some ideas because of a lack of
multi-threaded support in Emacs.  If developers realized you could
have a background thread in Emacs doing various calculations and
giving the user feedback or interaction opportunities once in a while,
I'm sure we'd see many interesting add-on packages.  (SETI@Emacs?)

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: What's the problem? (Was: Are there plans for a multi-threaded Emacs?)
  2003-12-08 19:56                                       ` Ted Zlatanov
@ 2003-12-08 20:56                                         ` David Kastrup
  2003-12-08 22:09                                           ` Martin Stjernholm
  2003-12-08 21:01                                         ` Stefan Monnier
  1 sibling, 1 reply; 133+ messages in thread
From: David Kastrup @ 2003-12-08 20:56 UTC (permalink / raw)
  Cc: emacs-devel

Ted Zlatanov <tzz@lifelogs.com> writes:

> On 08 Dec 2003, luke@bluetail.com wrote:
> 
> > What's the biggest problem that threads are intended to solve?
> 
> Note I don't claim these can't be rewritten in a concurrent fashion.
> I simply gave examples that could stand to be improved.  The
> majority of examples are in Gnus, because that's the Elisp
> application I know best.

Have you already done the obvious thing of setting gnus-asynchronous
to a non-nil value?  That's the least one would expect from somebody
that wants parallelism that badly.

> - auto-save on a slow file system or through Tramp

So that if autosave starts saving a file and is half through when I
decide that the first half of the file is junk I won't need and delete
it, Emacs finds itself having saved more than enough material and
stops writing, never saving the remaining _important_ part of the
file?

You can't just throw in parallelism and hope that things will work
out somehow.

> - Gnus mail retrieval, summary thread building, registry lookups

Most of those can be controlled with gnus-asynchronous and
subordinate variables.

> - independent hashtable lookups and calculations in parallel would
>   be a very nice improvement in themselves,

Why?  What time-critical code performs them frequently?

> > People are writing concurrent programs in Elisp today. Most
> > programs interacting with external processes and sockets do so
> > without blocking Emacs. Can't we all just do the same?
> 
> There seems to be interest in a real multithreading solution, be it
> cooperative or preemptive, or an event-driven API.

The interest I have heard voiced so far has not been overly correlated
with intimate technical knowledge about the details involved and the
actual differences this would make for everyday work.

> If it appears from this thread that I have a particular interest in
> a radical rewrite of Emacs, that is not true.  It just seems to me,
> because of the tight internal coupling of Emacs functions and
> variables, that lightweight threads would be a good choice for the
> internal implementation of the API because they have less baggage
> than process sentinels and share data more easily.

And sharing data more easily is exactly what one can't afford in a
language with dynamic binding, since you get no closures whatsoever.
If I have something like

(let ((x (+ y 2)))
  do something)

then I can't afford to have some other thread change the meaning of x
in his own (let ((x ... construct.  If you want to afford a separate
binding stack for every thread, this also means that every _read_
_access_ to a symbol must run via the thread's binding stack instead
of just using the stack whenever the a binding _changes_.

And it is not only local variables that get temporarily bound: there
are common constructs like
(let ((process-connection-type nil)) [...])
where global variables get some value for some short duration.

> I also mentioned that today's hardware and OS support for it
> generally means that either multiple processors or the illusion of
> them is available to applications that are willing to make use of
> those capabilities.

Applications don't have a will of their own, even though it sometimes
may appear so.

-- 
David Kastrup, Kriemhildstr. 15, 44793 Bochum

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: What's the problem? (Was: Are there plans for a multi-threaded Emacs?)
  2003-12-08 19:56                                       ` Ted Zlatanov
  2003-12-08 20:56                                         ` David Kastrup
@ 2003-12-08 21:01                                         ` Stefan Monnier
  1 sibling, 0 replies; 133+ messages in thread
From: Stefan Monnier @ 2003-12-08 21:01 UTC (permalink / raw)
  Cc: emacs-devel

> There seems to be interest in a real multithreading solution, be it
> cooperative or preemptive, or an event-driven API.  I'm OK with any

The event-drive API is available right now (see process-filters and
run-with-idle-timer), but people don't like it too much.  Especially
writing background tasks using run-with-idle-timer is inconvenient.

The next step is to provide a simple multithreading model which will
simply allow the same as the current event-driven API but more conveniently
(i.e. something like cooperative multithreading, or even with a bit of
preemption, but probably all the switching done by hand in the elisp
interpreter: no concurrency inside the C code).

As for true parallelism, as I said the only use for it is speed, so I don't
see it as particularly important.  But maybe within 10-20 years things will
have changed a little.


        Stefan

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: Are there plans for a multi-threaded Emacs?
  2003-12-08 17:09                                     ` David Kastrup
  2003-12-08 18:10                                       ` Ted Zlatanov
@ 2003-12-08 22:02                                       ` Martin Stjernholm
  1 sibling, 0 replies; 133+ messages in thread
From: Martin Stjernholm @ 2003-12-08 22:02 UTC (permalink / raw)
  Cc: Ted Zlatanov, emacs-devel

David Kastrup <dak@gnu.org> wrote:

> /.../ If I execute some keystrokes that will mark a region and then
> press the delete key before the operation that will mark the region
> actually has completed, I won't be happy if it instead deletes what
> happens to be at the time marked by something else. /.../

That sounds like the first bug that would be fixed after a nonblocking
command loop has been implemented. It's hardly an argument against
such a thing in general. There are still many cases where the
responsiveness can be improved. Threads (or one-shot continuations, if
you like) often makes it easier to accomplish that, especially when it
comes to fixing old applications which are written with blocking
operations (since changing them to be event driven is more or less
turning them inside-out).

As for keyboard input, I don't think one ever wants to parallelize it,
not even when loading a large file or starting Gnus. It could however
be nice to put an executing command "in the background", just like you
can press C-z bg RET in a shell if you find that a command takes too
long. That'd be a really neat feature, actually.

Things that should run in the background by default are instead those
that are trigged by non-user activities, such as timers running out,
network traffic, and display redraws.


If a thread or continuation facitility is implemented, I have some
ideas for the elisp interface to make it comparatively easy to adapt
existing code to a reasonable degree of parallelism (not to be
confused with true multi-cpu parallelism). It's basically the idea
about buffer local threads discussed earlier in this discussion
thread, but outlined in more detail:

o  There are two kinds of locks: One for everything and one for each
   buffer's local data.(*)

o  There is a form similar to `interactive' that declares a function
   to be buffer local.

o  Events that preferably should run in the background (i.e. anything
   but input events from the user, afaics) check if the function being
   called is declared as buffer local.

o  Functions declared as buffer local are allowed to run until they
   access some buffer local data, and the lock for that buffer is then
   taken automatically.

o  The global lock is taken for other functions. That implies taking
   the buffer locks for all buffers. The functions will run just like
   today.

o  If only a buffer lock is taken, the function and all code it calls
   are allowed to change the buffer local data. Any attempt to change
   global data will give an error, but reading it is fine.

o  Whenever a buffer local function waits in blocking I/O or is
   preempted (cooperative multitasking isn't necessary), a function
   local to another buffer can run. This is the improvement. Given
   that almost all activities in Emacs are correlated to a single
   buffer, this should be a common situation.

The important points with this model are that it is free from all
possible deadlocks and races, and that it gives good errors which
makes it relatively easy to adapt existing code. To improve the
parallelism of a certain piece of code, simply declare the callback as
buffer local and then run until the global write error occurs.
Investigate the error and remove the global change. Repeat.

The byte compiler can already track call trees. With a bit of work it
could probably be extended to check for global writes from buffer
local functions at compile time.

The locking model can of course be refined further. Primitives should
be available to let the elisp programmer explicitly disable this
safety net and implement custom locking instead, at least to the
extent that several threads holds the same buffer lock (allowing it
for the global lock is more questionable).


*)  Note that these are elisp level locks; on the C level there can
    still be a single "everything" lock without sacrificing
    responsiveness, as has been discussed earlier. That would probably
    avoid considerable internal complexity since things aren't as well
    separated into buffer contexts there as they appear to be on the
    elisp level.

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: What's the problem? (Was: Are there plans for a multi-threaded Emacs?)
  2003-12-08 20:56                                         ` David Kastrup
@ 2003-12-08 22:09                                           ` Martin Stjernholm
  0 siblings, 0 replies; 133+ messages in thread
From: Martin Stjernholm @ 2003-12-08 22:09 UTC (permalink / raw)
  Cc: Ted Zlatanov, emacs-devel

David Kastrup <dak@gnu.org> wrote:

> So that if autosave starts saving a file and is half through when I
> decide that the first half of the file is junk I won't need and delete
> it, Emacs finds itself having saved more than enough material and
> stops writing, never saving the remaining _important_ part of the
> file?

That wouldn't happen if a marker is used to point to the beginning of
the unsaved part of the buffer.

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: What's the problem? (Was: Are there plans for a multi-threaded Emacs?)
  2003-12-08 18:25                                     ` What's the problem? (Was: Are there plans for a multi-threaded Emacs?) Luke Gorrie
  2003-12-08 19:56                                       ` Ted Zlatanov
  2003-12-08 19:57                                       ` What's the problem? Simon Josefsson
@ 2003-12-09 19:28                                       ` Ted Zlatanov
  2003-12-09 22:02                                         ` David Kastrup
  2003-12-09 19:32                                       ` Ted Zlatanov
  2003-12-10 15:16                                       ` Ted Zlatanov
  4 siblings, 1 reply; 133+ messages in thread
From: Ted Zlatanov @ 2003-12-09 19:28 UTC (permalink / raw)


On 08 Dec 2003, dak@gnu.org wrote:

> Ted Zlatanov <tzz@lifelogs.com> writes:
> 
>> Note I don't claim these can't be rewritten in a concurrent
>> fashion.  I simply gave examples that could stand to be improved.
>> The majority of examples are in Gnus, because that's the Elisp
>> application I know best.
> 
> Have you already done the obvious thing of setting gnus-asynchronous
> to a non-nil value?  That's the least one would expect from somebody
> that wants parallelism that badly.

I'm fairly familiar with Gnus.  gnus-asynchronous helps pre-fetch
articles, which is nice but tangential to the issues raised here.

> You can't just throw in parallelism and hope that things will work
> out somehow.

I was aware of that fact.

>> - Gnus mail retrieval, summary thread building, registry lookups
> 
> Most of those can be controlled with gnus-asynchronous and
> subordinate variables.

Only pre-fetching of articles, which is not the problem most of the
time.

>> - independent hashtable lookups and calculations in parallel would
>>   be a very nice improvement in themselves,
> 
> Why?  What time-critical code performs them frequently?

1) It's hard to write code that does parallel calculations when there
   is no API and no internal support.  Most current Emacs code would
   not use parallel calculations because if was not written with that
   in mind.  As you appropriately mention above, you can't just throw
   in parallelism, applications have to be written for it.

2) The improvement is incremental, for the user's benefit.  Emacs
   will not gain speed or simplicity, but users will gain improved
   responsiveness and will be happier using Emacs.

> If you want to afford a separate binding stack for every thread,
> this also means that every _read_ _access_ to a symbol must run via
> the thread's binding stack instead of just using the stack whenever
> the a binding _changes_.

So you're saying that it will slow down Emacs by using memory and CPU,
to manage the thread-local binding stack, correct?  I agree.

Ted

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: What's the problem? (Was: Are there plans for a multi-threaded Emacs?)
  2003-12-08 18:25                                     ` What's the problem? (Was: Are there plans for a multi-threaded Emacs?) Luke Gorrie
                                                         ` (2 preceding siblings ...)
  2003-12-09 19:28                                       ` What's the problem? (Was: Are there plans for a multi-threaded Emacs?) Ted Zlatanov
@ 2003-12-09 19:32                                       ` Ted Zlatanov
  2003-12-09 22:13                                         ` Stefan Monnier
  2003-12-10 15:16                                       ` Ted Zlatanov
  4 siblings, 1 reply; 133+ messages in thread
From: Ted Zlatanov @ 2003-12-09 19:32 UTC (permalink / raw)


On 08 Dec 2003, monnier@iro.umontreal.ca wrote:

> The event-drive API is available right now (see process-filters and
> run-with-idle-timer), but people don't like it too much.  Especially
> writing background tasks using run-with-idle-timer is inconvenient.

> The next step is to provide a simple multithreading model which will
> simply allow the same as the current event-driven API but more
> conveniently (i.e. something like cooperative multithreading, or
> even with a bit of preemption, but probably all the switching done
> by hand in the elisp interpreter: no concurrency inside the C code).

I would be glad to help with any of this, to the best of my
abilities.  Do you think it's better as a patch, separate branch, or
built into the core?  What can I do to help?

> As for true parallelism, as I said the only use for it is speed, so
> I don't see it as particularly important.  But maybe within 10-20
> years things will have changed a little.

In 10-20 years we'll all be running Emacs neural implants :)

Thanks
Ted

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: What's the problem? (Was: Are there plans for a multi-threaded Emacs?)
  2003-12-09 19:28                                       ` What's the problem? (Was: Are there plans for a multi-threaded Emacs?) Ted Zlatanov
@ 2003-12-09 22:02                                         ` David Kastrup
  2003-12-10  0:13                                           ` Stefan Monnier
  2003-12-10  0:45                                           ` Martin Stjernholm
  0 siblings, 2 replies; 133+ messages in thread
From: David Kastrup @ 2003-12-09 22:02 UTC (permalink / raw)
  Cc: emacs-devel

Ted Zlatanov <tzz@lifelogs.com> writes:

> On 08 Dec 2003, dak@gnu.org wrote:
> 
> > If you want to afford a separate binding stack for every thread,
> > this also means that every _read_ _access_ to a symbol must run
> > via the thread's binding stack instead of just using the stack
> > whenever the a binding _changes_.
> 
> So you're saying that it will slow down Emacs by using memory and
> CPU, to manage the thread-local binding stack, correct?  I agree.

Do you have an idea what figure we are speaking about here?  I repeat:
_every_ access to a symbol that now works directly instead has to work
via stack pointers.  And CPUs like the x86 do not have spare address
registers flying around.

We are quite probably talking about a _significant_ slowdown of the
Lisp machine here.

-- 
David Kastrup, Kriemhildstr. 15, 44793 Bochum

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: What's the problem? (Was: Are there plans for a multi-threaded Emacs?)
  2003-12-09 19:32                                       ` Ted Zlatanov
@ 2003-12-09 22:13                                         ` Stefan Monnier
  0 siblings, 0 replies; 133+ messages in thread
From: Stefan Monnier @ 2003-12-09 22:13 UTC (permalink / raw)
  Cc: emacs-devel

> I would be glad to help with any of this, to the best of my
> abilities.  Do you think it's better as a patch, separate branch, or
> built into the core?

I doubt RMS would accept it into the core without first seeing a patch
for it.  I'd recommend you create your own "arch branch" so you can extract
a patch for it later.  Ask Miles about how to use Arch to access the
Emacs repository.

> What can I do to help?

Get hacking.

> In 10-20 years we'll all be running Emacs neural implants :)

That's so old school.
I just use M-x esp RET


        Stefan

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: What's the problem?
  2003-12-08 19:57                                       ` What's the problem? Simon Josefsson
@ 2003-12-09 23:45                                         ` Juri Linkov
  2003-12-10  0:58                                           ` Simon Josefsson
  0 siblings, 1 reply; 133+ messages in thread
From: Juri Linkov @ 2003-12-09 23:45 UTC (permalink / raw)
  Cc: emacs-devel

Simon Josefsson <jas@extundo.com> writes:
> Luke Gorrie <luke@bluetail.com> writes:
>> People are writing concurrent programs in Elisp today. Most programs
>> interacting with external processes and sockets do so without blocking
>> Emacs. Can't we all just do the same?
>
> No.
>
> I believe several examples have been given already, but the most
> prominent I notice frequently is generating summary buffers in Gnus.
> This is CPU bound.  Most of the time is NOT spent waiting from network
> IO, even for 64kbps users, if you profile large groups.  It is spent
> traversing internal data structures, sorting and filtering the
> headers.  If this is done asynchronously, it would still lock up
> Emacs.

Many CPU bound tasks can be improved by memoizing computation results.
Since most cited here example is generating summary buffers in Gnus,
I want to note that this particular problem can be solved by storing
computed thread trees in files similar to `.marks' and `.overview'.
To keep track of computed results input parameters should be stored
along with computed data.

> Another example is getting new mail in Gnus.  This is probably more
> network bound than CPU bound, but doing it asynchronously would still
> lock up Emacs completely for many seconds, which is unacceptable.  If
> you use Gnus as a offline reader, getting new mail may take minutes.

Many tasks can be performed by external processes.  Getting new mail
shouldn't lock up Emacs when done by an external program like movemail.

> The most interesting examples doesn't exist, though, because people
> have simply not implemented some ideas because of a lack of
> multi-threaded support in Emacs.  If developers realized you could
> have a background thread in Emacs doing various calculations and
> giving the user feedback or interaction opportunities once in a while,
> I'm sure we'd see many interesting add-on packages.  (SETI@Emacs?)

I believe too that implementing multi-threaded support in Emacs
will create more possibilities for new and existing Emacs packages,
for instance, for such computation-intensive tasks as rendering
markup languages and for creating a better web browser in Emacs.

-- 
http://www.jurta.org/emacs/

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: What's the problem? (Was: Are there plans for a multi-threaded Emacs?)
  2003-12-09 22:02                                         ` David Kastrup
@ 2003-12-10  0:13                                           ` Stefan Monnier
  2003-12-10  1:41                                             ` David Kastrup
  2003-12-10  0:45                                           ` Martin Stjernholm
  1 sibling, 1 reply; 133+ messages in thread
From: Stefan Monnier @ 2003-12-10  0:13 UTC (permalink / raw)
  Cc: Ted Zlatanov, emacs-devel

> Do you have an idea what figure we are speaking about here?  I repeat:
> _every_ access to a symbol that now works directly instead has to work
> via stack pointers.  And CPUs like the x86 do not have spare address
> registers flying around.

I wouldn't worry too much about speed: there's lots of room for optimization
in the interpreter.  The problem I see is one of semantics because looking
up bindings in the stack doesn't seem to work so great when you take into
account interaction with buffer-local variables.
That is: it tends to give you subtly different semantics than the
current one.


        Stefan

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: What's the problem? (Was: Are there plans for a multi-threaded Emacs?)
  2003-12-09 22:02                                         ` David Kastrup
  2003-12-10  0:13                                           ` Stefan Monnier
@ 2003-12-10  0:45                                           ` Martin Stjernholm
  2003-12-10  2:55                                             ` Stefan Monnier
  1 sibling, 1 reply; 133+ messages in thread
From: Martin Stjernholm @ 2003-12-10  0:45 UTC (permalink / raw)
  Cc: Ted Zlatanov, emacs-devel

David Kastrup <dak@gnu.org> wrote:

> Do you have an idea what figure we are speaking about here?  I repeat:
> _every_ access to a symbol that now works directly instead has to work
> via stack pointers. /.../

Not necessarily. State swapping can be used if only a single thread is
running at a time. I have explained how such a "limited" solution
still can give a worthwhile improvement.


I haven't yet seen any response to those constructive contributions to
this discussion that motivates they would be infeasible or
meaningless. I truly believe I have proposed a viable solution, but
the lack of comment on it is disappointing.


> And CPUs like the x86 do not have spare address registers flying
> around.

Appearance can deceive. I've heard all reasonably modern x86 cpu:s
have quite a lot of registers. They're just not accessible through the
archaic machine code format, so elaborate register renaming algorithms
are used instead.

Not that I particularly advocate making the binding environment thread
local, for the pragmatic reason of the amount of code change I fear
would be involved.

> We are quite probably talking about a _significant_ slowdown of the
> Lisp machine here.

I'm not at all certain of that; cpu optimizations can slant these
things in unexpected directions. It wouldn't surprise me if an extra
indirection on the stack is faster than a global variable due to
better memory locality.

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: What's the problem?
  2003-12-09 23:45                                         ` Juri Linkov
@ 2003-12-10  0:58                                           ` Simon Josefsson
  2003-12-10  4:35                                             ` Miles Bader
  0 siblings, 1 reply; 133+ messages in thread
From: Simon Josefsson @ 2003-12-10  0:58 UTC (permalink / raw)
  Cc: emacs-devel

Juri Linkov <juri@jurta.org> writes:

> Simon Josefsson <jas@extundo.com> writes:
>> Luke Gorrie <luke@bluetail.com> writes:
>>> People are writing concurrent programs in Elisp today. Most programs
>>> interacting with external processes and sockets do so without blocking
>>> Emacs. Can't we all just do the same?
>>
>> No.
>>
>> I believe several examples have been given already, but the most
>> prominent I notice frequently is generating summary buffers in Gnus.
>> This is CPU bound.  Most of the time is NOT spent waiting from network
>> IO, even for 64kbps users, if you profile large groups.  It is spent
>> traversing internal data structures, sorting and filtering the
>> headers.  If this is done asynchronously, it would still lock up
>> Emacs.
>
> Many CPU bound tasks can be improved by memoizing computation results.
> Since most cited here example is generating summary buffers in Gnus,
> I want to note that this particular problem can be solved by storing
> computed thread trees in files similar to `.marks' and `.overview'.
> To keep track of computed results input parameters should be stored
> along with computed data.

Yes, it can be improved, but you are talking about caching.  It does
not remove the need to at some point compute the data stored in the
cache.  Then Gnus would look up, which I find unacceptable.

Furthermore, because a lot of what is done during preparing summary
buffers is dynamic, or almost so because it is influenced by hundreds
of user variables that may change over time, I'm not convinced caching
summary buffer data can be done reliable without great pain.  For me,
the summary buffer look different most time I enter it, because each
added or removed article in the group may change large parts of the
summary buffer to be recomputed (which I don't consider a bug).  It is
certainly easier to compute the summary buffer every time it is
needed, and use the user variables during that computation, than
reading from a cache and figure out what has to be re-computed given
the then-current user variables, and then re-compute the data and
store it in the cache.

>> Another example is getting new mail in Gnus.  This is probably more
>> network bound than CPU bound, but doing it asynchronously would still
>> lock up Emacs completely for many seconds, which is unacceptable.  If
>> you use Gnus as a offline reader, getting new mail may take minutes.
>
> Many tasks can be performed by external processes.  Getting new mail
> shouldn't lock up Emacs when done by an external program like movemail.

I meant parsing the new incoming articles and splitting them into the
proper group.  This is done in elisp.

If you profile Gnus with ELP, you see that the amount of time spent
waiting for external processes like movemail is not the biggest cause
of the lockups.  Most of it is spent evaluating elisp.  Even when
getting new mail.  So optimizing the movemail case to be asynchronous
would not improve the situation much, but will make it more difficult
to debug and troubleshoot Gnus.

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: What's the problem? (Was: Are there plans for a multi-threaded Emacs?)
  2003-12-10  0:13                                           ` Stefan Monnier
@ 2003-12-10  1:41                                             ` David Kastrup
  2003-12-10  2:49                                               ` Stefan Monnier
  0 siblings, 1 reply; 133+ messages in thread
From: David Kastrup @ 2003-12-10  1:41 UTC (permalink / raw)
  Cc: Ted Zlatanov, emacs-devel

Stefan Monnier <monnier@iro.umontreal.ca> writes:

> > Do you have an idea what figure we are speaking about here?  I
> > repeat: _every_ access to a symbol that now works directly instead
> > has to work via stack pointers.  And CPUs like the x86 do not have
> > spare address registers flying around.
> 
> I wouldn't worry too much about speed: there's lots of room for
> optimization in the interpreter.  The problem I see is one of
> semantics because looking up bindings in the stack doesn't seem to
> work so great when you take into account interaction with
> buffer-local variables.  That is: it tends to give you subtly
> different semantics than the current one.

Actually, considering the warnings in the manual about the necessary
orders of exception-catchers and buffer switches and let and similar,
I would expect that the different semantics would in most cases be
rather an advantage (and what the programmer would have expected
naively in the first place).  A basically static variable allocation
that gets saved and restored on a stack is more prone to surprising
side effects than a straightforward stack.

-- 
David Kastrup, Kriemhildstr. 15, 44793 Bochum

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: What's the problem? (Was: Are there plans for a multi-threaded Emacs?)
  2003-12-10  1:41                                             ` David Kastrup
@ 2003-12-10  2:49                                               ` Stefan Monnier
  2003-12-12  0:44                                                 ` Martin Stjernholm
  0 siblings, 1 reply; 133+ messages in thread
From: Stefan Monnier @ 2003-12-10  2:49 UTC (permalink / raw)
  Cc: Ted Zlatanov, emacs-devel

> Actually, considering the warnings in the manual about the necessary
> orders of exception-catchers and buffer switches and let and similar,
> I would expect that the different semantics would in most cases be
> rather an advantage (and what the programmer would have expected
> naively in the first place).  A basically static variable allocation
> that gets saved and restored on a stack is more prone to surprising
> side effects than a straightforward stack.

Yes, the semantics would be cleaner, but check the example I posted where
we rebind default-directory and switch back&forth between buffers: the
old semantics is odd but some code relies on it (basically using `let'
instead of `cd').


        Stefan

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: What's the problem? (Was: Are there plans for a multi-threaded Emacs?)
  2003-12-10  0:45                                           ` Martin Stjernholm
@ 2003-12-10  2:55                                             ` Stefan Monnier
  0 siblings, 0 replies; 133+ messages in thread
From: Stefan Monnier @ 2003-12-10  2:55 UTC (permalink / raw)
  Cc: Ted Zlatanov, David Kastrup, emacs-devel

> I haven't yet seen any response to those constructive contributions to
> this discussion that motivates they would be infeasible or
> meaningless. I truly believe I have proposed a viable solution, but
> the lack of comment on it is disappointing.

It's probably because most people just agree with the proposition
but don't care about implementing it.  At least that's my position.

> I'm not at all certain of that; cpu optimizations can slant these
> things in unexpected directions. It wouldn't surprise me if an extra
> indirection on the stack is faster than a global variable due to
> better memory locality.

That's always a possibility indeed.


        Stefan

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: What's the problem?
  2003-12-10  0:58                                           ` Simon Josefsson
@ 2003-12-10  4:35                                             ` Miles Bader
  2003-12-10  5:38                                               ` Simon Josefsson
  0 siblings, 1 reply; 133+ messages in thread
From: Miles Bader @ 2003-12-10  4:35 UTC (permalink / raw)
  Cc: Juri Linkov, emacs-devel

Simon Josefsson <jas@extundo.com> writes:
> If you profile Gnus with ELP, you see that the amount of time spent
> waiting for external processes like movemail is not the biggest cause
> of the lockups.  Most of it is spent evaluating elisp.  Even when
> getting new mail.

It depends on your environment of course -- if you have a slow network
connection (or a slow server), it can spend a _lot_ of time waiting for
external processes/data.

Personally I think making emacs generally multi-threaded is far more
trouble than it's worth, but in some cases like gnus, it would be worth
it to rewrite (small parts of) _that application_ to execute in the
background.  In my daily usage the main two places where I end up
waiting many minutes for emacs to finish something are (1) fetching my
daily mail into gnus via pop3.el, and (2) entering a newsgroup with many
unread messages on my home machine, which has a slow modem connection;
in both of these cases, the great majority of time is spent waiting for
data over the network.

Anyway my main point is that I think it's basically an application
issue, though emacs might help by adding helper functions.

-Miles
-- 
Love is a snowmobile racing across the tundra.  Suddenly it flips over,
pinning you underneath.  At night the ice weasels come.  --Nietzsche

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: What's the problem?
  2003-12-10  4:35                                             ` Miles Bader
@ 2003-12-10  5:38                                               ` Simon Josefsson
  2003-12-10  5:51                                                 ` Miles Bader
                                                                   ` (4 more replies)
  0 siblings, 5 replies; 133+ messages in thread
From: Simon Josefsson @ 2003-12-10  5:38 UTC (permalink / raw)
  Cc: Juri Linkov, emacs-devel

Miles Bader <miles@lsi.nec.co.jp> writes:

> Simon Josefsson <jas@extundo.com> writes:
>> If you profile Gnus with ELP, you see that the amount of time spent
>> waiting for external processes like movemail is not the biggest cause
>> of the lockups.  Most of it is spent evaluating elisp.  Even when
>> getting new mail.
>
> It depends on your environment of course -- if you have a slow network
> connection (or a slow server), it can spend a _lot_ of time waiting for
> external processes/data.

Right, with emphasis on _can_.

> Personally I think making emacs generally multi-threaded is far more
> trouble than it's worth, but in some cases like gnus, it would be worth
> it to rewrite (small parts of) _that application_ to execute in the
> background.

For me, this wouldn't solve the problem (CPU bound summary
computations).  For you, on a slow connection, it would solve your
problem (IO bound network access).  There is nothing that says we
can't do both.  (Except that none of us appear to be doing anything
but talking... :-))

> Anyway my main point is that I think it's basically an application
> issue, though emacs might help by adding helper functions.

I don't see how fixing my perceived problem can be done without some
kind of threading support in Emacs (co-operative or whatever).  Hence,
helper functions would do more than just help, they are critical in
improving the application.

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: What's the problem?
  2003-12-10  5:38                                               ` Simon Josefsson
@ 2003-12-10  5:51                                                 ` Miles Bader
  2003-12-10  6:34                                                   ` Simon Josefsson
  2003-12-10 15:36                                                 ` Ted Zlatanov
                                                                   ` (3 subsequent siblings)
  4 siblings, 1 reply; 133+ messages in thread
From: Miles Bader @ 2003-12-10  5:51 UTC (permalink / raw)
  Cc: emacs-devel

Simon Josefsson <jas@extundo.com> writes:
> > It depends on your environment of course -- if you have a slow network
> > connection (or a slow server), it can spend a _lot_ of time waiting for
> > external processes/data.
> 
> Right, with emphasis on _can_.

At least for me, this is an issue every single day; the CPU-bound parts
of summary generation &c are slightly annoying, but really not enough to
warrant any massive rewriting -- on the order of 30s or so for a large
newsgroup -- but IO-bound delays can be 10 _minutes_.  I don't know what
it's like for other people.

> > Anyway my main point is that I think it's basically an application
> > issue, though emacs might help by adding helper functions.
> 
> I don't see how fixing my perceived problem can be done without some
> kind of threading support in Emacs (co-operative or whatever).  Hence,
> helper functions would do more than just help, they are critical in
> improving the application.

What I'm trying to say is that the `threading support' need not be
particularly good, or general-purpose.  Probably something could be
hacked up right _now_, without any additional core functions, using
clever programming and emacs timers, by changing the worst-offending
part of the gnus code into something event driven.

-Miles
-- 
Run away!  Run away!

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: What's the problem?
  2003-12-10  5:51                                                 ` Miles Bader
@ 2003-12-10  6:34                                                   ` Simon Josefsson
  2003-12-10  7:19                                                     ` Miles Bader
  2003-12-10  8:18                                                     ` Eli Zaretskii
  0 siblings, 2 replies; 133+ messages in thread
From: Simon Josefsson @ 2003-12-10  6:34 UTC (permalink / raw)
  Cc: Juri Linkov, emacs-devel

Miles Bader <miles@lsi.nec.co.jp> writes:

> Simon Josefsson <jas@extundo.com> writes:
>> > It depends on your environment of course -- if you have a slow network
>> > connection (or a slow server), it can spend a _lot_ of time waiting for
>> > external processes/data.
>> 
>> Right, with emphasis on _can_.
>
> At least for me, this is an issue every single day; the CPU-bound parts
> of summary generation &c are slightly annoying, but really not enough to
> warrant any massive rewriting -- on the order of 30s or so for a large
> newsgroup -- but IO-bound delays can be 10 _minutes_.  I don't know what
> it's like for other people.

I'm using the Agent in recent Gnus, so almost all data is locally
cached (except for flag updates via IMAP and new-mail checks in NNTP),
so for me the delays I see are mostly CPU bound.

>> > Anyway my main point is that I think it's basically an application
>> > issue, though emacs might help by adding helper functions.
>> 
>> I don't see how fixing my perceived problem can be done without some
>> kind of threading support in Emacs (co-operative or whatever).  Hence,
>> helper functions would do more than just help, they are critical in
>> improving the application.
>
> What I'm trying to say is that the `threading support' need not be
> particularly good, or general-purpose.  Probably something could be
> hacked up right _now_, without any additional core functions, using
> clever programming and emacs timers, by changing the worst-offending
> part of the gnus code into something event driven.

I don't understand.  How would making the summary buffer generation
asynchronous stop Emacs from locking up during computations?  For me,
the summary buffer generation is CPU bound in elisp, not IO bound.
Same for getting new mail into the agent, it can take 2-3 minutes with
only a fraction of the time spent in IO (yes, it is not optimized).

I agree doing what you suggest would improve your problem, and making
Gnus more asynchronous would be useful (patches welcome!), but I don't
see how it is relevant to stopping the lockups when processing data.

I think there are two separate problems here.  They can and need to be
solved individually.

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: What's the problem?
  2003-12-10  6:34                                                   ` Simon Josefsson
@ 2003-12-10  7:19                                                     ` Miles Bader
  2003-12-11 14:12                                                       ` Stefan Monnier
  2003-12-10  8:18                                                     ` Eli Zaretskii
  1 sibling, 1 reply; 133+ messages in thread
From: Miles Bader @ 2003-12-10  7:19 UTC (permalink / raw)
  Cc: emacs-devel

Simon Josefsson <jas@extundo.com> writes:
> I'm using the Agent in recent Gnus, so almost all data is locally
> cached (except for flag updates via IMAP and new-mail checks in NNTP),
> so for me the delays I see are mostly CPU bound.

Not sure about agent mode -- the last time I tried it, it was so
completely awful that I quickly stopped.

> > What I'm trying to say is that the `threading support' need not be
> > particularly good, or general-purpose.  Probably something could be
> > hacked up right _now_, without any additional core functions, using
> > clever programming and emacs timers, by changing the worst-offending
> > part of the gnus code into something event driven.
> 
> I don't understand.  How would making the summary buffer generation
> asynchronous stop Emacs from locking up during computations?  For me,
> the summary buffer generation is CPU bound in elisp, not IO bound.

Yes, I understand.  I'd guess that a typical very long computation in
gnus is probably in the form of loops that do something fairly simple
many, many times, with other shorter calculations between them.  So
you'd like gnus to somehow yield cpu time for the user every iteration,
or every 100 iterations, or something like that.  In a cooperative
multi-tasking system, you'd just stick in a (yield) or something, but in
emacs this would be very hard to support.

So, instead, lets say you have a function like:

   (define gnus-fill-in-summary-buffer (...)
     (let (...some bindings...)
       (do-some-fairly-quick-calculation)
       (dolist (var1 potentially-big-long-list-1)
         ...something-1...)
       (dolist (var2 potentially-big-long-list)
         ...something-2...)))

change it into something like:

   (define gnus-fill-in-summary-buffer (...)
     (let ((some-state ...))
       (do-some-fairly-quick-calculation)
       (with-background-queue (bgq some-state)
         (bgq-dolist (var1 potentially-big-long-list-1 bgq)
            ...something-1...)
         (bgq-dolist (var2 potentially-big-long-list-2 bgq)
            ...something-2...))))

where `with-background-queue' and `bgq-dolist' (1) just package up their
body code into lambda(s), [effectively] shove them on the end of some
queue in bgq, and return immediately, and (2) explicitly refuse to make
any guarantees about non-global bindings; the value here called
`some-state' is stashed away in bgq somewhere, and can be used to
communicate values internal to the calculation.

IOW, it's annoying for the gnus programmer, but very easy for the emacs
implementation.

Some questions are (1) are there only a few points within gnus that
represent most of the annoying delays (2) do these places have fairly
simple code structures that could be split up into pieces like the above
example, and (3) do these pieces not depend on the long-term consistency
of any global state.

> I think there are two separate problems here.  They can and need to be
> solved individually.

I don't know.  A framework like the above could pretty simply handle the
I/O bound portion too, though.

-Miles
-- 
`To alcohol!  The cause of, and solution to,
 all of life's problems' --Homer J. Simpson

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: What's the problem?
  2003-12-10  6:34                                                   ` Simon Josefsson
  2003-12-10  7:19                                                     ` Miles Bader
@ 2003-12-10  8:18                                                     ` Eli Zaretskii
  2003-12-11 14:45                                                       ` Richard Stallman
  1 sibling, 1 reply; 133+ messages in thread
From: Eli Zaretskii @ 2003-12-10  8:18 UTC (permalink / raw)
  Cc: juri

> From: Simon Josefsson <jas@extundo.com>
> Date: Wed, 10 Dec 2003 07:34:45 +0100
> >
> > What I'm trying to say is that the `threading support' need not be
> > particularly good, or general-purpose.  Probably something could be
> > hacked up right _now_, without any additional core functions, using
> > clever programming and emacs timers, by changing the worst-offending
> > part of the gnus code into something event driven.
> 
> I don't understand.  How would making the summary buffer generation
> asynchronous stop Emacs from locking up during computations?  For me,
> the summary buffer generation is CPU bound in elisp, not IO bound.

By doing the computation in chunks, like stealth font-lock does, for
example, you let other tasks get slots of CPU time while the long
computation runs.

It's like telling the user to go for a coffee while Gnus computes the
summary buffer, only instead of coffee she can type away something in
another buffer ;-)

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: What's the problem? (Was: Are there plans for a multi-threaded Emacs?)
  2003-12-08 18:25                                     ` What's the problem? (Was: Are there plans for a multi-threaded Emacs?) Luke Gorrie
                                                         ` (3 preceding siblings ...)
  2003-12-09 19:32                                       ` Ted Zlatanov
@ 2003-12-10 15:16                                       ` Ted Zlatanov
       [not found]                                         ` <E1AUS6B-0006KH-Hq@fencepost.gnu.org>
  4 siblings, 1 reply; 133+ messages in thread
From: Ted Zlatanov @ 2003-12-10 15:16 UTC (permalink / raw)


On 09 Dec 2003, monnier@iro.umontreal.ca wrote:

> Yes, the semantics would be cleaner, but check the example I posted
> where we rebind default-directory and switch back&forth between
> buffers: the old semantics is odd but some code relies on it
> (basically using `let' instead of `cd').

I see the problem with that code.  Is it so common a practice that it
can't be rewritten where it already happens, and deprecated for the
future?  It seems pretty confusing for the maintainers and only
slightly convenient for the programmers.

Ted

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: What's the problem?
  2003-12-10  5:38                                               ` Simon Josefsson
  2003-12-10  5:51                                                 ` Miles Bader
@ 2003-12-10 15:36                                                 ` Ted Zlatanov
  2003-12-11  1:46                                                   ` Miles Bader
  2003-12-11 18:39                                                 ` Ted Zlatanov
                                                                   ` (2 subsequent siblings)
  4 siblings, 1 reply; 133+ messages in thread
From: Ted Zlatanov @ 2003-12-10 15:36 UTC (permalink / raw)


On 10 Dec 2003, miles@lsi.nec.co.jp wrote:

> IOW, it's annoying for the gnus programmer, but very easy for the
> emacs implementation.

Well, that's the rub, isn't it?  Simon and I, being Gnus programmers,
would like Emacs to provide something better than the current
framework so the pain will be spread out instead of concentrated on
us.  I think that improvements to Emacs would be beneficial to far
more people than improvements to Gnus, also.

> Some questions are (1) are there only a few points within gnus that
> represent most of the annoying delays

Hashtable lookups, list traversals, and arithmetic.  Those three show
up all over the place, and they are generally not mutually dependent
when done on separate articles.

> (2) do these places have fairly simple code structures that could be
> split up into pieces like the above example,

Generally yes, but sometimes they can get pretty complex (depending
on the number of references in an article or on the number of scoring
rules, for instance).

> (3) do these pieces not depend on the long-term consistency of
> any global state.

I think so.

> I don't know.  A framework like the above could pretty simply handle
> the I/O bound portion too, though.

Remember the auto-save (over NFS or Tramp) problem I mentioned.  I
don't think it can be done the way you propose, but I'll be happy to
be proven wrong.

Ted

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: What's the problem?
  2003-12-10 15:36                                                 ` Ted Zlatanov
@ 2003-12-11  1:46                                                   ` Miles Bader
  2003-12-12 23:54                                                     ` Richard Stallman
  0 siblings, 1 reply; 133+ messages in thread
From: Miles Bader @ 2003-12-11  1:46 UTC (permalink / raw)
  Cc: emacs-devel

Ted Zlatanov <tzz@lifelogs.com> writes:
> > IOW, it's annoying for the gnus programmer, but very easy for the
> > emacs implementation.
> 
> Well, that's the rub, isn't it?  Simon and I, being Gnus programmers,
> would like Emacs to provide something better than the current
> framework so the pain will be spread out instead of concentrated on
> us.  I think that improvements to Emacs would be beneficial to far
> more people than improvements to Gnus, also.

Of course.  It's just that past a certain point (e.g. providing _real_
threading), the changes to emacs are insanely complex and intrusive.

The sort of awkward `pseudo-threading' framework I gave an example of,
although it's annoying for the application programmer, is I think
relatively _less_ annoying than the sort of massive emacs changes
required for true threading.

If the number of places where you really _need_ it are fairly few, I
think it makes more sense to put the complexity in those places.
My impression is that this is the case; indeed, for me it's basically
like 2-3 operations in gnus, and that's it (most other time-consuming
commands use external processes in the background to do their work).

Now, any of my assumptions could be wrong, in which case maybe the
calculation is different, but...

> > Some questions are (1) are there only a few points within gnus that
> > represent most of the annoying delays
> 
> Hashtable lookups, list traversals, and arithmetic.  Those three show
> up all over the place, and they are generally not mutually dependent
> when done on separate articles.

No, that's not what I meant -- those sorts of operations may in
aggregate represent the bulk of the cpu time spent, but no single
operation actually takes very long.

I'm more concerned with what entry points into gnus (I mean, user
commands) hang for a long time.  Find those, and if there are only a few
of them, see if they can be split up using a pseudo-threading framework
or something.

> > I don't know.  A framework like the above could pretty simply handle
> > the I/O bound portion too, though.
> 
> Remember the auto-save (over NFS or Tramp) problem I mentioned.  I
> don't think it can be done the way you propose, but I'll be happy to
> be proven wrong.

Sure; I hate auto-save delays too (even more annoying is the !@#$%!
purposeful-delay-to-give-an-error-message autosave does when it can't
write a file), but I suppose fixing them would require low-level changes
to emacs.

-Miles
-- 
`There are more things in heaven and earth, Horatio,
 Than are dreamt of in your philosophy.'

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: What's the problem?
  2003-12-10  7:19                                                     ` Miles Bader
@ 2003-12-11 14:12                                                       ` Stefan Monnier
  2003-12-11 23:09                                                         ` Miles Bader
  2003-12-12 23:55                                                         ` Richard Stallman
  0 siblings, 2 replies; 133+ messages in thread
From: Stefan Monnier @ 2003-12-11 14:12 UTC (permalink / raw)
  Cc: Juri Linkov, emacs-devel

> or every 100 iterations, or something like that.  In a cooperative
> multi-tasking system, you'd just stick in a (yield) or something, but in
> emacs this would be very hard to support.

I don't see why this should be so hard.
What we're talking about is basically multiple-stacks, context-switches
done only from Feval (i.e. at elisp granularity so there's no concurrency
in the C code), some form of elisp forking and locking primitives (I
suggested to lock a buffer at a time, but we also need to prevent
context-switches during special cases such as jit-lock), and a lot
of experimenting.

One case I recently bumped into where using the current event-driven
functionality is not possible (even for I/O) is in Tramp where the wait can
easily be on the order of a minute for the initial connection.  In a case
like this one, I think the thread creation primitive needed would be
something akin to the shell's "C-z + bg".  Maybe something like
(if (fork) (throw 'toplevel) ...) if a `fork' like primitive makes sense,
or just a new primitive `make-new-toplevel-thread'.


        Stefan

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: What's the problem?
  2003-12-10  8:18                                                     ` Eli Zaretskii
@ 2003-12-11 14:45                                                       ` Richard Stallman
  0 siblings, 0 replies; 133+ messages in thread
From: Richard Stallman @ 2003-12-11 14:45 UTC (permalink / raw)
  Cc: juri, emacs-devel

    By doing the computation in chunks, like stealth font-lock does, for
    example, you let other tasks get slots of CPU time while the long
    computation runs.

Gnus could compute the summary in the background, piece by piece,
somewhat like stealth font-lock.  (Not exactly the same, because
whenever Emacs is otherwise idle it should work full time on
producing summary items.)

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: What's the problem?
  2003-12-10  5:38                                               ` Simon Josefsson
  2003-12-10  5:51                                                 ` Miles Bader
  2003-12-10 15:36                                                 ` Ted Zlatanov
@ 2003-12-11 18:39                                                 ` Ted Zlatanov
  2003-12-11 18:48                                                 ` Ted Zlatanov
  2003-12-13  4:08                                                 ` Miles Bader
  4 siblings, 0 replies; 133+ messages in thread
From: Ted Zlatanov @ 2003-12-11 18:39 UTC (permalink / raw)


On 11 Dec 2003, miles@lsi.nec.co.jp wrote:

> Ted Zlatanov <tzz@lifelogs.com> writes:

>> > Some questions are (1) are there only a few points within gnus
>> > that represent most of the annoying delays
>> 
>> Hashtable lookups, list traversals, and arithmetic.  Those three
>> show up all over the place, and they are generally not mutually
>> dependent when done on separate articles.
> 
> No, that's not what I meant -- those sorts of operations may in
> aggregate represent the bulk of the cpu time spent, but no single
> operation actually takes very long.
> 
> I'm more concerned with what entry points into gnus (I mean, user
> commands) hang for a long time.  Find those, and if there are only a
> few of them, see if they can be split up using a pseudo-threading
> framework or something.

I'll list the pieces I know best.  There are probably others.

- getting new mail, read/write existing mail
  - interacting with network backends
    - nnimap: medium read, slow write
    - nntp: fast read
    - nnrss: slow initial read
  - interacting with local backends: nnml, nnmaildir, etc.
  - spam-splitting

- sending mail

- building summary buffers
  - retrieving articles from overview data
  - scoring
  - building threads
  - spam-splitting (for backends that don't get new mail, e.g. nntp)

- detecting and processing spam
  - recognizing spam (connects with spam-splitting above)
  - remembering spam with internal or external programs

- tracing article threads back to a folder (gnus-registry)
  - look up registry hashtable, look through a list for each
    reference ID and examine each cell closely
  - look up, modify, and store back registry hashtable entry

>> > I don't know.  A framework like the above could pretty simply
>> > handle the I/O bound portion too, though.
>> 
>> Remember the auto-save (over NFS or Tramp) problem I mentioned.  I
>> don't think it can be done the way you propose, but I'll be happy
>> to be proven wrong.
> 
> Sure; I hate auto-save delays too (even more annoying is the !@#$%!
> purposeful-delay-to-give-an-error-message autosave does when it
> can't write a file), but I suppose fixing them would require
> low-level changes to emacs.

I'll be the first one in line if those changes ever happen.

Thanks
Ted

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: What's the problem?
  2003-12-10  5:38                                               ` Simon Josefsson
                                                                   ` (2 preceding siblings ...)
  2003-12-11 18:39                                                 ` Ted Zlatanov
@ 2003-12-11 18:48                                                 ` Ted Zlatanov
  2003-12-12  3:27                                                   ` Luke A. Olbrish
  2003-12-13  4:08                                                 ` Miles Bader
  4 siblings, 1 reply; 133+ messages in thread
From: Ted Zlatanov @ 2003-12-11 18:48 UTC (permalink / raw)


On Thu, 11 Dec 2003, rms@gnu.org wrote:

> Gnus could compute the summary in the background, piece by piece,
> somewhat like stealth font-lock.  (Not exactly the same, because
> whenever Emacs is otherwise idle it should work full time on
> producing summary items.)

This seems to be a highly favored solution on this list because it
fits in easily with the existing interpreter.  The downside is that it
does not use multiple processors if they exist, which has become more
common with today's hardware.

Ted

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: What's the problem?
  2003-12-11 14:12                                                       ` Stefan Monnier
@ 2003-12-11 23:09                                                         ` Miles Bader
  2003-12-12 23:55                                                         ` Richard Stallman
  1 sibling, 0 replies; 133+ messages in thread
From: Miles Bader @ 2003-12-11 23:09 UTC (permalink / raw)
  Cc: Juri Linkov, emacs-devel, Miles Bader

On Thu, Dec 11, 2003 at 09:12:17AM -0500, Stefan Monnier wrote:
> > In a cooperative multi-tasking system, you'd just stick in a (yield) or
> > something, but in emacs this would be very hard to support.
> 
> I don't see why this should be so hard.  What we're talking about is
> basically multiple-stacks, context-switches done only from Feval (i.e. at
> elisp granularity so there's no concurrency in the C code), some form of
> elisp forking and locking primitives

Hmmm, aside from application-level issues (which are probably the same
whether you use cooperative multi-tasking or a goofy framework like I
described earlier), I'd think the most annoying thing would be working around
emacs' use of shallow-binding for variables.  I.e., for local variable
bindings you'd have to unwind the bindings in one thread and wind them in the
next when you switched contexts; I'm not sure how non-normal variables would
fit into things (presumably you would unwind/wind the the same way, but...).

Of course there are other things that behave the same way, like buffer
restrictions etc., but maybe they could be treated as `application level'
issues, and dealt with via explicit or buffer locking of some sort.

If a new `rewind' field were added to unwind-markers on the binding stack, it
could identify those that _do_ matter, and say `unwind me when switching
thread, and here's how to rewind me later.'

Maybe you're right -- if the core changes could be kept fairly small, it
would at least be worth experimenting with.

-miles
-- 
`Life is a boundless sea of bitterness'

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: What's the problem? (Was: Are there plans for a multi-threaded Emacs?)
  2003-12-10  2:49                                               ` Stefan Monnier
@ 2003-12-12  0:44                                                 ` Martin Stjernholm
  0 siblings, 0 replies; 133+ messages in thread
From: Martin Stjernholm @ 2003-12-12  0:44 UTC (permalink / raw)
  Cc: Ted Zlatanov, David Kastrup, emacs-devel

Stefan Monnier <monnier@iro.umontreal.ca> wrote:

> Yes, the semantics would be cleaner, but check the example I posted where
> we rebind default-directory and switch back&forth between buffers: the
> old semantics is odd but some code relies on it (basically using `let'
> instead of `cd').

It sure is odd, but how is that semantics a problem when it comes to
thread switches? From a usability perspective it sure can be a problem
if several threads changes buffer local values and combine it with
dynamic bindings, but that's an application problem. I can't see any
inherent design problem keeping the odd behavior in a threaded
environment. Is it that the implementation of dynamically bound buffer
local values makes it difficult to fix context switching for them?

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: What's the problem?
  2003-12-11 18:48                                                 ` Ted Zlatanov
@ 2003-12-12  3:27                                                   ` Luke A. Olbrish
  2003-12-12  3:57                                                     ` Miles Bader
  0 siblings, 1 reply; 133+ messages in thread
From: Luke A. Olbrish @ 2003-12-12  3:27 UTC (permalink / raw)
  Cc: emacs-devel

Ted Zlatanov <tzz@lifelogs.com> writes:

> On Thu, 11 Dec 2003, rms@gnu.org wrote:
>
>> Gnus could compute the summary in the background, piece by piece,
>> somewhat like stealth font-lock.  (Not exactly the same, because
>> whenever Emacs is otherwise idle it should work full time on
>> producing summary items.)
>
> This seems to be a highly favored solution on this list because it
> fits in easily with the existing interpreter.  The downside is that it
> does not use multiple processors if they exist, which has become more
> common with today's hardware.

is emacs so slow on today's hardware that it needs to be able to use
multiple processors?  it would seem that we could get more use out of
work on the interpreter to make it more efficient than to get emacs to
be able to utilize multiple processors.

-- 
Luke Anthony Olbrish
<luke.olbrish@cc.gatech.edu>

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: What's the problem?
  2003-12-12  3:27                                                   ` Luke A. Olbrish
@ 2003-12-12  3:57                                                     ` Miles Bader
  2003-12-13 15:17                                                       ` Richard Stallman
  0 siblings, 1 reply; 133+ messages in thread
From: Miles Bader @ 2003-12-12  3:57 UTC (permalink / raw)
  Cc: Ted Zlatanov, emacs-devel

luke.olbrish@cc.gatech.edu (Luke A. Olbrish) writes:
> is emacs so slow on today's hardware that it needs to be able to use
> multiple processors?

I'm not sure why people keep talking about threading as some way to make
emacs faster -- speed is not a major problem in general, and those
places where it _is_ (e.g., gnus summary generation) don't seem easily
parallizable.  As far as I can see, threads are desirable mostly because
they allow the user to keep working while something's happening in the
background (since typical emacs task are very non-cpu-intensive, the
background task probably won't slow down appreciably either).

-Miles
-- 
A zen-buddhist walked into a pizza shop and
said, "Make me one with everything."

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: What's the problem?
  2003-12-11  1:46                                                   ` Miles Bader
@ 2003-12-12 23:54                                                     ` Richard Stallman
  0 siblings, 0 replies; 133+ messages in thread
From: Richard Stallman @ 2003-12-12 23:54 UTC (permalink / raw)
  Cc: tzz, emacs-devel

    Sure; I hate auto-save delays too (even more annoying is the !@#$%!
    purposeful-delay-to-give-an-error-message autosave does when it can't
    write a file)

It would be easy to change that.  The question is, what other way
should it make sure the user sees that there is an error?

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: What's the problem?
  2003-12-11 14:12                                                       ` Stefan Monnier
  2003-12-11 23:09                                                         ` Miles Bader
@ 2003-12-12 23:55                                                         ` Richard Stallman
  2003-12-13 16:11                                                           ` Eli Zaretskii
  1 sibling, 1 reply; 133+ messages in thread
From: Richard Stallman @ 2003-12-12 23:55 UTC (permalink / raw)
  Cc: juri, emacs-devel, miles

    What we're talking about is basically multiple-stacks, context-switches
    done only from Feval (i.e. at elisp granularity so there's no concurrency
    in the C code),

The number of C functions that call Feval is rather large,
and include redisplay.  So this is not quite as easy as it might seem.

Redisplay could set a flag to prevent thread-switching.  That would
remove one large piece of the problem.  How big the problem remains
after that, I am not sure.

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: What's the problem?
  2003-12-10  5:38                                               ` Simon Josefsson
                                                                   ` (3 preceding siblings ...)
  2003-12-11 18:48                                                 ` Ted Zlatanov
@ 2003-12-13  4:08                                                 ` Miles Bader
  2003-12-13 23:14                                                   ` Richard Stallman
  2003-12-14 13:12                                                   ` Emacs kill buffer Camm Maguire
  4 siblings, 2 replies; 133+ messages in thread
From: Miles Bader @ 2003-12-13  4:08 UTC (permalink / raw)


Richard Stallman <rms@gnu.org> writes:
>     Sure; I hate auto-save delays too (even more annoying is the !@#$%!
>     purposeful-delay-to-give-an-error-message autosave does when it can't
>     write a file)
> 
> It would be easy to change that.  The question is, what other way
> should it make sure the user sees that there is an error?

Some things that come to mind are:

 * Make sure the pause is cleanly canceled if you hit ^G (I'm not really
   sure what it does now, but it acts very strangely if you hit ^G)

 * Only pause to show the error message the first time the autosave for
   a particular file fails; if subsequent autosaves fail, just show the
   error message with no pause (however, if autosave then _succeeds_ at
   some point, it should presumably reset the state so that it pauses
   upon any failure after that)

 * maybe put a big obvious warning in the modeline for buffers where
   autosave failed (text, uppercase, red, blinking... :-)

-Miles
-- 
"Most attacks seem to take place at night, during a rainstorm, uphill,
 where four map sheets join."   -- Anon. British Officer in WW I

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: What's the problem?
  2003-12-12  3:57                                                     ` Miles Bader
@ 2003-12-13 15:17                                                       ` Richard Stallman
  0 siblings, 0 replies; 133+ messages in thread
From: Richard Stallman @ 2003-12-13 15:17 UTC (permalink / raw)
  Cc: tzz, luke.olbrish, emacs-devel

    I'm not sure why people keep talking about threading as some way to make
    emacs faster -- speed is not a major problem in general, and those
    places where it _is_ (e.g., gnus summary generation) don't seem easily
    parallizable.  As far as I can see, threads are desirable mostly because
    they allow the user to keep working while something's happening in the
    background (since typical emacs task are very non-cpu-intensive, the
    background task probably won't slow down appreciably either).

I basically agree; however, there is one other possible use for
multi-threading in Emacs.  This is for the sake of using multiple
terminals at once.  Right now, I think, only one terminal can
use the minibuffer.  Only one terminal can be running a command.
If each terminal had its own thread, they could do just about anything
in parallel.

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: What's the problem?
  2003-12-12 23:55                                                         ` Richard Stallman
@ 2003-12-13 16:11                                                           ` Eli Zaretskii
  2003-12-13 17:29                                                             ` Jan D.
                                                                               ` (2 more replies)
  0 siblings, 3 replies; 133+ messages in thread
From: Eli Zaretskii @ 2003-12-13 16:11 UTC (permalink / raw)
  Cc: juri, emacs-devel

> From: Richard Stallman <rms@gnu.org>
> Date: Fri, 12 Dec 2003 18:55:58 -0500
> 
> Redisplay could set a flag to prevent thread-switching.

I think making redisplay a separate thread would be one of the more
useful improvements in Emacs.  The situation where the user clicks
File->Open from the menu bar and then (under a toolkit), while the
file-selection box is active, the Emacs display never changes, looks
like a bug.  (Try moving the file-selection box to a different
position and observe the blank portions of the Emacs window.)

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: What's the problem?
  2003-12-13 16:11                                                           ` Eli Zaretskii
@ 2003-12-13 17:29                                                             ` Jan D.
  2003-12-13 17:35                                                             ` David Kastrup
  2003-12-14 10:18                                                             ` Richard Stallman
  2 siblings, 0 replies; 133+ messages in thread
From: Jan D. @ 2003-12-13 17:29 UTC (permalink / raw)
  Cc: emacs-devel

> I think making redisplay a separate thread would be one of the more
> useful improvements in Emacs.  The situation where the user clicks
> File->Open from the menu bar and then (under a toolkit), while the
> file-selection box is active, the Emacs display never changes, looks
> like a bug.  (Try moving the file-selection box to a different
> position and observe the blank portions of the Emacs window.)

This has actually been fixed in CVS for some time.  But having redisplay
in a separate thread is still a good idea.

	Jan D.

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: What's the problem?
  2003-12-13 16:11                                                           ` Eli Zaretskii
  2003-12-13 17:29                                                             ` Jan D.
@ 2003-12-13 17:35                                                             ` David Kastrup
  2003-12-14  6:17                                                               ` Eli Zaretskii
  2003-12-14 10:18                                                             ` Richard Stallman
  2 siblings, 1 reply; 133+ messages in thread
From: David Kastrup @ 2003-12-13 17:35 UTC (permalink / raw)
  Cc: juri, rms, emacs-devel

"Eli Zaretskii" <eliz@elta.co.il> writes:

> > From: Richard Stallman <rms@gnu.org>
> > Date: Fri, 12 Dec 2003 18:55:58 -0500
> > 
> > Redisplay could set a flag to prevent thread-switching.
> 
> I think making redisplay a separate thread would be one of the more
> useful improvements in Emacs.  The situation where the user clicks
> File->Open from the menu bar and then (under a toolkit), while the
> file-selection box is active, the Emacs display never changes, looks
> like a bug.  (Try moving the file-selection box to a different
> position and observe the blank portions of the Emacs window.)

It would also be an idea, if one has a redisplay thread, to let it
associate mouse clicks with objects under it at the time of the click.
People rarely expect, when they click in the text area while Emacs is
busy, that half an hour later a menu pops up with a button "Really
self-destruct?" which happens to be right on the location where the
click had been half an hour ago, that this menu/text position etc will
be satisfied with the click from olden times.

More seriously, I had quite a few times paste operations go quite to
the wrong place when something affecting the buffer display was
running in background, even though at the time of the click the
display was still something quite different.

-- 
David Kastrup, Kriemhildstr. 15, 44793 Bochum

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: What's the problem?
  2003-12-13  4:08                                                 ` Miles Bader
@ 2003-12-13 23:14                                                   ` Richard Stallman
  2003-12-14 13:12                                                   ` Emacs kill buffer Camm Maguire
  1 sibling, 0 replies; 133+ messages in thread
From: Richard Stallman @ 2003-12-13 23:14 UTC (permalink / raw)
  Cc: emacs-devel

     * Make sure the pause is cleanly canceled if you hit ^G (I'm not really
       sure what it does now, but it acts very strangely if you hit ^G)

Coud you debug that case?

     * Only pause to show the error message the first time the autosave for
       a particular file fails; if subsequent autosaves fail, just show the
       error message with no pause (however, if autosave then _succeeds_ at
       some point, it should presumably reset the state so that it pauses
       upon any failure after that)

That sounds like a usable idea.  Would you like to try to implement it?

     * maybe put a big obvious warning in the modeline for buffers where
       autosave failed (text, uppercase, red, blinking... :-)

That would work ok for buffers that are visible, but would fail to do
the job for others.

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: What's the problem?
       [not found]                                           ` <4nn09xm68c.fsf@collins.bwh.harvard.edu>
@ 2003-12-13 23:15                                             ` Richard Stallman
  2003-12-14  3:21                                               ` Martin Stjernholm
  0 siblings, 1 reply; 133+ messages in thread
From: Richard Stallman @ 2003-12-13 23:15 UTC (permalink / raw)
  Cc: jas, emacs-devel, stefan.monnier, mast, miles

    I think people on emacs-devel agreed that private binding stacks would
    work, but their concern was that it would slow down Emacs a lot if
    every read/write did a binding lookup (I am probably remembering
    things incorrectly, but that was my understanding).

The values would be stored in the symbols, just as now.
However, thread-switching would have to swap bindings in and out.

Here's what I sent privately:

This could work using shallow binding, if switching threads swaps
out the bindings that shouldn't apply, then swaps in those that
should.  This is similar to the technique now used for buffer-local
bindings when switching buffers; however, for buffer-switching, the
swapping is done in a lazy fashion, but I don't see how that could
be possible for thread-switching.  So thread-switching would take
some time.  We would want to make sure it does not happen very
often.

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: What's the problem?
  2003-12-13 23:15                                             ` What's the problem? Richard Stallman
@ 2003-12-14  3:21                                               ` Martin Stjernholm
  0 siblings, 0 replies; 133+ messages in thread
From: Martin Stjernholm @ 2003-12-14  3:21 UTC (permalink / raw)
  Cc: jas, Ted Zlatanov, stefan.monnier, emacs-devel, miles

Richard Stallman <rms@gnu.org> wrote:

> /.../ So thread-switching would take some time.  We would want to
> make sure it does not happen very often.

That's a good design principle anyway since thread switches never are
very cheap. Avoiding fine grained locking is afaics the best way to
ensure that thread switches happens seldom. With only buffer local
locks, every callback would normally run to completion in a single
thread slice since threads can't lock out each other. Thread switches
would only occur when things have blocked in I/O (and speed isn't a
factor then), or when cpu bound work is preempted.

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: What's the problem?
  2003-12-13 17:35                                                             ` David Kastrup
@ 2003-12-14  6:17                                                               ` Eli Zaretskii
  2003-12-14 11:55                                                                 ` David Kastrup
  0 siblings, 1 reply; 133+ messages in thread
From: Eli Zaretskii @ 2003-12-14  6:17 UTC (permalink / raw)
  Cc: juri, emacs-devel

> From: David Kastrup <dak@gnu.org>
> Date: 13 Dec 2003 18:35:22 +0100
> 
> It would also be an idea, if one has a redisplay thread, to let it
> associate mouse clicks with objects under it at the time of the click.
> People rarely expect, when they click in the text area while Emacs is
> busy, that half an hour later a menu pops up with a button "Really
> self-destruct?" which happens to be right on the location where the
> click had been half an hour ago, that this menu/text position etc will
> be satisfied with the click from olden times.

I think, with a separate thread, such cases will be less probable,
actually, since the redisplay will have more chance to catch up with
the rest of Emacs than it is now.

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: What's the problem?
  2003-12-13 16:11                                                           ` Eli Zaretskii
  2003-12-13 17:29                                                             ` Jan D.
  2003-12-13 17:35                                                             ` David Kastrup
@ 2003-12-14 10:18                                                             ` Richard Stallman
  2 siblings, 0 replies; 133+ messages in thread
From: Richard Stallman @ 2003-12-14 10:18 UTC (permalink / raw)
  Cc: juri, emacs-devel

    I think making redisplay a separate thread would be one of the more
    useful improvements in Emacs.

That could be a good idea, if all redisplay is done by that single
thread.  When other threads try to redisplay, they would instead
wait for that thread to say "I'm done".

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: What's the problem?
  2003-12-14  6:17                                                               ` Eli Zaretskii
@ 2003-12-14 11:55                                                                 ` David Kastrup
  2003-12-14 14:27                                                                   ` Eli Zaretskii
  0 siblings, 1 reply; 133+ messages in thread
From: David Kastrup @ 2003-12-14 11:55 UTC (permalink / raw)
  Cc: juri, emacs-devel

Eli Zaretskii <eliz@elta.co.il> writes:

> > From: David Kastrup <dak@gnu.org>
> > Date: 13 Dec 2003 18:35:22 +0100
> > 
> > It would also be an idea, if one has a redisplay thread, to let it
> > associate mouse clicks with objects under it at the time of the click.
> > People rarely expect, when they click in the text area while Emacs is
> > busy, that half an hour later a menu pops up with a button "Really
> > self-destruct?" which happens to be right on the location where the
> > click had been half an hour ago, that this menu/text position etc will
> > be satisfied with the click from olden times.
> 
> I think, with a separate thread, such cases will be less probable,
> actually, since the redisplay will have more chance to catch up with
> the rest of Emacs than it is now.

It can't catch up with a state of Emacs that Emacs has not yet
reached at the time of the click.  At the time posn-point is called,
the state of Emacs might be quite different from the state at the
time of the click.

-- 
David Kastrup, Kriemhildstr. 15, 44793 Bochum

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Emacs kill buffer
  2003-12-13  4:08                                                 ` Miles Bader
  2003-12-13 23:14                                                   ` Richard Stallman
@ 2003-12-14 13:12                                                   ` Camm Maguire
  1 sibling, 0 replies; 133+ messages in thread
From: Camm Maguire @ 2003-12-14 13:12 UTC (permalink / raw)


Greetings!  Apparently, beginning with emacs21, 'cuts' to the kill
buffer are made directly through the X clipboard protocol or some
such.  I typically use emacs under X windows over a dialup ppp line
and ssh compression.  The general performance is OK, but this
modification in emacs21 has made any additions to the kill buffer much
slower.  Is there any way to turn this off and restore the older
emacs20 behavior?

Take care,
-- 
Camm Maguire			     			camm@enhanced.com
==========================================================================
"The earth is but one country, and mankind its citizens."  --  Baha'u'llah

^ permalink raw reply	[flat|nested] 133+ messages in thread

* Re: What's the problem?
  2003-12-14 11:55                                                                 ` David Kastrup
@ 2003-12-14 14:27                                                                   ` Eli Zaretskii
  0 siblings, 0 replies; 133+ messages in thread
From: Eli Zaretskii @ 2003-12-14 14:27 UTC (permalink / raw)
  Cc: juri, emacs-devel

> From: David Kastrup <dak@gnu.org>
> Date: 14 Dec 2003 12:55:48 +0100
> 
> It can't catch up with a state of Emacs that Emacs has not yet
> reached at the time of the click.  At the time posn-point is called,
> the state of Emacs might be quite different from the state at the
> time of the click.

Yes, but if redisplay runs ``in parallel'' with the rest of Emacs, the
probability of this should be smaller, I think, since it will lag
behind Emacs by a smaller amount of changes to the buffer.

^ permalink raw reply	[flat|nested] 133+ messages in thread

end of thread, other threads:[~2003-12-14 14:27 UTC | newest]

Thread overview: 133+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-11-16 21:46 Are there plans for a multi-threaded Emacs? Frank Schmitt
2003-11-17  0:49 ` Alex Schroeder
2003-11-17  4:06   ` Dhruva Krishnamurthy
2003-11-17  4:29     ` Miles Bader
2003-11-30 16:36       ` Kai Grossjohann
2003-11-30 18:01         ` Vinicius Jose Latorre
2003-11-30 18:39           ` Kai Grossjohann
2003-11-30 18:12         ` Benjamin Riefenstahl
2003-11-30 19:40         ` Nic Ferrier
2003-12-01 16:04         ` Ted Zlatanov
2003-12-02 14:45           ` Ted Lemon
2003-12-02 15:48             ` Per Abrahamsen
2003-12-02 17:18               ` David Kastrup
2003-12-03 12:38                 ` Per Abrahamsen
2003-12-02 17:27               ` Stefan Monnier
2003-12-02 18:53                 ` Simon Josefsson
2003-12-03 13:03                   ` Per Abrahamsen
2003-12-02 17:44             ` Ted Zlatanov
2003-12-03 17:16           ` Richard Stallman
2003-12-03 17:58             ` Ted Zlatanov
2003-12-03 23:38               ` Martin Stjernholm
2003-12-04 13:05                 ` Ted Zlatanov
2003-12-04 14:07                   ` David Kastrup
2003-12-04 14:58                     ` Nic Ferrier
2003-12-04 15:44                       ` David Kastrup
2003-12-04 16:17                     ` Kim F. Storm
2003-12-04 15:58                       ` Nic Ferrier
2003-12-04 16:26                         ` non-blocking sockets (was Re: Are there plans for a multi-threaded Emacs?) Nic Ferrier
2003-12-05 11:35                           ` Kim F. Storm
2003-12-04 19:55                       ` Are there plans for a multi-threaded Emacs? Ted Zlatanov
2003-12-04 20:30                         ` Stefan Monnier
2003-12-04 20:58                           ` Ted Zlatanov
2003-12-04 22:49                             ` Stefan Monnier
2003-12-05 12:17                               ` Ted Zlatanov
2003-12-05 13:06                                 ` Thien-Thi Nguyen
2003-12-05 14:44                                 ` David Kastrup
2003-12-07 23:55                                 ` Stefan Monnier
2003-12-08 16:54                                   ` Ted Zlatanov
2003-12-08 17:09                                     ` David Kastrup
2003-12-08 18:10                                       ` Ted Zlatanov
2003-12-08 22:02                                       ` Martin Stjernholm
2003-12-08 18:25                                     ` What's the problem? (Was: Are there plans for a multi-threaded Emacs?) Luke Gorrie
2003-12-08 19:56                                       ` Ted Zlatanov
2003-12-08 20:56                                         ` David Kastrup
2003-12-08 22:09                                           ` Martin Stjernholm
2003-12-08 21:01                                         ` Stefan Monnier
2003-12-08 19:57                                       ` What's the problem? Simon Josefsson
2003-12-09 23:45                                         ` Juri Linkov
2003-12-10  0:58                                           ` Simon Josefsson
2003-12-10  4:35                                             ` Miles Bader
2003-12-10  5:38                                               ` Simon Josefsson
2003-12-10  5:51                                                 ` Miles Bader
2003-12-10  6:34                                                   ` Simon Josefsson
2003-12-10  7:19                                                     ` Miles Bader
2003-12-11 14:12                                                       ` Stefan Monnier
2003-12-11 23:09                                                         ` Miles Bader
2003-12-12 23:55                                                         ` Richard Stallman
2003-12-13 16:11                                                           ` Eli Zaretskii
2003-12-13 17:29                                                             ` Jan D.
2003-12-13 17:35                                                             ` David Kastrup
2003-12-14  6:17                                                               ` Eli Zaretskii
2003-12-14 11:55                                                                 ` David Kastrup
2003-12-14 14:27                                                                   ` Eli Zaretskii
2003-12-14 10:18                                                             ` Richard Stallman
2003-12-10  8:18                                                     ` Eli Zaretskii
2003-12-11 14:45                                                       ` Richard Stallman
2003-12-10 15:36                                                 ` Ted Zlatanov
2003-12-11  1:46                                                   ` Miles Bader
2003-12-12 23:54                                                     ` Richard Stallman
2003-12-11 18:39                                                 ` Ted Zlatanov
2003-12-11 18:48                                                 ` Ted Zlatanov
2003-12-12  3:27                                                   ` Luke A. Olbrish
2003-12-12  3:57                                                     ` Miles Bader
2003-12-13 15:17                                                       ` Richard Stallman
2003-12-13  4:08                                                 ` Miles Bader
2003-12-13 23:14                                                   ` Richard Stallman
2003-12-14 13:12                                                   ` Emacs kill buffer Camm Maguire
2003-12-09 19:28                                       ` What's the problem? (Was: Are there plans for a multi-threaded Emacs?) Ted Zlatanov
2003-12-09 22:02                                         ` David Kastrup
2003-12-10  0:13                                           ` Stefan Monnier
2003-12-10  1:41                                             ` David Kastrup
2003-12-10  2:49                                               ` Stefan Monnier
2003-12-12  0:44                                                 ` Martin Stjernholm
2003-12-10  0:45                                           ` Martin Stjernholm
2003-12-10  2:55                                             ` Stefan Monnier
2003-12-09 19:32                                       ` Ted Zlatanov
2003-12-09 22:13                                         ` Stefan Monnier
2003-12-10 15:16                                       ` Ted Zlatanov
     [not found]                                         ` <E1AUS6B-0006KH-Hq@fencepost.gnu.org>
     [not found]                                           ` <4ny8tjryy8.fsf@collins.bwh.harvard.edu>
     [not found]                                           ` <4nn09xm68c.fsf@collins.bwh.harvard.edu>
2003-12-13 23:15                                             ` What's the problem? Richard Stallman
2003-12-14  3:21                                               ` Martin Stjernholm
2003-12-05  8:58                             ` Are there plans for a multi-threaded Emacs? Thien-Thi Nguyen
2003-12-05 11:58                               ` Ted Zlatanov
2003-12-05 12:12                               ` Ted Zlatanov
2003-12-05 20:37                                 ` Luke A. Olbrish
2003-12-05 21:45                                   ` Ted Zlatanov
2003-12-08  0:10                                   ` Stefan Monnier
2003-12-08  1:26                                     ` Luke A. Olbrish
2003-12-04 17:22                   ` Martin Stjernholm
2003-12-04 18:01                     ` David Kastrup
2003-12-04 18:31                       ` Martin Stjernholm
2003-12-04 19:26                         ` David Kastrup
2003-12-04 22:05                           ` Martin Stjernholm
2003-12-04 20:18                     ` Ted Zlatanov
2003-12-04 23:00                       ` Martin Stjernholm
2003-12-05 12:06                         ` Ted Zlatanov
2003-12-05 13:16                           ` Martin Stjernholm
2003-12-05 21:30                             ` Ted Zlatanov
2003-12-05 14:46                           ` David Kastrup
2003-12-05 15:07                             ` Martin Stjernholm
2003-12-05 13:56                       ` Benjamin Riefenstahl
2003-12-05 21:33                         ` non-blocking auto-save (was: Are there plans for a multi-threaded Emacs?) Ted Zlatanov
2003-12-03 20:01             ` Are there plans for a multi-threaded Emacs? Nic Ferrier
2003-12-03 20:29               ` Stefan Monnier
2003-12-03 21:42                 ` Robert J. Chassell
2003-12-04  7:33                   ` Richard Stallman
2003-12-04 15:37                     ` Stefan Monnier
2003-12-04 18:06                       ` Thien-Thi Nguyen
2003-12-04  7:33                 ` Richard Stallman
2003-12-04 13:14                   ` Ted Zlatanov
2003-12-04 15:41                   ` Stefan Monnier
2003-12-06 20:58       ` Kai Grossjohann
2003-12-07  0:15         ` Thien-Thi Nguyen
2003-12-07 14:52           ` Kai Grossjohann
2003-12-07 16:58             ` Thien-Thi Nguyen
2003-12-07  4:16         ` Martin Stjernholm
2003-12-07 14:53           ` Kai Grossjohann
2003-12-07 23:00             ` Martin Stjernholm
2003-11-17 19:31 ` Richard Stallman
2003-11-17 22:53   ` David Masterson
2003-11-18  5:57     ` Miles Bader
2003-11-20 19:19       ` David Masterson
2003-11-22 21:19         ` Richard Stallman
2003-11-18  6:52     ` John Wiegley

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).