Christophe Rhodes csr21@cam.ac.uk writes:
I've slightly lost track of how slime works multithreadedly -- does it spawn a new thread for each evaluation, or does it farm them off to a worker thread?
I'm not familiar with SLIME's internals, but I've done some tests with SB-THREAD:CURRENT-THREAD-ID. 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.
Putting the point after (sb-thread:current-thread-id) in the package.lisp file and then pressing C-x C-e produces a different thread-id each time I do it: 23761, 23762, 23763, ... Similarly for C-M-x.
So it seems that these commands spawn a new thread each time. These threads don't seem to be children of the REPL's thread, since *read-default-float-format* evaluates to LONG-FLOAT in the REPL, but doing a C-x C-e on *read-default-float-format* in package.lisp yields SINGLE-FLOAT.
When I do a (setq *read-default-float-format* 'long-float) in the *inferior-lisp* buffer, the above situation doesn't change, so the spawned threads don't seem to be children of *inferior-lisp*'s thread either.
Is there perhaps any way in SBCL for me to examine the parent/child relations between threads in order to give you more information?
Given your description, I would suggest trying to set *read-default-float-format* in the slime thread which does some work: try first setting it in the *inferior-lisp* buffer. If that's not the right thread to set it in, and you can find the right one but can't set the variable in it, shout and I'll make a (setf (symbol-value-in-thread ...) ...) function available.
Something like this?
#+:sb-thread (when (find-package :swank-loader) (setf (sb-thread::symbol-value-in-thread *read-default-float-format* (the-right-thread)) 'long-float))
Sounds reasonable, but I haven't found the right thread yet. Any SLIME developers who can help?
Thanks for the help so far.
Kind regards,
Dirk Gerrits