unofficial mirror of bug-guile@gnu.org 
 help / color / mirror / Atom feed
* 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).