1
1

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.
Этот коммит содержится в:
Jeff Squyres 2005-01-04 15:43:26 +00:00
родитель 8b9b8cec9d
Коммит 9802822b7b
5 изменённых файлов: 74 добавлений и 12 удалений

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

@ -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())) {