gpgscm: Implement 'atexit'.
authorJustus Winter <justus@g10code.com>
Fri, 4 Nov 2016 11:08:20 +0000 (12:08 +0100)
committerJustus Winter <justus@g10code.com>
Fri, 4 Nov 2016 11:42:00 +0000 (12:42 +0100)
* tests/gpgscm/ffi.scm (throw): Run *run-atexit-handlers* when
terminating the interpreter.
(*atexit-handlers*): New variable.
(*run-atexit-handlers*): New function.
(atexit): Likewise.
* tests/gpgscm/main.c (main): Run *run-atexit-handlers* at normal
interpreter shutdown.

Signed-off-by: Justus Winter <justus@g10code.com>
tests/gpgscm/ffi.scm
tests/gpgscm/main.c

index 72a2a8f..fb18538 100644 (file)
@@ -57,6 +57,7 @@
    ((more-handlers?)
     (apply (pop-handler) x))
    ((and (= 2 (length x)) (equal? *interpreter-exit* (car x)))
+    (*run-atexit-handlers*)
     (_exit (cadr x)))
    (else
     (apply error x))))
 ;; Terminate the process returning STATUS to the parent.
 (define (exit status)
   (throw *interpreter-exit* status))
+
+;; A list of functions run at interpreter shutdown.
+(define *atexit-handlers* (list))
+
+;; Execute all these functions.
+(define (*run-atexit-handlers*)
+  (unless (null? *atexit-handlers*)
+         (let ((proc (car *atexit-handlers*)))
+           ;; Drop proc from the list so that it will not get
+           ;; executed again even if it raises an exception.
+           (set! *atexit-handlers* (cdr *atexit-handlers*))
+           (proc)
+           (*run-atexit-handlers*))))
+
+;; Register a function to be run at interpreter shutdown.
+(define (atexit proc)
+  (set! *atexit-handlers* (cons proc *atexit-handlers*)))
index f7c6b0d..70ce855 100644 (file)
@@ -291,6 +291,7 @@ main (int argc, char **argv)
         log_fatal ("%s: %s", script, gpg_strerror (err));
     }
 
+  scheme_load_string (sc, "(*run-atexit-handlers*)");
   scheme_deinit (sc);
   xfree (sc);
   return EXIT_SUCCESS;