aboutsummaryrefslogtreecommitdiffstats
path: root/tests/gpgscm/ffi.scm
diff options
context:
space:
mode:
Diffstat (limited to 'tests/gpgscm/ffi.scm')
-rw-r--r--tests/gpgscm/ffi.scm22
1 files changed, 22 insertions, 0 deletions
diff --git a/tests/gpgscm/ffi.scm b/tests/gpgscm/ffi.scm
index 7c2f93aba..72a2a8f1e 100644
--- a/tests/gpgscm/ffi.scm
+++ b/tests/gpgscm/ffi.scm
@@ -42,3 +42,25 @@
;; 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))