00001
00002
00003
00004
00005
00006
00007 #include <stdarg.h>
00008 #include <stdio.h>
00009
00010 #include "mpioimpl.h"
00011 #include "adio_extern.h"
00012
00013
00014
00015
00016
00017
00018
00019 int MPIO_Err_create_code(int lastcode, int fatal, const char fcname[],
00020 int line, int error_class, const char generic_msg[],
00021 const char specific_msg[], ... )
00022 {
00023 va_list Argp;
00024 int idx = 0;
00025 char *buf;
00026
00027 buf = (char *) ADIOI_Malloc(1024);
00028 if (buf != NULL) {
00029 idx += ADIOI_Snprintf(buf, 1023, "%s (line %d): ", fcname, line);
00030 if (specific_msg == NULL) {
00031 ADIOI_Snprintf(&buf[idx], 1023 - idx, "%s\n", generic_msg);
00032 }
00033 else {
00034 va_start(Argp, specific_msg);
00035 vsnprintf(&buf[idx], 1023 - idx, specific_msg, Argp);
00036 va_end(Argp);
00037 }
00038 FPRINTF(stderr, "%s", buf);
00039 ADIOI_Free(buf);
00040 }
00041
00042 return error_class;
00043 }
00044
00045 int MPIO_Err_return_file(MPI_File mpi_fh, int error_code)
00046 {
00047 ADIO_File adio_fh;
00048
00049 if (mpi_fh == MPI_FILE_NULL)
00050 {
00051 if (CtvAccess(ADIOI_DFLT_ERR_HANDLER) == MPI_ERRORS_ARE_FATAL ||
00052 CtvAccess(ADIOI_DFLT_ERR_HANDLER) != MPI_ERRORS_RETURN)
00053 {
00054 MPI_Abort(MPI_COMM_WORLD, 1);
00055 }
00056 else
00057 {
00058 return error_code;
00059 }
00060 }
00061
00062 adio_fh = MPIO_File_resolve(mpi_fh);
00063
00064 if (adio_fh->err_handler == MPI_ERRORS_ARE_FATAL ||
00065 adio_fh->err_handler != MPI_ERRORS_RETURN)
00066 {
00067 MPI_Abort(MPI_COMM_WORLD, 1);
00068 }
00069 else
00070 {
00071 return error_code;
00072 }
00073 }
00074
00075 int MPIO_Err_return_comm(MPI_Comm mpi_comm, int error_code)
00076 {
00077 MPI_Errhandler errh;
00078
00079 MPI_Errhandler_get(mpi_comm, &errh);
00080
00081 if (errh == MPI_ERRORS_ARE_FATAL ||
00082 errh != MPI_ERRORS_RETURN)
00083 {
00084 MPI_Abort(mpi_comm, 1);
00085 }
00086
00087 return error_code;
00088 }