/**************************************************************************** * 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. * * * ****************************************************************************/ /* * Header file for error values, etc. */ #ifndef _H5Eprivate_H #define _H5Eprivate_H #include "H5Epublic.h" /* Private headers needed by this file */ #include "H5private.h" #define H5E_NSLOTS 32 /*number of slots in an error stack */ /* * 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) /* * HCOMMON_ERROR macro, used by HRETURN_ERROR and HGOTO_ERROR * (Shouldn't need to be used outside this header file) */ #define HCOMMON_ERROR(maj, min, str) \ HERROR (maj, min, str); \ if (H5_IS_API(FUNC) && H5E_auto_g) \ (H5E_auto_g)(H5E_auto_data_g) /* * 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) { \ HCOMMON_ERROR (maj, min, str); \ HRETURN(ret_val); \ } /* * HDONE_ERROR macro, used to facilitate error reporting between a * FUNC_ENTER() and a FUNC_LEAVE() within a function body, but _AFTER_ the * "done:" label. The arguments are * the major error number, the minor error number, a return value, and a * description of the error. */ #define HDONE_ERROR(maj, min, ret_val, str) { \ HCOMMON_ERROR (maj, min, str); \ ret_value = 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); \ H5TRACE_RETURN(ret_val); \ H5_API_UNLOCK \ H5_API_SET_CANCEL \ return (ret_val); \ } /* * 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) { \ HCOMMON_ERROR (maj, min, str); \ HGOTO_DONE (ret_val); \ } /* * 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;} /* * 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; } H5E_major_mesg_t; typedef struct H5E_minor_mesg_t { H5E_minor_t error_code; const char *str; } H5E_minor_mesg_t; /* An error stack */ typedef struct H5E_t { int nused; /*num slots currently used in stack */ H5E_error_t slot[H5E_NSLOTS]; /*array of error records */ } H5E_t; __DLLVAR__ const hbool_t H5E_clearable_g;/*safe to call H5E_clear() on enter?*/ __DLLVAR__ herr_t (*H5E_auto_g)(void *client_data); __DLLVAR__ void *H5E_auto_data_g; __DLL__ 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); __DLL__ herr_t H5E_clear (void); __DLL__ herr_t H5E_walk (H5E_direction_t dir, H5E_walk_t func, void *client_data); #endif #ifdef H5_HAVE_PARALLEL /* * MPI error handling macros. */ extern char H5E_mpi_error_str[MPI_MAX_ERROR_STRING]; extern int H5E_mpi_error_str_len; #define HMPI_ERROR(mpierr){ \ MPI_Error_string(mpierr, H5E_mpi_error_str, &H5E_mpi_error_str_len); \ HERROR(H5E_INTERNAL, H5E_MPIERRSTR, H5E_mpi_error_str); \ } #define HMPI_DONE_ERROR(retcode, str, mpierr){ \ HMPI_ERROR(mpierr); \ HDONE_ERROR(H5E_INTERNAL, H5E_MPI, retcode, str); \ } #define HMPI_GOTO_ERROR(retcode, str, mpierr){ \ HMPI_ERROR(mpierr); \ HGOTO_ERROR(H5E_INTERNAL, H5E_MPI, retcode, str); \ } #define HMPI_RETURN_ERROR(retcode, str, mpierr){ \ HMPI_ERROR(mpierr); \ HRETURN_ERROR(H5E_INTERNAL, H5E_MPI, retcode, str); \ } #endif