mirror of
https://github.com/HDFGroup/hdf5.git
synced 2025-02-17 16:10:24 +08:00
[svn-r12209] Purpose:
Bug fix. Description: getenv_all would fail if one calls it without calling MPI_initialized first. This may happen if one uses PHDF5 library to build a serial nature code and does not make any MPI calls. Solution: Added code to detect if MPI has been initialized. If not, use the original getenv. Platforms tested: heping (serial) and mir (parallel).
This commit is contained in:
parent
e6310e0869
commit
d4a986445c
@ -901,58 +901,75 @@ int h5_szip_can_encode(void )
|
||||
* 4/4/05
|
||||
*
|
||||
* Modifications:
|
||||
* Use original getenv if MPI is not initialized. This happens
|
||||
* one uses the PHDF5 library to build a serial nature code.
|
||||
* Albert 2006/04/07
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
char* getenv_all(MPI_Comm comm, int root, const char* name)
|
||||
{
|
||||
int nID;
|
||||
int len = -1;
|
||||
int mpi_size, mpi_rank, mpi_initialized;
|
||||
int len;
|
||||
static char* env = NULL;
|
||||
MPI_Status Status;
|
||||
|
||||
assert(name);
|
||||
|
||||
MPI_Comm_rank(comm, &nID);
|
||||
|
||||
/* The root task does the getenv call
|
||||
* and sends the result to the other tasks */
|
||||
if(nID == root)
|
||||
{
|
||||
env = HDgetenv(name);
|
||||
MPI_Initialized(&mpi_initialized);
|
||||
if (!mpi_initialized){
|
||||
/* use original getenv */
|
||||
if(env)
|
||||
{
|
||||
len = HDstrlen(env);
|
||||
MPI_Bcast(&len, 1, MPI_INT, root, comm);
|
||||
MPI_Bcast(env, len, MPI_CHAR, root, comm);
|
||||
}
|
||||
/* len -1 indicates that the variable was not in the environment */
|
||||
else
|
||||
MPI_Bcast(&len, 1, MPI_INT, root, comm);
|
||||
}
|
||||
else
|
||||
{
|
||||
MPI_Bcast(&len, 1, MPI_INT, root, comm);
|
||||
if(len >= 0)
|
||||
{
|
||||
if(env == NULL)
|
||||
env = (char*) HDmalloc(len+1);
|
||||
else if(strlen(env) < len)
|
||||
env = (char*) HDrealloc(env, len+1);
|
||||
HDfree(env);
|
||||
env = HDgetenv(name);
|
||||
}else{
|
||||
MPI_Comm_rank(comm, &mpi_rank);
|
||||
MPI_Comm_size(comm, &mpi_size);
|
||||
assert(root < mpi_size);
|
||||
|
||||
MPI_Bcast(env, len, MPI_CHAR, root, comm);
|
||||
env[len] = '\0';
|
||||
}
|
||||
else
|
||||
/* The root task does the getenv call
|
||||
* and sends the result to the other tasks */
|
||||
if(mpi_rank == root)
|
||||
{
|
||||
env = HDgetenv(name);
|
||||
if(env)
|
||||
HDfree(env);
|
||||
env = NULL;
|
||||
{
|
||||
len = HDstrlen(env);
|
||||
MPI_Bcast(&len, 1, MPI_INT, root, comm);
|
||||
MPI_Bcast(env, len, MPI_CHAR, root, comm);
|
||||
}
|
||||
else{
|
||||
/* len -1 indicates that the variable was not in the environment */
|
||||
len = -1;
|
||||
MPI_Bcast(&len, 1, MPI_INT, root, comm);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
MPI_Bcast(&len, 1, MPI_INT, root, comm);
|
||||
if(len >= 0)
|
||||
{
|
||||
if(env == NULL)
|
||||
env = (char*) HDmalloc(len+1);
|
||||
else if(strlen(env) < len)
|
||||
env = (char*) HDrealloc(env, len+1);
|
||||
|
||||
MPI_Bcast(env, len, MPI_CHAR, root, comm);
|
||||
env[len] = '\0';
|
||||
}
|
||||
else
|
||||
{
|
||||
if(env)
|
||||
HDfree(env);
|
||||
env = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef NDEBUG
|
||||
MPI_Barrier(comm);
|
||||
#endif
|
||||
|
||||
return env;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user