* bug#10581: exit-hook is undocumented and is not called from a non-interactive environment @ 2012-01-22 19:58 Andrew Psaltis 2012-01-23 2:08 ` Ian Price 2012-02-05 11:50 ` Andy Wingo 0 siblings, 2 replies; 5+ messages in thread From: Andrew Psaltis @ 2012-01-22 19:58 UTC (permalink / raw) To: 10581 Currently using guile version 1.8.8. I have been told that this also affects the current upstream version as well. My current project involves using a C library that has some initialization and cleanup functions. First: The library initialization part is well-handled, but I could not find a way to do the library cleanup part. After doing some web searches, I found an answer in "exit-hook", except that it was not clear from the Guile reference manual that it existed. It should probably be documented a little more clearly. Second: When I write a scheme script that adds some function to exit-hook, it is not invoked from a non-interactive call to guile. I have a file test.scm that looks like so: (add-hook! exit-hook (lambda () (display "bye\n"))) In an interactive environment: $ guile -l test.scm guile> (exit) bye $ In a non-interactive environment: $ guile -s test.scm $ Nothing is printed. As far as I can tell, exit-hook should be made available in a non-interactive environment so that modules loading libraries can cleanup easily. ^ permalink raw reply [flat|nested] 5+ messages in thread
* bug#10581: exit-hook is undocumented and is not called from a non-interactive environment 2012-01-22 19:58 bug#10581: exit-hook is undocumented and is not called from a non-interactive environment Andrew Psaltis @ 2012-01-23 2:08 ` Ian Price 2012-02-05 11:50 ` Andy Wingo 1 sibling, 0 replies; 5+ messages in thread From: Ian Price @ 2012-01-23 2:08 UTC (permalink / raw) To: Andrew Psaltis; +Cc: 10581 [-- Attachment #1: Type: text/plain, Size: 1390 bytes --] Andrew Psaltis <ampsaltis@gmail.com> writes: > Second: > When I write a scheme script that adds some function to exit-hook, it > is not invoked from a non-interactive call to guile. I have a file > test.scm that looks like so: > > (add-hook! exit-hook (lambda () (display "bye\n"))) > > In an interactive environment: > > $ guile -l test.scm > guile> (exit) > bye > $ > > In a non-interactive environment: > $ guile -s test.scm > $ > > Nothing is printed. As far as I can tell, exit-hook should be made > available in a non-interactive environment so that modules loading > libraries can cleanup easily. Assuming exit-hook is supposed to do this, and I would presume it is meant to. I have a patch which will implement this for stable-2.0. Basically, I wrap everything in a large catch, and when guile gets a 'quit exception it runs the exit hooks before throwing the exception again. As far as I can see, this covers the case where guile exits normally either by use of quit/exit, or just by finishing the script. It does _not_ perform the cleanup if guile quits because of an uncaught exception, but if someone thinks this is desirable, it should be a matter of changing the catch. I'm not quite sure how to add a test case for this though. -- Ian Price "Programming is like pinball. The reward for doing it well is the opportunity to do it again" - from "The Wizardy Compiled" [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #2: exit-hook patch --] [-- Type: text/x-patch, Size: 3738 bytes --] From baaf226cb91a41de66b7dc663c433c67f1c0f0e5 Mon Sep 17 00:00:00 2001 From: Ian Price <ianprice90@googlemail.com> Date: Sun, 22 Jan 2012 19:47:16 +0000 Subject: [PATCH] Run exit-hook when scripts finish normally. * module/ice-9/command-line.scm (compile-shell-switches): Wrap the body of the output expression in a catch for `quit' exceptions, so that we can run the `exit-hook'. --- module/ice-9/command-line.scm | 68 +++++++++++++++++++++------------------- 1 files changed, 36 insertions(+), 32 deletions(-) diff --git a/module/ice-9/command-line.scm b/module/ice-9/command-line.scm index 8aed74e..e33fac8 100644 --- a/module/ice-9/command-line.scm +++ b/module/ice-9/command-line.scm @@ -385,38 +385,42 @@ If FILE begins with `-' the -s switch is mandatory. `(;; It would be nice not to load up (ice-9 control), but the ;; default-prompt-handler is nontrivial. (@ (ice-9 control) %) - (begin - ;; If we didn't end with a -c or a -s and didn't supply a -q, load - ;; the user's customization file. - ,@(if (and interactive? (not inhibit-user-init?)) - '((load-user-init)) - '()) - - ;; Use-specified extensions. - ,@(map (lambda (ext) - `(set! %load-extensions (cons ,ext %load-extensions))) - user-extensions) - - ;; Add the user-specified load path here, so it won't be in - ;; effect during the loading of the user's customization file. - ,@(map (lambda (path) - `(set! %load-path (cons ,path %load-path))) - user-load-path) - - ;; Put accumulated actions in their correct order. - ,@(reverse! out) - - ;; Handle the `-e' switch, if it was specified. - ,@(if entry-point - `((,entry-point (command-line))) - '()) - ,(if interactive? - ;; If we didn't end with a -c or a -s, start the - ;; repl. - '((@ (ice-9 top-repl) top-repl)) - ;; Otherwise, after doing all the other actions - ;; prescribed by the command line, quit. - '(quit))))) + (catch 'quit + (lambda () + ;; If we didn't end with a -c or a -s and didn't supply a -q, load + ;; the user's customization file. + ,@(if (and interactive? (not inhibit-user-init?)) + '((load-user-init)) + '()) + + ;; Use-specified extensions. + ,@(map (lambda (ext) + `(set! %load-extensions (cons ,ext %load-extensions))) + user-extensions) + + ;; Add the user-specified load path here, so it won't be in + ;; effect during the loading of the user's customization file. + ,@(map (lambda (path) + `(set! %load-path (cons ,path %load-path))) + user-load-path) + + ;; Put accumulated actions in their correct order. + ,@(reverse! out) + + ;; Handle the `-e' switch, if it was specified. + ,@(if entry-point + `((,entry-point (command-line))) + '()) + ,(if interactive? + ;; If we didn't end with a -c or a -s, start the + ;; repl. + '((@ (ice-9 top-repl) top-repl)) + ;; Otherwise, after doing all the other actions + ;; prescribed by the command line, quit. + '(quit))) + (lambda args + (run-hook exit-hook) + (apply throw args))))) (if (pair? args) (begin -- 1.7.7.5 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* bug#10581: exit-hook is undocumented and is not called from a non-interactive environment 2012-01-22 19:58 bug#10581: exit-hook is undocumented and is not called from a non-interactive environment Andrew Psaltis 2012-01-23 2:08 ` Ian Price @ 2012-02-05 11:50 ` Andy Wingo 2012-02-05 19:20 ` Andrew Psaltis 2012-07-06 11:21 ` Andy Wingo 1 sibling, 2 replies; 5+ messages in thread From: Andy Wingo @ 2012-02-05 11:50 UTC (permalink / raw) To: Andrew Psaltis; +Cc: 10581 Hi Andrew, On Sun 22 Jan 2012 20:58, Andrew Psaltis <ampsaltis@gmail.com> writes: > After doing some web searches, I found an answer in "exit-hook", > except that it was not clear from the Guile reference manual that it > existed. It should probably be documented a little more clearly. It's not documented at all, actually. It was added in 1998 to boot-9.scm with the following comment: ;;; This hook is run at the very end of an interactive session. ;;; (define exit-hook (make-hook)) It has not been changed since then. > When I write a scheme script that adds some function to exit-hook, it > is not invoked from a non-interactive call to guile. Indeed, as the comment notes. I think it's fair to say that this is a historical interface, and that it probably shouldn't be changed. Why not use atexit(), if you need to clean up the C library? Just wondering. Andy -- http://wingolog.org/ ^ permalink raw reply [flat|nested] 5+ messages in thread
* bug#10581: exit-hook is undocumented and is not called from a non-interactive environment 2012-02-05 11:50 ` Andy Wingo @ 2012-02-05 19:20 ` Andrew Psaltis 2012-07-06 11:21 ` Andy Wingo 1 sibling, 0 replies; 5+ messages in thread From: Andrew Psaltis @ 2012-02-05 19:20 UTC (permalink / raw) To: Andy Wingo; +Cc: 10581 On Sun, Feb 5, 2012 at 06:50, Andy Wingo <wingo@pobox.com> wrote: > Hi Andrew, > > On Sun 22 Jan 2012 20:58, Andrew Psaltis <ampsaltis@gmail.com> writes: > >> After doing some web searches, I found an answer in "exit-hook", >> except that it was not clear from the Guile reference manual that it >> existed. It should probably be documented a little more clearly. > > It's not documented at all, actually. It was added in 1998 to > boot-9.scm with the following comment: > > ;;; This hook is run at the very end of an interactive session. > ;;; > (define exit-hook (make-hook)) > > It has not been changed since then. > Ah, yes. >> When I write a scheme script that adds some function to exit-hook, it >> is not invoked from a non-interactive call to guile. > > Indeed, as the comment notes. > > I think it's fair to say that this is a historical interface, and that > it probably shouldn't be changed. > > Why not use atexit(), if you need to clean up the C library? Just > wondering. > That would be because I forgot that it existed. I probably should just use that instead. Thanks. ~Andrew ^ permalink raw reply [flat|nested] 5+ messages in thread
* bug#10581: exit-hook is undocumented and is not called from a non-interactive environment 2012-02-05 11:50 ` Andy Wingo 2012-02-05 19:20 ` Andrew Psaltis @ 2012-07-06 11:21 ` Andy Wingo 1 sibling, 0 replies; 5+ messages in thread From: Andy Wingo @ 2012-07-06 11:21 UTC (permalink / raw) To: 10581-done Hi, Closing out this bug, as it seems that the current situation shouldn't be changed, and also that atexit sounds sufficient. Please open a new report if you still have issues :) Regards, Andy -- http://wingolog.org/ ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2012-07-06 11:21 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2012-01-22 19:58 bug#10581: exit-hook is undocumented and is not called from a non-interactive environment Andrew Psaltis 2012-01-23 2:08 ` Ian Price 2012-02-05 11:50 ` Andy Wingo 2012-02-05 19:20 ` Andrew Psaltis 2012-07-06 11:21 ` Andy Wingo
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).