void ompi_file_set_errhandler_f(MPI_Fint *fh, MPI_Fint *errhandler, MPI_Fint *ierr) { int c_ierr; MPI_File c_fh = PMPI_File_f2c(*fh); MPI_Errhandler c_err = PMPI_Errhandler_f2c(*errhandler); c_ierr = PMPI_File_set_errhandler(c_fh, c_err); if (NULL != ierr) *ierr = OMPI_INT_2_FINT(c_ierr); }
void ADIO_End(int *error_code) { ADIOI_Flatlist_node *curr, *next; ADIOI_Datarep *datarep, *datarep_next; /* FPRINTF(stderr, "reached end\n"); */ /* if a default errhandler was set on MPI_FILE_NULL then we need to ensure * that our reference to that errhandler is released */ /* Open MPI: The call to PMPI_File_set_errhandler has to be done in romio/src/io_romio_file_open.c in routine mca_io_romio_file_close() */ #if 0 PMPI_File_set_errhandler(MPI_FILE_NULL, MPI_ERRORS_RETURN); #endif /* delete the flattened datatype list */ curr = ADIOI_Flatlist; while (curr) { if (curr->blocklens) ADIOI_Free(curr->blocklens); if (curr->indices) ADIOI_Free(curr->indices); next = curr->next; ADIOI_Free(curr); curr = next; } ADIOI_Flatlist = NULL; /* free file and info tables used for Fortran interface */ if (ADIOI_Ftable) ADIOI_Free(ADIOI_Ftable); #ifndef HAVE_MPI_INFO if (MPIR_Infotable) ADIOI_Free(MPIR_Infotable); #endif /* free the memory allocated for a new data representation, if any */ datarep = ADIOI_Datarep_head; while (datarep) { datarep_next = datarep->next; ADIOI_Free(datarep->name); ADIOI_Free(datarep); datarep = datarep_next; } if( ADIOI_syshints != MPI_INFO_NULL) MPI_Info_free(&ADIOI_syshints); MPI_Op_free(&ADIO_same_amode); *error_code = MPI_SUCCESS; }
int MPI_File_set_errhandler(MPI_File fh, MPI_Errhandler errhandler) { _MPI_COVERAGE(); return PMPI_File_set_errhandler(fh, errhandler); }
/*@ MPI_File_close - Closes a file Input Parameters: . fh - file handle (handle) .N fortran @*/ int MPI_File_close(MPI_File *fh) { int error_code; ADIO_File adio_fh; static char myname[] = "MPI_FILE_CLOSE"; #ifdef MPI_hpux int fl_xmpi; HPMP_IO_WSTART(fl_xmpi, BLKMPIFILECLOSE, TRDTBLOCK, *adio_fh); #endif /* MPI_hpux */ MPIU_THREAD_CS_ENTER(ALLFUNC,); adio_fh = MPIO_File_resolve(*fh); /* --BEGIN ERROR HANDLING-- */ MPIO_CHECK_FILE_HANDLE(adio_fh, myname, error_code); /* --END ERROR HANDLING-- */ if (ADIO_Feature(adio_fh, ADIO_SHARED_FP)) { ADIOI_Free((adio_fh)->shared_fp_fname); /* POSIX semantics say a deleted file remains available until all * processes close the file. But since when was NFS posix-compliant? */ if (!ADIO_Feature(adio_fh, ADIO_UNLINK_AFTER_CLOSE)) { MPI_Barrier((adio_fh)->comm); } if ((adio_fh)->shared_fp_fd != ADIO_FILE_NULL) { MPI_File *fh_shared = &(adio_fh->shared_fp_fd); ADIO_Close((adio_fh)->shared_fp_fd, &error_code); MPIO_File_free(fh_shared); /* --BEGIN ERROR HANDLING-- */ if (error_code != MPI_SUCCESS) goto fn_fail; /* --END ERROR HANDLING-- */ } } /* Because ROMIO expects the MPI library to provide error handler management * routines but it doesn't ever participate in MPI_File_close, we have to * somehow inform the MPI library that we no longer hold a reference to any * user defined error handler. We do this by setting the errhandler at this * point to MPI_ERRORS_RETURN. */ error_code = PMPI_File_set_errhandler(*fh, MPI_ERRORS_RETURN); if (error_code != MPI_SUCCESS) goto fn_fail; ADIO_Close(adio_fh, &error_code); MPIO_File_free(fh); /* --BEGIN ERROR HANDLING-- */ if (error_code != MPI_SUCCESS) goto fn_fail; /* --END ERROR HANDLING-- */ #ifdef MPI_hpux HPMP_IO_WEND(fl_xmpi); #endif /* MPI_hpux */ fn_exit: MPIU_THREAD_CS_EXIT(ALLFUNC,); return error_code; fn_fail: /* --BEGIN ERROR HANDLING-- */ error_code = MPIO_Err_return_file(adio_fh, error_code); goto fn_exit; /* --END ERROR HANDLING-- */ }