diff options
Diffstat (limited to 'src/H5Eprivate.h')
-rw-r--r-- | src/H5Eprivate.h | 87 |
1 files changed, 65 insertions, 22 deletions
diff --git a/src/H5Eprivate.h b/src/H5Eprivate.h index 05ce10e..4c226d0 100644 --- a/src/H5Eprivate.h +++ b/src/H5Eprivate.h @@ -32,15 +32,15 @@ typedef struct H5E_t H5E_t; * and a FUNC_LEAVE() within a function body. The arguments are the major * error number, the minor error number, and a description of the error. */ -#define HERROR(maj_id, min_id, str) H5E_push_stack(NULL, __FILE__, FUNC, __LINE__, H5E_ERR_CLS_g, maj_id, min_id, str) +#define HERROR(maj_id, min_id, ...) H5E_printf_stack(NULL, __FILE__, FUNC, __LINE__, H5E_ERR_CLS_g, maj_id, min_id, __VA_ARGS__) /* * HCOMMON_ERROR macro, used by HDONE_ERROR and HGOTO_ERROR * (Shouldn't need to be used outside this header file) */ -#define HCOMMON_ERROR(maj, min, str) \ - HERROR(maj, min, str); \ - (void)H5E_dump_api_stack((int)H5_IS_API(FUNC)); +#define HCOMMON_ERROR(maj, min, ...) \ + HERROR(maj, min, __VA_ARGS__); \ + err_occurred = TRUE; /* * HDONE_ERROR macro, used to facilitate error reporting between a @@ -51,8 +51,8 @@ typedef struct H5E_t H5E_t; * (This macro can also be used to push an error and set the return value * without jumping to any labels) */ -#define HDONE_ERROR(maj, min, ret_val, str) { \ - HCOMMON_ERROR(maj, min, str); \ +#define HDONE_ERROR(maj, min, ret_val, ...) { \ + HCOMMON_ERROR(maj, min, __VA_ARGS__); \ ret_value = ret_val; \ } @@ -63,8 +63,8 @@ typedef struct H5E_t H5E_t; * error string. The return value is assigned to a variable `ret_value' and * control branches to the `done' label. */ -#define HGOTO_ERROR(maj, min, ret_val, str) { \ - HCOMMON_ERROR(maj, min, str); \ +#define HGOTO_ERROR(maj, min, ret_val, ...) { \ + HCOMMON_ERROR(maj, min, __VA_ARGS__); \ HGOTO_DONE(ret_val) \ } @@ -76,13 +76,6 @@ typedef struct H5E_t H5E_t; */ #define HGOTO_DONE(ret_val) {ret_value = ret_val; goto done;} -/* Library-private functions defined in H5E package */ -H5_DLL herr_t H5E_init(void); -H5_DLL herr_t H5E_push_stack(H5E_t *estack, const char *file, const char *func, unsigned line, - hid_t cls_id, hid_t maj_id, hid_t min_id, const char *desc); -H5_DLL herr_t H5E_clear_stack(H5E_t *estack); -H5_DLL herr_t H5E_dump_api_stack(int is_api); - /* * Macros handling system error messages as described in C standard. * These macros assume errnum is a valid system error code. @@ -91,16 +84,13 @@ H5_DLL herr_t H5E_dump_api_stack(int is_api); /* Retrieve the error code description string and push it onto the error * stack. */ -#define HSYS_ERROR(errnum) { \ - HERROR(H5E_INTERNAL, H5E_SYSERRSTR, HDstrerror(errnum)); \ -} #define HSYS_DONE_ERROR(majorcode, minorcode, retcode, str) { \ - HSYS_ERROR(errno); \ - HDONE_ERROR(majorcode, minorcode, retcode, str); \ + int myerrno = errno; \ + HDONE_ERROR(majorcode, minorcode, retcode, "%s, errno = %d, error message = '%s'", str, myerrno, HDstrerror(myerrno)); \ } #define HSYS_GOTO_ERROR(majorcode, minorcode, retcode, str) { \ - HSYS_ERROR(errno); \ - HGOTO_ERROR(majorcode, minorcode, retcode, str); \ + int myerrno = errno; \ + HGOTO_ERROR(majorcode, minorcode, retcode, "%s, errno = %d, error message = '%s'", str, myerrno, HDstrerror(myerrno)); \ } #ifdef H5_HAVE_PARALLEL @@ -125,5 +115,58 @@ extern int H5E_mpi_error_str_len; } #endif /* H5_HAVE_PARALLEL */ + +/******************************************************************************/ +/* Revisions to Error Macros, to go with Revisions to FUNC_ENTER/LEAVE Macros */ +/******************************************************************************/ + +/* + * H5E_PRINTF macro, used to facilitate error reporting between a BEGIN_FUNC() + * and an END_FUNC() within a function body. The arguments are the minor + * error number, a description of the error (as a printf-like format string), + * and an optional set of arguments for the printf format arguments. + */ +#define H5E_PRINTF(...) H5E_printf_stack(NULL, __FILE__, FUNCNAME, __LINE__, H5E_ERR_CLS_g, H5_MY_PKG_ERR, __VA_ARGS__) + +/* + * H5_LEAVE macro, used to facilitate control flow between a + * BEGIN_FUNC() and an END_FUNC() within a function body. The argument is + * the return value. + * The return value is assigned to a variable `ret_value' and control branches + * to the `catch_except' label, if we're not already past it. + */ +#define H5_LEAVE(v) { \ + ret_value = v; \ + if(!past_catch) \ + goto catch_except; \ +} + +/* + * H5E_THROW macro, used to facilitate error reporting between a + * FUNC_ENTER() and a FUNC_LEAVE() within a function body. The arguments are + * the minor error number, and an error string. + * The return value is assigned to a variable `ret_value' and control branches + * to the `catch_except' label, if we're not already past it. + */ +#define H5E_THROW(...) { \ + H5E_PRINTF(__VA_ARGS__); \ + H5_LEAVE(fail_value) \ +} + +/* Macro for "catching" flow of control when an error occurs. Note that the + * H5_LEAVE macro won't jump back here once it's past this point. + */ +#define CATCH past_catch = TRUE; catch_except:; + + +/* Library-private functions defined in H5E package */ +H5_DLL herr_t H5E_init(void); +H5_DLL herr_t H5E_push_stack(H5E_t *estack, const char *file, const char *func, + unsigned line, hid_t cls_id, hid_t maj_id, hid_t min_id, const char *desc); +H5_DLL herr_t H5E_printf_stack(H5E_t *estack, const char *file, const char *func, + unsigned line, hid_t cls_id, hid_t maj_id, hid_t min_id, const char *fmt, ...); +H5_DLL herr_t H5E_clear_stack(H5E_t *estack); +H5_DLL herr_t H5E_dump_api_stack(hbool_t is_api); + #endif /* _H5Eprivate_H */ |