[slime-devel] Re: *read-default-float-format* with C-c C-k, , load-system, etc.

Helmut Eller e9626484 at stud3.tuwien.ac.at
Wed Jan 12 17:24:29 UTC 2005


Dirk Gerrits <dirk at dirkgerrits.com> writes:

>> REPL command are executed by the repl thread.  For the other request,
>> a new worker thread is created by the control thread. So,
>> the-right-thread(s) are probably the control thread and the repl
>> thread.
>
> This seems strange.  Has any of this changed recently?  It doesn't seem
> to explain the behaviour I reported earlier:

No; not since June.

>   In my package.lisp file, I've got the following:
>
>   (eval-when (:compile-toplevel :load-toplevel :execute)
>     (with-open-file (stream "thread-id.txt" :direction :output
>                                             :if-exists :append)
>       (print (sb-thread:current-thread-id) stream))
>     
>     ;; Use long-floats instead of single-floats by default.
>     (setq *read-default-float-format* 'long-float))
>
>   When I do a ,load-system of my ASDF system from the REPL, the processing
>   of this file generated thread-ids:
>
>   23673
>   23710
>   23710
>
>   The REPL has thread-id 23710 as well.  So I guess COMPILE-OP is done in
>   a seperate thread but LOAD-OP is done in the REPL thread?  Using the
>   *inferior-lisp* buffer's REPL reports 23706, by the way.
>
> This says inferior-lisp /= SBCL REPL, and the SETQ was apparently
> executed in the REPL thread yet the binding wasn't inherited by the
> worker threads.

I think only the last 2 lines are created by one ,load-op.  At least
(load (compile-file ...)) produces only 2 lines.  It would also be
strange to have a thread id (23673) smaller than the id of the SBCL
REPL thread (23706).

> I'll try this out again soon.  If the thread tree is really as you
> describe, and ,load-system is done in the SCBL REPL thread, then there
> shouldn't be a problem at all, right?

Only if you do it before the other threads are created, of course.  If
you do it afterwards, the value in the other threads remains
unchanged.

>> The issue came up before but I still don't know what the proper fix
>> is.  SBCL is the only Lisp with the
>> inherit-dynamic-variables-in-new-threads semantics.
>
> I thought AllegroCL 7 and Corman Common Lisp (and possibly others) also
> behaved in this way?  In any case, it seems to me that this is the
> reasonable thing to do with special variable bindings in a multithreaded
> setting.

Not sure about Corman, but in Allegro the dynamic environment in new
thread is initially empty.  See
http://www.franz.com/support/documentation/7.0/doc/multiprocessing.htm#dynamic-environments-1

>> Implementing non-inheriting seems to be difficult in SBCL and
>> implementing inheriting is difficult in the other Lisps.  We could
>> probably offer something like swank:setq-default to set initial values
>> in the worker threads.  Other ideas?
>
> I reckon the problem is a lot deeper than SBCL + SLIME, but
> SWANK:SETQ-DEFAULT sounds like a good workaround.

I added a new variable *default-worker-thread-bindings* instead.
The intended use is something like 

 (push (cons '*read-default-float-format* 'long-float)
       *default-worker-thread-bindings*)

Only new worker threads are affected by this variable.  To change the
variable in the REPL you have to evaluate a setq in the REPL thread.

Helmut.



More information about the slime-devel mailing list