>From 70be7d3b2baefa4ed4189d93026647fcca97ebdd Mon Sep 17 00:00:00 2001
From: Rob Latham <robl@mcs.anl.gov>
Date: Wed, 20 May 2015 15:06:36 -0500
Subject: [PATCH] hoist ROMIO init into MPI_Init

some libraries like HDF5 want to register their cleanup routines into
finalize.  these cleanup routines use MPI-IO, so they need to fire
before ROMIO cleans up.
---
 src/include/mpiimpl.h                |  1 +
 src/mpi/init/initthread.c            |  5 +++++
 src/mpi/romio/mpi-io/mpir-mpioinit.c | 12 ------------
 3 files changed, 6 insertions(+), 12 deletions(-)

diff --git a/src/include/mpiimpl.h b/src/include/mpiimpl.h
index 1e18a17b..94cade40 100644
--- a/src/include/mpiimpl.h
+++ b/src/include/mpiimpl.h
@@ -4341,6 +4341,7 @@ int MPIR_Type_size_x_impl(MPI_Datatype datatype, MPI_Count *size);
 /* random initializers */
 int MPIR_Group_init(void);
 int MPIR_Comm_init(MPID_Comm *);
+int MPIR_MPIOInit(int *error);
 
 
 /* Collective functions cannot be called from multiple threads. These
diff --git a/src/mpi/init/initthread.c b/src/mpi/init/initthread.c
index 6be0c7b7..fe7f7b31 100644
--- a/src/mpi/init/initthread.c
+++ b/src/mpi/init/initthread.c
@@ -522,6 +522,7 @@ int MPIR_Init_thread(int * argc, char ***argv, int required, int * provided)
     MPIU_dbg_init(MPIR_Process.comm_world->rank);
     MPIU_Timer_init(MPIR_Process.comm_world->rank,
 		    MPIR_Process.comm_world->local_size);
+
 #ifdef USE_MEMORY_TRACING
     MPIU_trinit( MPIR_Process.comm_world->rank );
     /* Indicate that we are near the end of the init step; memory 
@@ -560,6 +561,10 @@ int MPIR_Init_thread(int * argc, char ***argv, int required, int * provided)
     if (mpi_errno == MPI_SUCCESS) 
 	mpi_errno = MPID_InitCompleted();
 
+#ifdef HAVE_ROMIO
+    MPIR_MPIOInit(&mpi_errno);
+#endif
+
 fn_exit:
     MPIU_THREAD_CS_EXIT(INIT,required);
     /* Make fields of MPIR_Process global visible and set mpich_state
diff --git a/src/mpi/romio/mpi-io/mpir-mpioinit.c b/src/mpi/romio/mpi-io/mpir-mpioinit.c
index be78b45e..22f95656 100644
--- a/src/mpi/romio/mpi-io/mpir-mpioinit.c
+++ b/src/mpi/romio/mpi-io/mpir-mpioinit.c
@@ -24,18 +24,6 @@ void MPIR_MPIOInit(int * error_code) {
 
     /* first check if ADIO has been initialized. If not, initialize it */
     if (ADIO_Init_keyval == MPI_KEYVAL_INVALID) {
-        MPI_Initialized(&flag);
-
-	/* --BEGIN ERROR HANDLING-- */
-        if (!flag) {
-	    *error_code = MPIO_Err_create_code(MPI_SUCCESS, 
-		    MPIR_ERR_RECOVERABLE, myname, __LINE__, 
-		    MPI_ERR_OTHER, "**initialized", 0);
-	    *error_code = MPIO_Err_return_file(MPI_FILE_NULL, *error_code);
-	    return;
-	}
-	/* --END ERROR HANDLING-- */
-
         MPI_Keyval_create(MPI_NULL_COPY_FN, ADIOI_End_call, &ADIO_Init_keyval,
                           (void *) 0);  
 
-- 
1.9.1

