From 6d61606ee8c5c81d5492d062bd1e15fe2165edc7 Mon Sep 17 00:00:00 2001 From: Pino Toscano Date: Wed, 29 May 2019 11:48:37 +0200 Subject: [PATCH] Enhance raise_error to be able to close handle Rename raise_error to raise_error_and_maybe_close, and add the possibility to close the specified handle before raising the OCaml exception. raise_error is left as non-closing macro. --- augeas-c.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/augeas-c.c b/augeas-c.c index f3f5223..81f87f9 100644 --- a/augeas-c.c +++ b/augeas-c.c @@ -29,6 +29,8 @@ #include #include +#include + #ifdef __GNUC__ #define NORETURN __attribute__ ((noreturn)) #else @@ -73,9 +75,11 @@ static const int error_map[] = { }; static const int error_map_len = sizeof error_map / sizeof error_map[0]; -/* Raise an Augeas.Error exception. */ +/* Raise an Augeas.Error exception, and optionally close the + * specified handle. + */ static void -raise_error (augeas_t t, const char *msg) +raise_error_and_maybe_close (augeas_t t, const char *msg, bool close_handle) { value *exn = caml_named_value ("Augeas.Error"); value args[4]; @@ -85,8 +89,11 @@ raise_error (augeas_t t, const char *msg) int ocaml_code = -1; int i; - if (code == AUG_ENOMEM) + if (code == AUG_ENOMEM) { + if (close_handle) + aug_close (t); caml_raise_out_of_memory (); + } aug_err_minor = aug_error_minor_message (t); aug_err_details = aug_error_details (t); @@ -107,8 +114,12 @@ raise_error (augeas_t t, const char *msg) args[2] = caml_copy_string (aug_err_minor ? : ""); args[3] = caml_copy_string (aug_err_details ? : ""); + if (close_handle) + aug_close (t); + caml_raise_with_args (*exn, 4, args); } +#define raise_error(t, msg) raise_error_and_maybe_close(t, msg, false) static void raise_init_error (const char *msg) -- 1.8.3.1