Make the opening of the io framework be lazy -- only occurs at the
first invocation of MPI_File_open or MPI_File_delete (whichever is first). The io framework is then only closed down if it was successfully opened. This is the first [atomic] step to having a progress thread in the ROMIO component; it wasn't strictly *necessary*, but it's logically the same direction and provided a good test case. This commit was SVN r3895.
Этот коммит содержится в:
родитель
8b9b8cec9d
Коммит
9802822b7b
@ -87,12 +87,8 @@ int mca_base_init_select_components(int requested,
|
||||
allow_multi_user_threads &= user_threads;
|
||||
have_hidden_threads |= hidden_threads;
|
||||
|
||||
if (OMPI_SUCCESS != mca_io_base_find_available(&user_threads,
|
||||
&hidden_threads)) {
|
||||
return OMPI_ERROR;
|
||||
}
|
||||
allow_multi_user_threads &= user_threads;
|
||||
have_hidden_threads |= hidden_threads;
|
||||
/* io components are selected later, because the io framework is
|
||||
opened lazily (at the first MPI_File_* function invocation). */
|
||||
|
||||
/* Now that we have a final list of all available modules, do the
|
||||
selection. pml is already selected. */
|
||||
|
@ -20,6 +20,7 @@
|
||||
#include "errhandler/errhandler.h"
|
||||
#include "info/info.h"
|
||||
#include "file/file.h"
|
||||
#include "mca/io/io.h"
|
||||
#include "mca/io/base/base.h"
|
||||
|
||||
#if OMPI_HAVE_WEAK_SYMBOLS && OMPI_PROFILING_DEFINES
|
||||
@ -48,6 +49,38 @@ int MPI_File_delete(char *filename, MPI_Info info)
|
||||
OMPI_ERRHANDLER_CHECK(rc, MPI_FILE_NULL, rc, FUNC_NAME);
|
||||
}
|
||||
|
||||
/* Note that MPI-2:9.7 (p265) says that errors in MPI_FILE_OPEN
|
||||
(before the file handle is created) should invoke the default
|
||||
error handler on MPI_FILE_NULL. Hence, if we get a file handle
|
||||
out of ompi_file_open(), invoke the error handler on that. If
|
||||
not, invoke the error handler on MPI_FILE_NULL. */
|
||||
|
||||
/* The io framework is only initialized lazily. If it hasn't
|
||||
already been initialized, do so now (note that MPI_FILE_OPEN
|
||||
and MPI_FILE_DELETE are the only two places that it will be
|
||||
initialized). */
|
||||
|
||||
if (!(mca_io_base_components_opened_valid ||
|
||||
mca_io_base_components_available_valid)) {
|
||||
bool user_threads = true;
|
||||
bool hidden_threads = true;
|
||||
if (OMPI_SUCCESS != (rc = mca_io_base_open())) {
|
||||
return OMPI_ERRHANDLER_INVOKE(MPI_FILE_NULL, rc, FUNC_NAME);
|
||||
}
|
||||
/* JMS Need to do something here with user_threads and
|
||||
hidden_threads -- technically this is no longer a query,
|
||||
it's a mandate. The query part is left over from when this
|
||||
function was invoked during MPI_INIT. Since we've now
|
||||
long-since decided the user threads and hidden threads
|
||||
stuff (i.e., during MPI_INIT), we can't change them now.
|
||||
This is not hugely important now, since ROMIO is the only
|
||||
io component that we have, but it should be fixed. */
|
||||
if (OMPI_SUCCESS != (rc = mca_io_base_find_available(&user_threads,
|
||||
&hidden_threads))) {
|
||||
return OMPI_ERRHANDLER_INVOKE(MPI_FILE_NULL, rc, FUNC_NAME);
|
||||
}
|
||||
}
|
||||
|
||||
/* Since there is no MPI_File handle associated with this
|
||||
function, the MCA has to do a selection and perform the
|
||||
action */
|
||||
|
@ -20,6 +20,8 @@
|
||||
#include "errhandler/errhandler.h"
|
||||
#include "info/info.h"
|
||||
#include "file/file.h"
|
||||
#include "mca/io/io.h"
|
||||
#include "mca/io/base/base.h"
|
||||
|
||||
#if OMPI_HAVE_WEAK_SYMBOLS && OMPI_PROFILING_DEFINES
|
||||
#pragma weak MPI_File_open = PMPI_File_open
|
||||
@ -54,6 +56,32 @@ int MPI_File_open(MPI_Comm comm, char *filename, int amode,
|
||||
out of ompi_file_open(), invoke the error handler on that. If
|
||||
not, invoke the error handler on MPI_FILE_NULL. */
|
||||
|
||||
/* The io framework is only initialized lazily. If it hasn't
|
||||
already been initialized, do so now (note that MPI_FILE_OPEN
|
||||
and MPI_FILE_DELETE are the only two places that it will be
|
||||
initialized). */
|
||||
|
||||
if (!(mca_io_base_components_opened_valid ||
|
||||
mca_io_base_components_available_valid)) {
|
||||
bool user_threads = true;
|
||||
bool hidden_threads = true;
|
||||
if (OMPI_SUCCESS != (rc = mca_io_base_open())) {
|
||||
return OMPI_ERRHANDLER_INVOKE(MPI_FILE_NULL, rc, FUNC_NAME);
|
||||
}
|
||||
/* JMS Need to do something here with user_threads and
|
||||
hidden_threads -- technically this is no longer a query,
|
||||
it's a mandate. The query part is left over from when this
|
||||
function was invoked during MPI_INIT. Since we've now
|
||||
long-since decided the user threads and hidden threads
|
||||
stuff (i.e., during MPI_INIT), we can't change them now.
|
||||
This is not hugely important now, since ROMIO is the only
|
||||
io component that we have, but it should be fixed. */
|
||||
if (OMPI_SUCCESS != (rc = mca_io_base_find_available(&user_threads,
|
||||
&hidden_threads))) {
|
||||
return OMPI_ERRHANDLER_INVOKE(MPI_FILE_NULL, rc, FUNC_NAME);
|
||||
}
|
||||
}
|
||||
|
||||
/* Create an empty MPI_File handle */
|
||||
|
||||
*fh = MPI_FILE_NULL;
|
||||
|
@ -184,8 +184,14 @@ int ompi_mpi_finalize(void)
|
||||
|
||||
/* Close down MCA modules */
|
||||
|
||||
if (OMPI_SUCCESS != (ret = mca_io_base_close())) {
|
||||
return ret;
|
||||
/* io is opened lazily, so it's only necessary to close it if it
|
||||
was actually opened */
|
||||
|
||||
if (mca_io_base_components_opened_valid ||
|
||||
mca_io_base_components_available_valid) {
|
||||
if (OMPI_SUCCESS != (ret = mca_io_base_close())) {
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
if (OMPI_SUCCESS != (ret = mca_topo_base_close())) {
|
||||
return ret;
|
||||
|
@ -157,10 +157,9 @@ int ompi_mpi_init(int argc, char **argv, int requested, int *provided)
|
||||
error = "mca_topo_base_open() failed";
|
||||
goto error;
|
||||
}
|
||||
if (OMPI_SUCCESS != (ret = mca_io_base_open())) {
|
||||
error = "mca_io_base_open() failed";
|
||||
goto error;
|
||||
}
|
||||
|
||||
/* The io framework is initialized lazily, at the first use of any
|
||||
MPI_File_* function, so it is not included here. */
|
||||
|
||||
/* initialize module exchange */
|
||||
if (OMPI_SUCCESS != (ret = mca_base_modex_init())) {
|
||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user