mirror of
https://github.com/HDFGroup/hdf5.git
synced 2025-04-06 17:20:42 +08:00
[svn-r8151] Purpose:
Bug fix Description: Fix h5tools routines to not try to call MPI_Init() unless an MPI-based VFD is actually used. Platforms tested: FreeBSD 4.9 (sleipnir) w/parallel Linux 2.4 (verbena) w/parallel
This commit is contained in:
parent
c238a6c13c
commit
1b147875db
@ -542,10 +542,8 @@ static const dump_functions *dump_function_table;
|
||||
static void
|
||||
leave(int ret)
|
||||
{
|
||||
H5close();
|
||||
#ifdef H5_HAVE_PARALLEL
|
||||
MPI_Finalize();
|
||||
#endif
|
||||
h5tools_close();
|
||||
|
||||
exit(ret);
|
||||
}
|
||||
|
||||
@ -2784,10 +2782,6 @@ main(int argc, const char *argv[])
|
||||
struct handler_t *hand;
|
||||
int i;
|
||||
|
||||
#ifdef H5_HAVE_PARALLEL
|
||||
MPI_Init(&argc, &argv);
|
||||
#endif
|
||||
|
||||
dump_header_format = &standardformat;
|
||||
dump_function_table = &ddl_function_table;
|
||||
|
||||
@ -2841,7 +2835,7 @@ main(int argc, const char *argv[])
|
||||
}
|
||||
fname = argv[opt_ind];
|
||||
|
||||
fid = h5tools_fopen(fname, driver, NULL, 0);
|
||||
fid = h5tools_fopen(fname, driver, NULL, 0, argc, argv);
|
||||
|
||||
if (fid < 0) {
|
||||
error_msg(progname, "unable to open file \"%s\"\n", fname);
|
||||
@ -3010,19 +3004,13 @@ done:
|
||||
|
||||
/* To Do: clean up XML table */
|
||||
|
||||
h5tools_close();
|
||||
#ifdef H5_WANT_H5_V1_6_COMPAT
|
||||
H5Eset_auto(func, edata);
|
||||
#else
|
||||
H5Eset_auto(H5E_DEFAULT, func, edata);
|
||||
#endif /* H5_WANT_H5_V1_6_COMPAT */
|
||||
|
||||
H5close();
|
||||
#ifdef H5_HAVE_PARALLEL
|
||||
MPI_Finalize();
|
||||
#endif
|
||||
|
||||
return d_status;
|
||||
leave(d_status);
|
||||
}
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
|
@ -1974,10 +1974,8 @@ get_width(void)
|
||||
static void
|
||||
leave(int ret)
|
||||
{
|
||||
H5close();
|
||||
#ifdef H5_HAVE_PARALLEL
|
||||
MPI_Finalize();
|
||||
#endif
|
||||
h5tools_close();
|
||||
|
||||
exit(ret);
|
||||
}
|
||||
|
||||
@ -1999,7 +1997,7 @@ leave(int ret)
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
int
|
||||
main (int argc, char *argv[])
|
||||
main (int argc, const char *argv[])
|
||||
{
|
||||
hid_t file=-1, root=-1;
|
||||
char *fname=NULL, *oname=NULL, *x;
|
||||
@ -2013,10 +2011,6 @@ main (int argc, char *argv[])
|
||||
char drivername[50];
|
||||
char *preferred_driver=NULL;
|
||||
|
||||
#ifdef H5_HAVE_PARALLEL
|
||||
MPI_Init(&argc, &argv);
|
||||
#endif
|
||||
|
||||
/* Initialize h5tools lib */
|
||||
h5tools_init();
|
||||
|
||||
@ -2198,7 +2192,7 @@ main (int argc, char *argv[])
|
||||
file = -1;
|
||||
|
||||
while (fname && *fname) {
|
||||
file = h5tools_fopen(fname, preferred_driver, drivername, sizeof drivername);
|
||||
file = h5tools_fopen(fname, preferred_driver, drivername, sizeof drivername, argc, argv);
|
||||
|
||||
if (file>=0) {
|
||||
if (verbose_g) {
|
||||
@ -2244,11 +2238,5 @@ main (int argc, char *argv[])
|
||||
}
|
||||
H5Fclose(file);
|
||||
}
|
||||
h5tools_close();
|
||||
|
||||
H5close();
|
||||
#ifdef H5_HAVE_PARALLEL
|
||||
MPI_Finalize();
|
||||
#endif
|
||||
return 0;
|
||||
leave(0);
|
||||
}
|
||||
|
@ -53,6 +53,39 @@ FILE *rawdatastream; /* should initialize to stdout but gcc moans about it
|
||||
|
||||
/* module-scoped variables */
|
||||
static int h5tools_init_g; /* if h5tools lib has been initialized */
|
||||
static int h5tools_mpi_init_g; /* if MPI_Init() has been called */
|
||||
|
||||
/* Names of VFDs */
|
||||
static const char *drivernames[]={
|
||||
"sec2",
|
||||
"family",
|
||||
"split",
|
||||
"multi",
|
||||
#ifdef H5_HAVE_STREAM
|
||||
"stream",
|
||||
#endif /* H5_HAVE_STREAM */
|
||||
#ifdef H5_HAVE_PARALLEL
|
||||
"mpio",
|
||||
"mpiposix"
|
||||
#endif /* H5_HAVE_PARALLEL */
|
||||
};
|
||||
|
||||
/* This enum should match the entries in the above drivers_list since they
|
||||
* are indexes into the drivers_list array. */
|
||||
enum {
|
||||
SEC2_IDX = 0
|
||||
,FAMILY_IDX
|
||||
,SPLIT_IDX
|
||||
,MULTI_IDX
|
||||
#ifdef H5_HAVE_STREAM
|
||||
,STREAM_IDX
|
||||
#endif /* H5_HAVE_STREAM */
|
||||
#ifdef H5_HAVE_PARALLEL
|
||||
,MPIO_IDX
|
||||
,MPIPOSIX_IDX
|
||||
#endif /* H5_HAVE_PARALLEL */
|
||||
} driver_idx;
|
||||
#define NUM_DRIVERS (sizeof(drivernames) / sizeof(drivernames[0]))
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Audience: Public
|
||||
@ -107,10 +140,117 @@ h5tools_close(void)
|
||||
rawdatastream = NULL;
|
||||
}
|
||||
|
||||
/* Shut down the library */
|
||||
H5close();
|
||||
|
||||
#ifdef H5_HAVE_PARALLEL
|
||||
/* Check if we need to shut down MPI */
|
||||
if(h5tools_mpi_init_g) {
|
||||
MPI_Finalize();
|
||||
h5tools_mpi_init_g=0;
|
||||
} /* end if */
|
||||
#endif
|
||||
|
||||
h5tools_init_g = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Audience: Private
|
||||
* Chapter: H5Tools Library
|
||||
* Purpose: Get a FAPL for a driver
|
||||
* Description:
|
||||
* Get a FAPL for a given VFL driver name.
|
||||
* Return:
|
||||
* None
|
||||
* Programmer:
|
||||
* Quincey Koziol, 2004-02-04
|
||||
* Modifications:
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
static hid_t
|
||||
h5tools_get_fapl(const char *driver, unsigned *drivernum, int argc, const char *argv[])
|
||||
{
|
||||
hid_t fapl = H5P_DEFAULT;
|
||||
|
||||
/* Determine which driver the user wants to open the file with. Try
|
||||
* that driver. If it can't open it, then fail. */
|
||||
if (!strcmp(driver, drivernames[SEC2_IDX])) {
|
||||
if(drivernum)
|
||||
*drivernum = SEC2_IDX;
|
||||
} else if (!strcmp(driver, drivernames[FAMILY_IDX])) {
|
||||
/* FAMILY Driver */
|
||||
if((fapl = H5Pcreate(H5P_FILE_ACCESS))>=0) {
|
||||
H5Pset_fapl_family(fapl, (hsize_t)0, H5P_DEFAULT);
|
||||
|
||||
if(drivernum)
|
||||
*drivernum = FAMILY_IDX;
|
||||
} /* end if */
|
||||
} else if (!strcmp(driver, drivernames[SPLIT_IDX])) {
|
||||
/* SPLIT Driver */
|
||||
if((fapl = H5Pcreate(H5P_FILE_ACCESS))>=0) {
|
||||
H5Pset_fapl_split(fapl, "-m.h5", H5P_DEFAULT, "-r.h5", H5P_DEFAULT);
|
||||
|
||||
if(drivernum)
|
||||
*drivernum = SPLIT_IDX;
|
||||
} /* end if */
|
||||
} else if (!strcmp(driver, drivernames[MULTI_IDX])) {
|
||||
/* MULTI Driver */
|
||||
if((fapl = H5Pcreate(H5P_FILE_ACCESS))>=0) {
|
||||
H5Pset_fapl_multi(fapl, NULL, NULL, NULL, NULL, TRUE);
|
||||
|
||||
if(drivernum)
|
||||
*drivernum = MULTI_IDX;
|
||||
} /* end if */
|
||||
#ifdef H5_HAVE_STREAM
|
||||
} else if (!strcmp(driver, drivernames[STREAM_IDX])) {
|
||||
/* STREAM Driver */
|
||||
if((fapl = H5Pcreate(H5P_FILE_ACCESS))>=0) {
|
||||
H5Pset_fapl_stream(fapl, NULL);
|
||||
|
||||
if(drivernum)
|
||||
*drivernum = STREAM_IDX;
|
||||
} /* end if */
|
||||
#endif /* H5_HAVE_STREAM */
|
||||
#ifdef H5_HAVE_PARALLEL
|
||||
} else if (!strcmp(driver, drivernames[MPIO_IDX])) {
|
||||
/* MPI-I/O Driver */
|
||||
if((fapl = H5Pcreate(H5P_FILE_ACCESS))>=0) {
|
||||
H5Pset_fapl_mpio(fapl, MPI_COMM_WORLD, MPI_INFO_NULL);
|
||||
|
||||
/* Initialize the MPI library, if it wasn't already */
|
||||
if(!h5tools_mpi_init_g) {
|
||||
MPI_Init(&argc, &argv);
|
||||
|
||||
h5tools_mpi_init_g=1;
|
||||
} /* end if */
|
||||
|
||||
if(drivernum)
|
||||
*drivernum = MPIO_IDX;
|
||||
} /* end if */
|
||||
} else if (!strcmp(driver, drivernames[MPIPOSIX_IDX])) {
|
||||
/* MPI-I/O Driver */
|
||||
if((fapl = H5Pcreate(H5P_FILE_ACCESS))>=0) {
|
||||
H5Pset_fapl_mpiposix(fapl, MPI_COMM_WORLD, TRUE);
|
||||
|
||||
/* Initialize the MPI library, if it wasn't already */
|
||||
if(!h5tools_mpi_init_g) {
|
||||
MPI_Init(&argc, &argv);
|
||||
|
||||
h5tools_mpi_init_g=1;
|
||||
} /* end if */
|
||||
|
||||
if(drivernum)
|
||||
*drivernum = MPIPOSIX_IDX;
|
||||
} /* end if */
|
||||
#endif /* H5_HAVE_PARALLEL */
|
||||
} else {
|
||||
fapl=(-1);
|
||||
}
|
||||
|
||||
return(fapl);
|
||||
}
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Audience: Public
|
||||
* Chapter: H5Tools Library
|
||||
@ -168,177 +308,49 @@ h5tools_close(void)
|
||||
*/
|
||||
hid_t
|
||||
h5tools_fopen(const char *fname, const char *driver, char *drivername,
|
||||
size_t drivername_size)
|
||||
size_t drivername_size, int argc, const char *argv[])
|
||||
{
|
||||
static struct d_list {
|
||||
const char *name;
|
||||
hid_t fapl;
|
||||
} drivers_list[] = {
|
||||
{ "sec2", FAIL }
|
||||
,{ "family", FAIL }
|
||||
,{ "split", FAIL }
|
||||
,{ "multi", FAIL }
|
||||
#ifdef H5_HAVE_STREAM
|
||||
,{ "stream", FAIL }
|
||||
#endif /* H5_HAVE_STREAM */
|
||||
#ifdef H5_HAVE_PARALLEL
|
||||
,{ "mpio", FAIL }
|
||||
,{ "mpiposix", FAIL }
|
||||
#endif /* H5_HAVE_PARALLEL */
|
||||
};
|
||||
/* This enum should match the entries in the above drivers_list since they
|
||||
* are indexes into the drivers_list array. */
|
||||
enum {
|
||||
SEC2_IDX = 0
|
||||
,FAMILY_IDX
|
||||
,SPLIT_IDX
|
||||
,MULTI_IDX
|
||||
#ifdef H5_HAVE_STREAM
|
||||
,STREAM_IDX
|
||||
#endif /* H5_HAVE_STREAM */
|
||||
#ifdef H5_HAVE_PARALLEL
|
||||
,MPIO_IDX
|
||||
,MPIPOSIX_IDX
|
||||
#endif /* H5_HAVE_PARALLEL */
|
||||
};
|
||||
#define NUM_DRIVERS (sizeof(drivers_list) / sizeof(struct d_list))
|
||||
|
||||
static int initialized = 0;
|
||||
register unsigned drivernum;
|
||||
hid_t fid = FAIL;
|
||||
hid_t fapl = H5P_DEFAULT;
|
||||
|
||||
if (!initialized) {
|
||||
/* Build a list of file access property lists which we should try
|
||||
* when opening the file. Eventually we'd like some way for the
|
||||
* user to augment/replace this list interactively. */
|
||||
++initialized;
|
||||
|
||||
/* SEC2 Driver */
|
||||
drivers_list[SEC2_IDX].fapl = H5P_DEFAULT;
|
||||
|
||||
/* FAMILY Driver */
|
||||
drivers_list[FAMILY_IDX].fapl = fapl = H5Pcreate(H5P_FILE_ACCESS);
|
||||
H5Pset_fapl_family(fapl, (hsize_t)0, H5P_DEFAULT);
|
||||
|
||||
/* SPLIT Driver */
|
||||
drivers_list[SPLIT_IDX].fapl = fapl = H5Pcreate(H5P_FILE_ACCESS);
|
||||
H5Pset_fapl_split(fapl, "-m.h5", H5P_DEFAULT, "-r.h5", H5P_DEFAULT);
|
||||
|
||||
/* MULTI Driver */
|
||||
drivers_list[MULTI_IDX].fapl = fapl = H5Pcreate(H5P_FILE_ACCESS);
|
||||
H5Pset_fapl_multi(fapl, NULL, NULL, NULL, NULL, TRUE);
|
||||
|
||||
#ifdef H5_HAVE_STREAM
|
||||
/* STREAM Driver */
|
||||
drivers_list[STREAM_IDX].fapl = fapl = H5Pcreate(H5P_FILE_ACCESS);
|
||||
H5Pset_fapl_stream(fapl, NULL);
|
||||
#endif /* H5_HAVE_STREAM */
|
||||
|
||||
#ifdef H5_HAVE_PARALLEL
|
||||
/* MPI-IO Driver */
|
||||
drivers_list[MPIO_IDX].fapl = fapl = H5Pcreate(H5P_FILE_ACCESS);
|
||||
H5Pset_fapl_mpio(fapl, MPI_COMM_WORLD, MPI_INFO_NULL);
|
||||
|
||||
/* MPI-POSIX Driver */
|
||||
drivers_list[MPIPOSIX_IDX].fapl = fapl = H5Pcreate(H5P_FILE_ACCESS);
|
||||
H5Pset_fapl_mpiposix(fapl, MPI_COMM_WORLD, TRUE);
|
||||
#endif /* H5_HAVE_PARALLEL */
|
||||
}
|
||||
unsigned drivernum;
|
||||
hid_t fid = FAIL;
|
||||
hid_t fapl = H5P_DEFAULT;
|
||||
|
||||
if (driver && *driver) {
|
||||
/* Determine which driver the user wants to open the file with. Try
|
||||
* that driver. If it can't open it, then fail. */
|
||||
if (!strcmp(driver, drivers_list[SEC2_IDX].name)) {
|
||||
H5E_BEGIN_TRY {
|
||||
fid = H5Fopen(fname, H5F_ACC_RDONLY,
|
||||
drivers_list[SEC2_IDX].fapl);
|
||||
} H5E_END_TRY;
|
||||
|
||||
if (fid == FAIL)
|
||||
goto done;
|
||||
|
||||
drivernum = SEC2_IDX;
|
||||
} else if (!strcmp(driver, drivers_list[FAMILY_IDX].name)) {
|
||||
H5E_BEGIN_TRY {
|
||||
fid = H5Fopen(fname, H5F_ACC_RDONLY,
|
||||
drivers_list[FAMILY_IDX].fapl);
|
||||
} H5E_END_TRY;
|
||||
|
||||
if (fid == FAIL)
|
||||
goto done;
|
||||
|
||||
drivernum = FAMILY_IDX;
|
||||
} else if (!strcmp(driver, drivers_list[SPLIT_IDX].name)) {
|
||||
H5E_BEGIN_TRY {
|
||||
fid = H5Fopen(fname, H5F_ACC_RDONLY,
|
||||
drivers_list[SPLIT_IDX].fapl);
|
||||
} H5E_END_TRY;
|
||||
|
||||
if (fid == FAIL)
|
||||
goto done;
|
||||
|
||||
drivernum = SPLIT_IDX;
|
||||
} else if (!strcmp(driver, drivers_list[MULTI_IDX].name)) {
|
||||
H5E_BEGIN_TRY {
|
||||
fid = H5Fopen(fname, H5F_ACC_RDONLY,
|
||||
drivers_list[MULTI_IDX].fapl);
|
||||
} H5E_END_TRY;
|
||||
|
||||
if (fid == FAIL)
|
||||
goto done;
|
||||
|
||||
drivernum = MULTI_IDX;
|
||||
#ifdef H5_HAVE_STREAM
|
||||
} else if (!strcmp(driver, drivers_list[STREAM_IDX].name)) {
|
||||
H5E_BEGIN_TRY {
|
||||
fid = H5Fopen(fname, H5F_ACC_RDONLY,
|
||||
drivers_list[STREAM_IDX].fapl);
|
||||
} H5E_END_TRY;
|
||||
|
||||
if (fid == FAIL)
|
||||
goto done;
|
||||
|
||||
drivernum = STREAM_IDX;
|
||||
#endif /* H5_HAVE_STREAM */
|
||||
#ifdef H5_HAVE_PARALLEL
|
||||
} else if (!strcmp(driver, drivers_list[MPIO_IDX].name)) {
|
||||
H5E_BEGIN_TRY {
|
||||
fid = H5Fopen(fname, H5F_ACC_RDONLY,
|
||||
drivers_list[MPIO_IDX].fapl);
|
||||
} H5E_END_TRY;
|
||||
if (fid == FAIL)
|
||||
goto done;
|
||||
drivernum = MPIO_IDX;
|
||||
} else if (!strcmp(driver, drivers_list[MPIPOSIX_IDX].name)) {
|
||||
H5E_BEGIN_TRY {
|
||||
fid = H5Fopen(fname, H5F_ACC_RDONLY,
|
||||
drivers_list[MPIO_IDX].fapl);
|
||||
} H5E_END_TRY;
|
||||
if (fid == FAIL)
|
||||
goto done;
|
||||
drivernum = MPIPOSIX_IDX;
|
||||
#endif /* H5_HAVE_PARALLEL */
|
||||
} else {
|
||||
/* Get the correct FAPL for the given driver */
|
||||
if((fapl=h5tools_get_fapl(driver,&drivernum,argc,argv))<0)
|
||||
goto done;
|
||||
}
|
||||
|
||||
H5E_BEGIN_TRY {
|
||||
fid = H5Fopen(fname, H5F_ACC_RDONLY, fapl);
|
||||
} H5E_END_TRY;
|
||||
|
||||
if (fid == FAIL)
|
||||
goto done;
|
||||
|
||||
} else {
|
||||
/* Try to open the file using each of the drivers */
|
||||
for (drivernum = 0; drivernum < NUM_DRIVERS; drivernum++) {
|
||||
/* Get the correct FAPL for the given driver */
|
||||
if((fapl=h5tools_get_fapl(drivernames[drivernum],NULL,argc,argv))<0)
|
||||
goto done;
|
||||
|
||||
H5E_BEGIN_TRY {
|
||||
fid = H5Fopen(fname, H5F_ACC_RDONLY,
|
||||
drivers_list[drivernum].fapl);
|
||||
fid = H5Fopen(fname, H5F_ACC_RDONLY, fapl);
|
||||
} H5E_END_TRY;
|
||||
|
||||
if (fid != FAIL)
|
||||
break;
|
||||
else {
|
||||
/* Close the FAPL */
|
||||
H5Pclose(fapl);
|
||||
fapl=H5P_DEFAULT;
|
||||
} /* end else */
|
||||
}
|
||||
}
|
||||
|
||||
/* Save the driver name */
|
||||
if (drivername && drivername_size) {
|
||||
if (fid != FAIL) {
|
||||
strncpy(drivername, drivers_list[drivernum].name, drivername_size);
|
||||
strncpy(drivername, drivernames[drivernum], drivername_size);
|
||||
drivername[drivername_size - 1] = '\0';
|
||||
} else {
|
||||
/*no file opened*/
|
||||
@ -347,6 +359,8 @@ h5tools_fopen(const char *fname, const char *driver, char *drivername,
|
||||
}
|
||||
|
||||
done:
|
||||
if(fapl!=H5P_DEFAULT)
|
||||
H5Pclose(fapl);
|
||||
return fid;
|
||||
}
|
||||
|
||||
|
@ -472,7 +472,8 @@ extern FILE *rawdatastream; /*output stream for raw data */
|
||||
extern void h5tools_init(void);
|
||||
extern void h5tools_close(void);
|
||||
extern hid_t h5tools_fopen(const char *fname, const char *driver,
|
||||
char *drivername, size_t drivername_len);
|
||||
char *drivername, size_t drivername_len,
|
||||
int argc, const char *argv[]);
|
||||
extern int h5tools_dump_dset(FILE *stream, const h5dump_t *info, hid_t dset,
|
||||
hid_t p_typ, struct subset_t *sset, int indentlevel);
|
||||
extern int h5tools_dump_mem(FILE *stream, const h5dump_t *info, hid_t obj_id,
|
||||
|
Loading…
x
Reference in New Issue
Block a user