diff options
-rw-r--r-- | src/H5E.c | 17 | ||||
-rw-r--r-- | src/H5Eprivate.h | 22 | ||||
-rw-r--r-- | src/H5Epublic.h | 3 | ||||
-rw-r--r-- | src/H5FDmpio.c | 17 |
4 files changed, 48 insertions, 11 deletions
@@ -1,6 +1,6 @@ /* * Copyright (C) 1998-2001 NCSA HDF - * All rights reserved. + * All rights reserved. * * Purpose: Provides error handling in the form of a stack. The * FUNC_ENTER() macro clears the error stack whenever an API @@ -29,7 +29,7 @@ * */ #include "H5private.h" /* Generic Functions */ -#include "H5Iprivate.h" /* IDs */ +#include "H5Iprivate.h" /* IDs */ #include "H5Eprivate.h" /* Private error routines */ #include "H5MMprivate.h" /* Memory management */ @@ -145,8 +145,9 @@ static const H5E_minor_mesg_t H5E_minor_mesg_g[] = { {H5E_CANTGET, "Can't get value"}, {H5E_CANTSET, "Can't set value"}, - /* Parallel I/O errors */ - {H5E_MPI, "Some MPI function failed"} + /* Parallel MPI errors */ + {H5E_MPI, "Some MPI function failed"}, + {H5E_MPIERRSTR, "MPI Error String"} }; /* Interface initialization? */ @@ -176,6 +177,14 @@ H5E_t H5E_stack_g[1]; #define H5E_get_my_stack() (H5E_stack_g+0) #endif +#ifdef H5_HAVE_PARALLEL +/* + * variables used for MPI error reporting + */ +char H5E_mpi_error_str[MPI_MAX_ERROR_STRING]; +int H5E_mpi_error_str_len; +#endif + /* * Automatic error stack traversal occurs if the traversal callback function * is non null and an API function is about to return an error. These should diff --git a/src/H5Eprivate.h b/src/H5Eprivate.h index a201111..e6f88f5 100644 --- a/src/H5Eprivate.h +++ b/src/H5Eprivate.h @@ -114,3 +114,25 @@ __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_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 diff --git a/src/H5Epublic.h b/src/H5Epublic.h index e364b7e..254fa91 100644 --- a/src/H5Epublic.h +++ b/src/H5Epublic.h @@ -186,7 +186,8 @@ typedef enum H5E_minor_t { H5E_CANTSET, /*Can't set value */ /* Parallel errors */ - H5E_MPI /*some MPI function failed */ + H5E_MPI, /*some MPI function failed */ + H5E_MPIERRSTR /*MPI Error String */ } H5E_minor_t; /* Information about an error */ diff --git a/src/H5FDmpio.c b/src/H5FDmpio.c index 0888924..d6943f6 100644 --- a/src/H5FDmpio.c +++ b/src/H5FDmpio.c @@ -1,5 +1,5 @@ /* - * Copyright © 1999-2001 NCSA + * Copyright (c) 1999-2002 NCSA * All rights reserved. * * Programmer: Robb Matzke <matzke@llnl.gov> @@ -719,6 +719,7 @@ H5FD_mpio_open(const char *name, unsigned flags, hid_t fapl_id, MPI_File fh; int mpi_amode; int mpi_rank; + int mpi_code; /* mpi return code */ MPI_Offset size; const H5FD_mpio_fapl_t *fa=NULL; H5FD_mpio_fapl_t _fa; @@ -788,8 +789,9 @@ H5FD_mpio_open(const char *name, unsigned flags, hid_t fapl_id, #endif /*OKAY: CAST DISCARDS CONST*/ - if (MPI_SUCCESS != MPI_File_open(fa->comm, (char*)name, mpi_amode, fa->info, &fh)) - HRETURN_ERROR(H5E_INTERNAL, H5E_MPI, NULL, "MPI_File_open failed"); + if (MPI_SUCCESS != + (mpi_code=MPI_File_open(fa->comm, (char*)name, mpi_amode, fa->info, &fh))) + HMPI_RETURN_ERROR(NULL, "MPI_File_open failed", mpi_code); /* Following changes in handling file-truncation made be rkyates and ppweidhaas, sep 99 */ @@ -1551,9 +1553,11 @@ H5FD_mpio_flush(H5FD_t *_file) { H5FD_mpio_t *file = (H5FD_mpio_t*)_file; int mpi_rank=-1; + int mpi_code; /* mpi return code */ uint8_t byte=0; MPI_Status mpi_stat = {0}; MPI_Offset mpi_off; + herr_t ret_value=SUCCEED; FUNC_ENTER(H5FD_mpio_flush, FAIL); @@ -1593,15 +1597,16 @@ H5FD_mpio_flush(H5FD_t *_file) } - if (MPI_SUCCESS != MPI_File_sync(file->f)) - HRETURN_ERROR(H5E_INTERNAL, H5E_MPI, FAIL, "MPI_File_sync failed"); + if (MPI_SUCCESS != (mpi_code=MPI_File_sync(file->f))) + HMPI_GOTO_ERROR(FAIL, "MPI_File_sync failed", mpi_code); +done: #ifdef H5FDmpio_DEBUG if (H5FD_mpio_Debug[(int)'t']) fprintf(stdout, "Leaving H5FD_mpio_flush\n" ); #endif - FUNC_LEAVE(SUCCEED); + FUNC_LEAVE(ret_value); } |