From: Nikodemus Siivola Date: Mon, 30 Oct 2006 11:15:03 +0000 (+0000) Subject: 0.9.18.18: SAVE-LISP-AND-DIE vs multiple threads X-Git-Url: http://repo.macrolet.net/gitweb/?a=commitdiff_plain;h=3d356deb07656ac19b28c39f38b8839ab5634e33;p=sbcl.git 0.9.18.18: SAVE-LISP-AND-DIE vs multiple threads * Check that only a single thread exists after *SAVE-HOOKS* have been run -- or signal an error. --- diff --git a/NEWS b/NEWS index e934acc..633e02e 100644 --- a/NEWS +++ b/NEWS @@ -4,6 +4,8 @@ changes in sbcl-0.9.19 (1.0.0?) relative to sbcl-0.9.18: core, and restored on startup. * improvement: GET-INTERNAL-REAL-TIME now reports the time since startup, not time since first call to GET-INTERNAL-REAL-TIME. + * improvement: SAVE-LISP-AND-DIE explicitly checks that multiple + threads are not running after *SAVE-HOOKS* have run. * bug fix: compiler bug triggered by a (non-standard) VALUES declaration in a LET* was fixed. (reported by Kaersten Poeck) * bug fix: file compiler no longer confuses validated and already diff --git a/src/code/save.lisp b/src/code/save.lisp index 246ff23..1e83ab3 100644 --- a/src/code/save.lisp +++ b/src/code/save.lisp @@ -85,19 +85,22 @@ The save/load process changes the values of some global variables: This is reinitialized to reflect the working directory where the saved core is loaded. -Foreign objects loaded with SB-ALIEN:LOAD-SHARED-OBJECT are -automatically reloaded on startup, but references to foreign symbols -do not survive intact on all platforms: in this case a WARNING is -signalled when saving the core. If no warning is signalled, then the -foreign symbol references will remain intact. Platforms where this is -currently the case are x86/FreeBSD, x86/Linux, x86/NetBSD, -sparc/Linux, sparc/SunOS, and ppc/Darwin. +Foreign objects loaded with SB-ALIEN:LOAD-SHARED-OBJECT are automatically +reloaded on startup, but references to foreign symbols do not survive intact +on all platforms: in this case a WARNING is signalled when saving the core. If +no warning is signalled, then the foreign symbol references will remain +intact. Platforms where this is currently the case are x86/FreeBSD, x86/Linux, +x86/NetBSD, sparc/Linux, sparc/SunOS, and ppc/Darwin. + +On threaded platforms only a single thread may remain running after +SB-EXT:*SAVE-HOOKS* have run. Applications using multiple threads can +be SAVE-LISP-AND-DIE friendly by registering a save-hook that quits +any additional threads, and an init-hook that restarts them. This implementation is not as polished and painless as you might like: * It corrupts the current Lisp image enough that the current process needs to be killed afterwards. This can be worked around by forking another process that saves the core. - * It will not work if multiple threads are in use. * There is absolutely no binary compatibility of core images between different runtime support programs. Even runtimes built from the same sources at different times are treated as incompatible for this @@ -145,7 +148,10 @@ sufficiently motivated to do lengthy fixes." (dolist (hook *save-hooks*) (with-simple-restart (continue "Skip this save hook.") (funcall hook))) - #!-win32 (when (fboundp 'cancel-finalization) + (when (rest (sb!thread:list-all-threads)) + (error "Cannot save core with multiple threads running.")) + #!-win32 + (when (fboundp 'cancel-finalization) (cancel-finalization sb!sys:*tty*)) (float-deinit) (profile-deinit) diff --git a/version.lisp-expr b/version.lisp-expr index d2bf15b..00729c7 100644 --- a/version.lisp-expr +++ b/version.lisp-expr @@ -17,4 +17,4 @@ ;;; checkins which aren't released. (And occasionally for internal ;;; versions, especially for internal versions off the main CVS ;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".) -"0.9.18.17" +"0.9.18.18"