Attached patch makes Slime Snapshot contribution work once again.
I have tested the following scenarios:
1. M-x slime-snapshot and M-x slime-restore, on a default SBCL build with :spawn communication style 2. Same with dedicated output connection 3. C-u M-x slime-snapshot (saves in the background) 4. Restoring snapshot saved with different value of *use-dedicated-output-stream* 5. Save and restore snapshot without 'slime-repl loaded 6. All of the above re-tested on a single-threaded SBCL build, with :fd-handler communication style
Details of the implementation:
1. Because SBCL can not fork() with multiple-threads running, patch introduce a new mechanism called "Thread Stopper". It has single entry point, SWANK:REGISTER-THREAD-STOPPER which adds a callback, called by SWANK to stop/start background threads of various libraries.
2. A new entry point SWANK:CALL-WITH-ONLY-INITIAL-THREAD will stop all background threads (using the above thread stopper protocol), except for the initial thread in the Lisp image, and restart them
3. Swank itself uses the thread stopper protocol, to register a callback that will stop all the multithreaded connections threads, and then restart them after the call to fork()
4. In the implementation of the above, there were several swank-backend interface changed, and some added, namely MAKE-FD-STREAM had gained element-type argument, backend JOIN-THREAD added, and CREATE-REPL had new keyword argument added.
The thread stopper interface is intentionally minimalist, with a single entry point, as to simplify adding thread-stopper hooks to libraries, they can dispatch on (fboundp) or such.
Regards, Max