On Fri, 04 Nov 2011 06:13:25 -0700, Andrew Myers <asm198@gmail.com> wrote:

> As data point I can reliably restart images in which I've executed this
> form:
>
> (setf *restart-init-function*
> (lambda ()
> (dolist (connection swank::*connections*)
> (format t "closing ~a~%" connection)
> (swank::close-connection connection nil nil))))
>
> Without that the reliability ranges from "works most of the time" to
> "never ever works" depending on the OS I'm testing on. This solution
> uses a number of non exported swank features and I'm still not sure if
> it's the right direction to go. Any thoughts?
> Thanks,
> Andrew
>
> On Fri, Nov 4, 2011 at 8:56 AM, Andrew Myers <asm198@gmail.com> wrote:
>> So I've been looking into the problem of restarting a lisp image saved
>> from Slime.  It appears to me that Swank is still blocked on the
>> socket listening for connections in the restarted image in some cases
>> (I'm not sure why it's inconsistent).   As a result when the image is
>> restarted it's stuck listening on a connection that will never receive
>> data and can't execute the Swank initialization process to connect to
>> the new socket which Slime has chosen.
>>
>> I was thinking that I would implement swank-backend:save-image to
>> shutdown Swank before dumping the image (or possibly have the restart
>> function shutdown any existing Swank processes) so there's nothing in
>> the way of Swank being re-initialized when the image is loaded again.
>> (Does this sounds like a reasonable thing to do?) I'm not sure how to
>> do this though, there only seem to be methods for shutting down the
>> Swank server, not individual connections.  Looking at other
>> implementations of save-image wasn't very illuminating so I seem to be
>> missing something.
>>
>> It looks like the connection struct and the *connections* defvar might
>> have what I need in it, but there is only sanctioned access to the
>> most recently opened connection via `default-connection`.  Presumably
>> I would need to close _all_ *connections*?
>>
>> Can anyone point me in the right direction?
>>


I'm not sure this will help, but here's the way I create an executable image with swank that works (100% of the time).
It's SBCL specific but I'm guessing you can generalize it.

;; Shut down Swank and anyone else by terminating all threads
(dolist (thread (sb-thread:list-all-threads))
(unless (equal sb-thread:*current-thread* thread)
(sb-thread:terminate-thread thread)))
;; Set the function to run on startup of the core executable
(setf sb-ext:*init-hooks* (list #'start-the-servers))
;; Dump core and exit
(sb-ext:save-lisp-and-die *core* :executable t)


Note that since all the threads have to be shut down first, you cannot do this from within Slime, but from the command line it is:

sbcl make-core.lisp

Jeff