|
|
|
(defpackage swank-snapshot
|
|
(:use cl)
|
|
(:export restore-snapshot save-snapshot background-save-snapshot)
|
|
(:import-from swank defslimefun))
|
|
(in-package swank-snapshot)
|
|
|
|
(defslimefun save-snapshot (image-file)
|
|
(swank/backend:save-image image-file
|
|
(let ((c swank::*emacs-connection*))
|
|
(lambda () (resurrect c))))
|
|
(format nil "Dumped lisp to ~A" image-file))
|
|
|
|
(defslimefun restore-snapshot (image-file)
|
|
(let* ((conn swank::*emacs-connection*)
|
|
(stream (swank::connection.socket-io conn))
|
|
(clone (swank/backend:dup (swank/backend:socket-fd stream)))
|
|
(style (swank::connection.communication-style conn))
|
|
(repl (if (swank::connection.user-io conn) t))
|
|
(args (list "--swank-fd" (format nil "~d" clone)
|
|
"--swank-style" (format nil "~s" style)
|
|
"--swank-repl" (format nil "~s" repl))))
|
|
(swank::close-connection conn nil nil)
|
|
(swank/backend:exec-image image-file args)))
|
|
|
|
(defslimefun background-save-snapshot (image-file)
|
|
(let ((connection swank::*emacs-connection*))
|
|
(flet ((complete (success)
|
|
(let ((swank::*emacs-connection* connection))
|
|
(swank::background-message
|
|
"Dumping lisp image ~A ~:[failed!~;succeeded.~]"
|
|
image-file success)))
|
|
(awaken ()
|
|
(resurrect connection)))
|
|
(swank/backend:background-save-image image-file
|
|
:restart-function #'awaken
|
|
:completion-function #'complete)
|
|
(format nil "Started dumping lisp to ~A..." image-file))))
|
|
|
|
(in-package :swank)
|
|
|
|
(defun swank-snapshot::resurrect (old-connection)
|
|
(setq *log-output* nil)
|
|
(init-log-output)
|
|
(clear-event-history)
|
|
(setq *connections* (delete old-connection *connections*))
|
|
(format *error-output* "args: ~s~%" (command-line-args))
|
|
(let* ((fd (read-command-line-arg "--swank-fd"))
|
|
(style (read-command-line-arg "--swank-style"))
|
|
(repl (read-command-line-arg "--swank-repl"))
|
|
(* (format *error-output* "fd=~s style=~s~%" fd style))
|
|
(stream (make-fd-stream fd nil))
|
|
(connection (make-connection nil stream style)))
|
|
(let ((*emacs-connection* connection))
|
|
(when repl (swank-repl:create-repl nil))
|
|
(background-message "~A" "Lisp image restored"))
|
|
(serve-requests connection)
|
|
(simple-repl)))
|
|
|
|
(defun read-command-line-arg (name)
|
|
(let* ((args (command-line-args))
|
|
(pos (position name args :test #'equal)))
|
|
(read-from-string (elt args (1+ pos)))))
|
|
|
|
(in-package :swank-snapshot)
|
|
|
|
(provide :swank-snapshot)
|