mirror of
git://git.gnupg.org/gnupg.git
synced 2024-12-22 10:19:57 +01:00
tests: Implement interpreter shutdown using exceptions.
* 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>
This commit is contained in:
parent
58007e5259
commit
9a0659a65c
@ -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);
|
||||
|
@ -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))
|
||||
|
Loading…
x
Reference in New Issue
Block a user