summaryrefslogtreecommitdiffstats
path: root/src/H5Eprivate.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/H5Eprivate.h')
-rw-r--r--src/H5Eprivate.h169
1 files changed, 75 insertions, 94 deletions
diff --git a/src/H5Eprivate.h b/src/H5Eprivate.h
index 8b59828..885ad44 100644
--- a/src/H5Eprivate.h
+++ b/src/H5Eprivate.h
@@ -1,13 +1,13 @@
/****************************************************************************
- * NCSA HDF *
- * Software Development Group *
- * National Center for Supercomputing Applications *
- * University of Illinois at Urbana-Champaign *
- * 605 E. Springfield, Champaign IL 61820 *
- * *
- * For conditions of distribution and use, see the accompanying *
- * hdf/COPYING file. *
- * *
+ * NCSA HDF *
+ * Software Development Group *
+ * National Center for Supercomputing Applications *
+ * University of Illinois at Urbana-Champaign *
+ * 605 E. Springfield, Champaign IL 61820 *
+ * *
+ * For conditions of distribution and use, see the accompanying *
+ * hdf/COPYING file. *
+ * *
****************************************************************************/
/*
@@ -21,113 +21,94 @@
/* Private headers needed by this file */
#include <H5private.h>
-/*
- ======================================================================
- Error codes
+#define H5E_NSLOTS 32 /*number of slots in an error stack */
- NOTE: Remember to update the error_messages[] structure later in this file
- whenever errors are added/deleted from this list.
- ======================================================================
+/*
+ * HERROR macro, used to facilitate error reporting between a FUNC_ENTER()
+ * 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, min, str) H5E_push(maj, min, FUNC, __FILE__, __LINE__, str)
-/* HERROR macro, used to facilitate error reporting. Assumes that
- there's a variable called FUNC which holds the function name.
- Assume that func and file are both stored in static space, or at
- least be not corrupted in the meanwhile. */
-#define HERROR(maj, min, str) H5Epush (H5E_thrdid_g, maj, min, \
- FUNC, __FILE__, __LINE__, str)
-
-/* HRETURN_ERROR macro, used to facilitate error reporting. Makes
- same assumptions as HERROR. IN ADDITION, this macro causes
- a return from the calling routine */
-#define HRETURN_ERROR(maj, min, ret_val, str) { \
- HERROR (maj, min, str); \
- PABLO_TRACE_OFF (PABLO_MASK, pablo_func_id); \
- return (ret_val); \
+/*
+ * HRETURN_ERROR macro, used to facilitate error reporting between a
+ * FUNC_ENTER() and a FUNC_LEAVE() within a function body. The arguments are
+ * the major error number, the minor error number, a return value, and a
+ * description of the error.
+ */
+#define HRETURN_ERROR(maj, min, ret_val, str) { \
+ HERROR (maj, min, str); \
+ if (H5_IS_API(FUNC) && H5E_auto_g) { \
+ (H5E_auto_g)(H5E_auto_data_g); \
+ } \
+ PABLO_TRACE_OFF (PABLO_MASK, pablo_func_id); \
+ return (ret_val); \
}
-/* HRETURN macro, similar to HRETURN_ERROR() except for success */
-#define HRETURN(ret_val) { \
- PABLO_TRACE_OFF (PABLO_MASK, pablo_func_id); \
- return (ret_val); \
+/*
+ * HRETURN macro, used to facilitate returning from a function between a
+ * FUNC_ENTER() and a FUNC_LEAVE() within a function body. The argument is
+ * the return value.
+ */
+#define HRETURN(ret_val) { \
+ PABLO_TRACE_OFF (PABLO_MASK, pablo_func_id); \
+ return (ret_val); \
}
-/* HGOTO_ERROR macro, used to facilitate error reporting. Makes
- same assumptions as HERROR. IN ADDITION, this macro causes
- a jump to the label 'done' which should be in every fucntion
- Also there is an assumption of a variable 'ret_value' */
-#define HGOTO_ERROR(maj, min, ret_val, str) { \
- HERROR (maj, min, str); \
- ret_value = ret_val; \
- goto done; \
+/*
+ * HGOTO_ERROR macro, used to facilitate error reporting between a
+ * FUNC_ENTER() and a FUNC_LEAVE() within a function body. The arguments are
+ * the major error number, the minor error number, the return value, and an
+ * 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) { \
+ HERROR (maj, min, str); \
+ if (H5_IS_API(FUNC) && H5E_auto_g) { \
+ (H5E_auto_g)(H5E_auto_data_g); \
+ } \
+ ret_value = ret_val; \
+ goto done; \
}
-/* HGOTO_DONE macro, used to facilitate the new error reporting model.
- This macro is just a wrapper to set the return value and jump to the 'done'
- label. Also assumption of a variable 'ret_value' */
+/*
+ * HGOTO_DONE macro, used to facilitate normal return between a FUNC_ENTER()
+ * and a FUNC_LEAVE() within a function body. The argument is the return
+ * value which is assigned to the `ret_value' variable. Control branches to
+ * the `done' label.
+ */
#define HGOTO_DONE(ret_val) {ret_value = ret_val; goto done;}
-/* H5ECLEAR macro, used to facilitate the new error reporting model.
- This macro is just a wrapper to clear the error stack with the thread
- error ID */
-#define H5ECLEAR H5Eclear(H5E_thrdid_g)
-
-/* Maximum length of function name to push onto error stack */
-#define MAX_FUNC_NAME 32
-
/*
- * error_messages is the list of error messages in the system, kept as
- * error_code-message pairs.
+ * The list of error messages in the system is kept as an array of
+ * error_code/message pairs, one for major error numbers and another for
+ * minor error numbers.
*/
typedef struct H5E_major_mesg_t {
H5E_major_t error_code;
- const char *str;
+ const char *str;
} H5E_major_mesg_t;
typedef struct H5E_minor_mesg_t {
H5E_minor_t error_code;
- const char *str;
+ const char *str;
} H5E_minor_mesg_t;
-/* Function pointer to report errors through */
-struct H5E_t; /*forward decl */
-typedef herr_t (*H5E_push_t)(struct H5E_t *estack, H5E_major_t maj_num,
- H5E_minor_t min_num, const char *function_name,
- const char *file_name, intn line,
- const char *desc);
-
-/*
- * We use a stack to hold the errors plus we keep track of the function, file
- * and line where the error occurs.
- */
-
-/* the structure of the error stack element */
-typedef struct H5E_error_t {
- H5E_major_t maj_num; /*major error number */
- H5E_minor_t min_num; /*minor error number */
- char func_name[MAX_FUNC_NAME]; /*function where error occur */
- const char *file_name; /*file where error occur */
- intn line; /*line in file where error occurs */
- char *desc; /*optional supplied description */
-} H5E_error_t;
-
-/* Structure to store error information for a thread */
+/* An error stack */
typedef struct H5E_t {
- uintn nelmts; /*num elements allocated in the stack */
- uintn top; /*index of the next open stack element */
- H5E_error_t *stack; /*pointer to the error stack */
- H5E_push_t push; /*func that pushes new error on stack */
+ uintn nused; /*num slots currently used in stack */
+ H5E_error_t slot[H5E_NSLOTS]; /*array of error records */
} H5E_t;
-/* Private global variables in H5E.c */
-extern hid_t H5E_thrdid_g; /* Thread-specific "global" error-handler ID */
-extern hbool_t install_atexit; /* Whether to install the atexit routine */
-extern const hbool_t H5E_clearable_g; /* Safe to call H5Eclear() on enter?*/
-
-herr_t H5E_close (H5E_t *estack);
-herr_t H5E_clear (H5E_t *estack);
-herr_t H5E_print (H5E_t *estack, FILE * file);
-herr_t H5E_push (H5E_t *estack, H5E_major_t maj_num, H5E_minor_t min_num,
- const char *function_name, const char *file_name, intn line,
- const char *desc);
+extern const hbool_t H5E_clearable_g; /*safe to call H5E_clear() on enter? */
+extern herr_t (*H5E_auto_g)(void *client_data);
+extern void *H5E_auto_data_g;
+
+herr_t H5E_push (H5E_major_t maj_num, H5E_minor_t min_num,
+ const char *func_name, const char *file_name, unsigned line,
+ const char *desc);
+herr_t H5E_clear (void);
+herr_t H5E_walk (H5E_direction_t dir, H5E_walk_t func, void *client_data);
+
+
#endif