1
1

Two fixes for the ROMIO io module:

* Don't call PMPI_* anything from our module code; that's terribly
   bad form (and disallowed!).  Instead, do the proper back-end stuff
   to reset the error handler on the file handle.
 * If we've already started to MPI_Finalize, then just give up and
   don't actually perform all the file closing actions (because
   ROMIO's file close calls MPI_Barrier, which will obviously fail if
   MPI_Finalize has already been invoked).  Bad user behavior should
   be punished (by leaking resources, not closing the file properly,
   etc.).

This commit was SVN r28177.
Этот коммит содержится в:
Jeff Squyres 2013-03-18 20:11:20 +00:00
родитель f8bbfacf65
Коммит 7ac02fb9d4

Просмотреть файл

@ -51,12 +51,26 @@ mca_io_romio_file_close (ompi_file_t *fh)
int ret;
mca_io_romio_data_t *data;
/* 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. */
PMPI_File_set_errhandler(fh, MPI_ERRORS_RETURN);
/* If we've already started MPI_Finalize by this point, then just
give up (because ROMIO's file close routine calls MPI_Barrier,
which we obviously can't do if we've started to MPI_Finalize).
The user didn't close the file, so they should expect
unexpected behavior. */
if (ompi_mpi_finalized) {
return OMPI_SUCCESS;
}
/* 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. */
if (fh->error_handler != &ompi_mpi_errors_return.eh) {
OBJ_RELEASE(fh->error_handler);
fh->error_handler = &ompi_mpi_errors_return.eh;
OBJ_RETAIN(fh->error_handler);
}
data = (mca_io_romio_data_t *) fh->f_io_selected_data;