tests: Implement interpreter shutdown using exceptions.
authorJustus Winter <justus@g10code.com>
Mon, 19 Sep 2016 16:42:36 +0000 (18:42 +0200)
committerJustus Winter <justus@g10code.com>
Mon, 19 Sep 2016 16:49:17 +0000 (18:49 +0200)
* tests/gpgscm/ffi.c (ffi_init): Rename 'exit' to '_exit'.
* tests/gpgscm/ffi.scm (*interpreter-exit*): New variable.
(throw): New function.
(exit): New function.
--
This allows a proper cleanup of resources.

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

index 0816067..4559f10 100644 (file)
@@ -1255,7 +1255,7 @@ ffi_init (scheme *sc, const char *argv0, const char *scriptname,
   ffi_define_function (sc, strerror);
   ffi_define_function (sc, getenv);
   ffi_define_function (sc, setenv);
-  ffi_define_function (sc, exit);
+  ffi_define_function_name (sc, "_exit", exit);
   ffi_define_function (sc, open);
   ffi_define_function (sc, fdopen);
   ffi_define_function (sc, close);
index 7c2f93a..72a2a8f 100644 (file)
 ;; Pseudo-definitions for foreign functions.  Evaluates to no code,
 ;; but serves as documentation.
 (macro (ffi-define form))
+
+;; Runtime support.
+
+;; Low-level mechanism to terminate the process.
+(ffi-define (_exit status))
+
+;; High-level mechanism to terminate the process is to throw an error
+;; of the form (*interpreter-exit* status).  This gives automatic
+;; resource management a chance to clean up.
+(define *interpreter-exit* (gensym))
+(define (throw . x)
+  (cond
+   ((more-handlers?)
+    (apply (pop-handler) x))
+   ((and (= 2 (length x)) (equal? *interpreter-exit* (car x)))
+    (_exit (cadr x)))
+   (else
+    (apply error x))))
+
+;; Terminate the process returning STATUS to the parent.
+(define (exit status)
+  (throw *interpreter-exit* status))