summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/CMakeLists.txt2
-rw-r--r--src/H5Dmpio.c49
-rw-r--r--src/H5FD.c1
-rw-r--r--src/H5FDmpi.h1
-rw-r--r--src/H5FDmpio.c51
-rw-r--r--src/H5FDmpio.h8
-rw-r--r--src/H5FDmpiposix.c1486
-rw-r--r--src/H5FDmpiposix.h52
-rw-r--r--src/H5FDprivate.h5
-rw-r--r--src/H5Ppublic.h7
-rw-r--r--src/H5S.c13
-rw-r--r--src/H5Sprivate.h4
-rw-r--r--src/H5config.h.in6
-rw-r--r--src/H5trace.c77
-rw-r--r--src/Makefile.am7
-rw-r--r--src/Makefile.in23
-rw-r--r--src/hdf5.lnt1
-rw-r--r--src/libhdf5.settings.in1
18 files changed, 116 insertions, 1678 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 7aad6ad..7257a41 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -147,7 +147,6 @@ SET (H5FD_SRCS
${HDF5_SRC_DIR}/H5FDlog.c
${HDF5_SRC_DIR}/H5FDmpi.c
${HDF5_SRC_DIR}/H5FDmpio.c
- ${HDF5_SRC_DIR}/H5FDmpiposix.c
${HDF5_SRC_DIR}/H5FDmulti.c
${HDF5_SRC_DIR}/H5FDsec2.c
${HDF5_SRC_DIR}/H5FDspace.c
@@ -161,7 +160,6 @@ SET (H5FD_HDRS
${HDF5_SRC_DIR}/H5FDlog.h
${HDF5_SRC_DIR}/H5FDmpi.h
${HDF5_SRC_DIR}/H5FDmpio.h
- ${HDF5_SRC_DIR}/H5FDmpiposix.h
${HDF5_SRC_DIR}/H5FDmulti.h
${HDF5_SRC_DIR}/H5FDpkg.h
${HDF5_SRC_DIR}/H5FDpublic.h
diff --git a/src/H5Dmpio.c b/src/H5Dmpio.c
index 684f510..c294e42 100644
--- a/src/H5Dmpio.c
+++ b/src/H5Dmpio.c
@@ -157,12 +157,9 @@ H5D__mpio_opt_possible(const H5D_io_info_t *io_info, const H5S_t *file_space,
const H5S_t *mem_space, const H5D_type_info_t *type_info,
const H5D_chunk_map_t *fm, H5P_genplist_t *dx_plist)
{
- /* variables to set cause of broken collective I/O */
- int local_cause = 0;
- int global_cause = 0;
-
- int mpi_code; /* MPI error code */
- htri_t ret_value = TRUE;
+ int local_cause = 0; /* Local reason(s) for breaking collective mode */
+ int global_cause = 0; /* Global reason(s) for breaking collective mode */
+ htri_t ret_value; /* Return value */
FUNC_ENTER_PACKAGE
@@ -174,17 +171,13 @@ H5D__mpio_opt_possible(const H5D_io_info_t *io_info, const H5S_t *file_space,
/* For independent I/O, get out quickly and don't try to form consensus */
- if(io_info->dxpl_cache->xfer_mode == H5FD_MPIO_INDEPENDENT) {
- local_cause = H5D_MPIO_SET_INDEPENDENT;
- global_cause = H5D_MPIO_SET_INDEPENDENT;
- HGOTO_DONE(FALSE);
- }
-
- /* Optimized MPI types flag must be set and it must be collective IO */
- /* (Don't allow parallel I/O for the MPI-posix driver, since it doesn't do real collective I/O) */
- if(!(H5S_mpi_opt_types_g && io_info->dxpl_cache->xfer_mode == H5FD_MPIO_COLLECTIVE
- && !IS_H5FD_MPIPOSIX(io_info->dset->oloc.file)))
- local_cause |= H5D_MPIO_SET_MPIPOSIX;
+ if(io_info->dxpl_cache->xfer_mode == H5FD_MPIO_INDEPENDENT)
+ local_cause |= H5D_MPIO_SET_INDEPENDENT;
+
+ /* Optimized MPI types flag must be set */
+ /* (based on 'HDF5_MPI_OPT_TYPES' environment variable) */
+ if(!H5FD_mpi_opt_types_g)
+ local_cause |= H5D_MPIO_MPI_OPT_TYPES_ENV_VAR_DISABLED;
/* Don't allow collective operations if datatype conversions need to happen */
if(!type_info->is_conv_noop)
@@ -220,15 +213,19 @@ H5D__mpio_opt_possible(const H5D_io_info_t *io_info, const H5S_t *file_space,
io_info->dset->shared->dcpl_cache.pline.nused > 0)
local_cause |= H5D_MPIO_FILTERS;
- /* Form consensus opinion among all processes about whether to perform
- * collective I/O
- */
- if(MPI_SUCCESS != (mpi_code = MPI_Allreduce(&local_cause, &global_cause, 1, MPI_INT, MPI_BOR, io_info->comm)))
- HMPI_GOTO_ERROR(FAIL, "MPI_Allreduce failed", mpi_code)
+ /* Check for independent I/O */
+ if(local_cause & H5D_MPIO_SET_INDEPENDENT)
+ global_cause = local_cause;
+ else {
+ int mpi_code; /* MPI error code */
- ret_value = global_cause > 0 ? FALSE : TRUE;
+ /* Form consensus opinion among all processes about whether to perform
+ * collective I/O
+ */
+ if(MPI_SUCCESS != (mpi_code = MPI_Allreduce(&local_cause, &global_cause, 1, MPI_INT, MPI_BOR, io_info->comm)))
+ HMPI_GOTO_ERROR(FAIL, "MPI_Allreduce failed", mpi_code)
+ } /* end else */
-done:
/* Write the local value of no-collective-cause to the DXPL. */
if(H5P_set(dx_plist, H5D_MPIO_LOCAL_NO_COLLECTIVE_CAUSE_NAME, &local_cause) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "couldn't set local no collective cause property")
@@ -237,6 +234,10 @@ done:
if(H5P_set(dx_plist, H5D_MPIO_GLOBAL_NO_COLLECTIVE_CAUSE_NAME, &global_cause) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "couldn't set global no collective cause property")
+ /* Set the return value, based on the global cause */
+ ret_value = global_cause > 0 ? FALSE : TRUE;
+
+done:
FUNC_LEAVE_NOAPI(ret_value)
} /* H5D__mpio_opt_possible() */
diff --git a/src/H5FD.c b/src/H5FD.c
index 5408706..a261818 100644
--- a/src/H5FD.c
+++ b/src/H5FD.c
@@ -230,7 +230,6 @@ H5FD_term_interface(void)
H5FD_multi_term();
#ifdef H5_HAVE_PARALLEL
H5FD_mpio_term();
- H5FD_mpiposix_term();
#endif /* H5_HAVE_PARALLEL */
} /* end if */
} else {
diff --git a/src/H5FDmpi.h b/src/H5FDmpi.h
index dcb8df9..784fe70 100644
--- a/src/H5FDmpi.h
+++ b/src/H5FDmpi.h
@@ -57,7 +57,6 @@ typedef enum H5FD_mpio_collective_opt_t {
/* Include all the MPI VFL headers */
#include "H5FDmpio.h" /* MPI I/O file driver */
-#include "H5FDmpiposix.h" /* MPI/posix I/O file driver */
#endif /* H5FDmpi_H */
diff --git a/src/H5FDmpio.c b/src/H5FDmpio.c
index 2d73ec0..2c97282 100644
--- a/src/H5FDmpio.c
+++ b/src/H5FDmpio.c
@@ -44,6 +44,10 @@
*/
static hid_t H5FD_MPIO_g = 0;
+/* Whether to allow collective I/O operations */
+/* (Value can be set from environment variable also) */
+hbool_t H5FD_mpi_opt_types_g = TRUE;
+
/*
* The view is set to this value
*/
@@ -187,51 +191,54 @@ H5FD_mpio_init_interface(void)
* library.
*
* Return: Success: The driver ID for the mpio driver.
- *
* Failure: Negative.
*
* Programmer: Robb Matzke
* Thursday, August 5, 1999
*
- * Modifications:
- *
*-------------------------------------------------------------------------
*/
hid_t
H5FD_mpio_init(void)
{
#ifdef H5FDmpio_DEBUG
- static int H5FD_mpio_Debug_inited=0;
+ static int H5FD_mpio_Debug_inited = 0;
#endif /* H5FDmpio_DEBUG */
- hid_t ret_value; /* Return value */
+ const char *s; /* String for environment variables */
+ hid_t ret_value; /* Return value */
FUNC_ENTER_NOAPI(FAIL)
- if (H5I_VFL!=H5I_get_type(H5FD_MPIO_g))
- H5FD_MPIO_g = H5FD_register((const H5FD_class_t *)&H5FD_mpio_g,sizeof(H5FD_class_mpi_t),FALSE);
+ /* Register the MPI-IO VFD, if it isn't already */
+ if(H5I_VFL != H5I_get_type(H5FD_MPIO_g))
+ H5FD_MPIO_g = H5FD_register((const H5FD_class_t *)&H5FD_mpio_g, sizeof(H5FD_class_mpi_t), FALSE);
+
+ /* Allow MPI buf-and-file-type optimizations? */
+ s = HDgetenv("HDF5_MPI_OPT_TYPES");
+ if(s && HDisdigit(*s))
+ H5FD_mpi_opt_types_g = (hbool_t)HDstrtol(s, NULL, 0);
#ifdef H5FDmpio_DEBUG
- if (!H5FD_mpio_Debug_inited)
- {
- /* set debug mask */
- /* Should this be done in H5F global initialization instead of here? */
- const char *s = HDgetenv ("H5FD_mpio_Debug");
- if (s) {
- while (*s){
- H5FD_mpio_Debug[(int)*s]++;
- s++;
- }
- }
- H5FD_mpio_Debug_inited++;
- }
+ if(!H5FD_mpio_Debug_inited) {
+ /* Retrieve MPI-IO debugging environment variable */
+ s = HDgetenv("H5FD_mpio_Debug");
+ if(s) {
+ /* Set debug mask */
+ while(*s) {
+ H5FD_mpio_Debug[(int)*s]++;
+ s++;
+ } /* end while */
+ } /* end if */
+ H5FD_mpio_Debug_inited++;
+ } /* end if */
#endif /* H5FDmpio_DEBUG */
/* Set return value */
- ret_value=H5FD_MPIO_g;
+ ret_value = H5FD_MPIO_g;
done:
FUNC_LEAVE_NOAPI(ret_value)
-}
+} /* end H5FD_mpio_init() */
/*---------------------------------------------------------------------------
diff --git a/src/H5FDmpio.h b/src/H5FDmpio.h
index f1a68a4..1d91cc3 100644
--- a/src/H5FDmpio.h
+++ b/src/H5FDmpio.h
@@ -22,14 +22,14 @@
#ifndef H5FDmpio_H
#define H5FDmpio_H
+/* Macros */
+
#ifdef H5_HAVE_PARALLEL
# define H5FD_MPIO (H5FD_mpio_init())
#else
# define H5FD_MPIO (-1)
#endif /* H5_HAVE_PARALLEL */
-/* Macros */
-
#ifdef H5_HAVE_PARALLEL
/*Turn on H5FDmpio_debug if H5F_DEBUG is on */
#ifdef H5F_DEBUG
@@ -38,6 +38,10 @@
#endif
#endif
+/* Global var whose value comes from environment variable */
+/* (Defined in H5FDmpio.c) */
+H5_DLLVAR hbool_t H5FD_mpi_opt_types_g;
+
/* Function prototypes */
#ifdef __cplusplus
extern "C" {
diff --git a/src/H5FDmpiposix.c b/src/H5FDmpiposix.c
deleted file mode 100644
index f66b244..0000000
--- a/src/H5FDmpiposix.c
+++ /dev/null
@@ -1,1486 +0,0 @@
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * Copyright by The HDF Group. *
- * Copyright by the Board of Trustees of the University of Illinois. *
- * All rights reserved. *
- * *
- * This file is part of HDF5. The full HDF5 copyright notice, including *
- * terms governing use, modification, and redistribution, is contained in *
- * the files COPYING and Copyright.html. COPYING can be found at the root *
- * of the source code distribution tree; Copyright.html can be found at the *
- * root level of an installed copy of the electronic HDF5 document set and *
- * is linked from the top-level documents page. It can also be found at *
- * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have *
- * access to either file, you may request a copy from help@hdfgroup.org. *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-/*
- * Programmer: Quincey Koziol <koziol@ncsa.uiuc.ed>
- * Thursday, July 11, 2002
- *
- * Purpose: This is a "combination" MPI-2 and posix I/O driver.
- * It uses MPI for coordinating the actions of several processes
- * and posix I/O calls to do the actual I/O to the disk.
- *
- * This driver was derived from the H5FDmpio.c driver and may
- * share bugs/quirks/etc.
- *
- * Limitations:
- * There is no "collective" I/O mode with this driver.
- *
- * This will almost certainly _not_ work correctly for files
- * accessed on distributed parallel systems with the file located
- * on a non-parallel filesystem.
- *
- */
-
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC H5FD_mpiposix_init_interface
-
-
-#include "H5private.h" /* Generic Functions */
-#include "H5ACprivate.h" /* Metadata cache */
-#include "H5Eprivate.h" /* Error handling */
-#include "H5Fprivate.h" /* File access */
-#include "H5FDprivate.h" /* File drivers */
-#include "H5FDmpi.h" /* MPI-based file drivers */
-#include "H5Iprivate.h" /* IDs */
-#include "H5MMprivate.h" /* Memory management */
-#include "H5Pprivate.h" /* Property lists */
-
-/* Features:
- * H5_HAVE_GPFS -- issue gpfs_fcntl() calls to hopefully improve
- * performance when accessing files on a GPFS
- * file system.
- *
- * REPORT_IO -- if set then report all POSIX file calls to stderr.
- *
- */
-/* #define REPORT_IO */
-
-#ifdef H5_HAVE_GPFS
-# include <gpfs_fcntl.h>
-#endif
-
-#ifdef H5_HAVE_PARALLEL
-
-/*
- * The driver identification number, initialized at runtime if H5_HAVE_PARALLEL
- * is defined. This allows applications to still have the H5FD_MPIPOSIX
- * "constants" in their source code (it also makes this file strictly ANSI
- * compliant when H5_HAVE_PARALLEL isn't defined)
- */
-static hid_t H5FD_MPIPOSIX_g = 0;
-
-/*
- * The description of a file belonging to this driver.
- * The EOF value is only used just after the file is opened in order for the
- * library to determine whether the file is empty, truncated, or okay. The
- * MPIPOSIX driver doesn't bother to keep it updated since it's an expensive
- * operation.
- */
-typedef struct H5FD_mpiposix_t {
- H5FD_t pub; /* public stuff, must be first */
- int fd; /* the unix file handle */
- MPI_Comm comm; /* communicator */
- int mpi_rank; /* This process's rank */
- int mpi_size; /* Total number of processes */
- haddr_t eof; /* end-of-file marker */
- haddr_t eoa; /* end-of-address marker */
- haddr_t last_eoa; /* Last known end-of-address marker */
- haddr_t pos; /* Current file I/O position */
- H5FD_file_op_t op; /* Last file I/O operation */
- hsize_t naccess; /* Number of (write) accesses to file */
-#ifdef H5_HAVE_GPFS
- size_t blksize; /* Block size of file system */
-#endif
- hbool_t use_gpfs; /* Use GPFS to write things */
-#ifndef H5_HAVE_WIN32_API
- /* On most systems the combination of device and i-node number uniquely
- * identify a file. Note that Cygwin, MinGW and other Windows POSIX
- * environments have the stat function (which fakes inodes)
- * and will use the 'device + inodes' scheme as opposed to the
- * Windows code further below.
- */
- dev_t device; /* file device number */
-#ifdef H5_VMS
- ino_t inode[3]; /* file i-node number */
-#else
- ino_t inode; /* file i-node number */
-#endif /* H5_VMS */
-#else
- /* Files in windows are uniquely identified by the volume serial
- * number and the file index (both low and high parts).
- *
- * There are caveats where these numbers can change, especially
- * on FAT file systems. On NTFS, however, a file should keep
- * those numbers the same until renamed or deleted (though you
- * can use ReplaceFile() on NTFS to keep the numbers the same
- * while renaming).
- *
- * See the MSDN "BY_HANDLE_FILE_INFORMATION Structure" entry for
- * more information.
- *
- * http://msdn.microsoft.com/en-us/library/aa363788(v=VS.85).aspx
- */
- DWORD nFileIndexLow;
- DWORD nFileIndexHigh;
- DWORD dwVolumeSerialNumber;
-
- HANDLE hFile; /* Native windows file handle */
-#endif /* H5_HAVE_WIN32_API */
-} H5FD_mpiposix_t;
-
-/*
- * These macros check for overflow of various quantities. These macros
- * assume that HDoff_t is signed and haddr_t and size_t are unsigned.
- *
- * ADDR_OVERFLOW: Checks whether a file address of type `haddr_t'
- * is too large to be represented by the second argument
- * of the file seek function.
- *
- * SIZE_OVERFLOW: Checks whether a buffer size of type `hsize_t' is too
- * large to be represented by the `size_t' type.
- *
- * REGION_OVERFLOW: Checks whether an address and size pair describe data
- * which can be addressed entirely by the second
- * argument of the file seek function.
- */
-#define MAXADDR (((haddr_t)1 << (8*sizeof(HDoff_t) - 1)) - 1)
-#define ADDR_OVERFLOW(A) (HADDR_UNDEF == (A) || ((A) & ~(haddr_t)MAXADDR))
-#define SIZE_OVERFLOW(Z) ((Z) & ~(hsize_t)MAXADDR)
-#define REGION_OVERFLOW(A,Z) (ADDR_OVERFLOW(A) || SIZE_OVERFLOW(Z) || \
- HADDR_UNDEF == (A) + (Z) || \
- (HDoff_t)((A) + (Z)) < (HDoff_t)(A))
-
-/* Callbacks */
-static void *H5FD_mpiposix_fapl_get(H5FD_t *_file);
-static void *H5FD_mpiposix_fapl_copy(const void *_old_fa);
-static herr_t H5FD_mpiposix_fapl_free(void *_fa);
-static H5FD_t *H5FD_mpiposix_open(const char *name, unsigned flags, hid_t fapl_id,
- haddr_t maxaddr);
-static herr_t H5FD_mpiposix_close(H5FD_t *_file);
-static int H5FD_mpiposix_cmp(const H5FD_t *_f1, const H5FD_t *_f2);
-static herr_t H5FD_mpiposix_query(const H5FD_t *_f1, unsigned long *flags);
-static haddr_t H5FD_mpiposix_get_eoa(const H5FD_t *_file, H5FD_mem_t UNUSED type);
-static herr_t H5FD_mpiposix_set_eoa(H5FD_t *_file, H5FD_mem_t type, haddr_t addr);
-static haddr_t H5FD_mpiposix_get_eof(const H5FD_t *_file);
-static herr_t H5FD_mpiposix_get_handle(H5FD_t *_file, hid_t fapl, void** file_handle);
-static herr_t H5FD_mpiposix_read(H5FD_t *_file, H5FD_mem_t type, hid_t fapl_id, haddr_t addr,
- size_t size, void *buf);
-static herr_t H5FD_mpiposix_write(H5FD_t *_file, H5FD_mem_t type, hid_t fapl_id, haddr_t addr,
- size_t size, const void *buf);
-static herr_t H5FD_mpiposix_truncate(H5FD_t *_file, hid_t dxpl_id, hbool_t closing);
-static int H5FD_mpiposix_mpi_rank(const H5FD_t *_file);
-static int H5FD_mpiposix_mpi_size(const H5FD_t *_file);
-static MPI_Comm H5FD_mpiposix_communicator(const H5FD_t *_file);
-
-/* MPIPOSIX-specific file access properties */
-typedef struct H5FD_mpiposix_fapl_t {
- hbool_t use_gpfs; /* use GPFS hints */
- MPI_Comm comm; /* communicator */
-} H5FD_mpiposix_fapl_t;
-
-/* The MPIPOSIX file driver information */
-static const H5FD_class_mpi_t H5FD_mpiposix_g = {
- { /* Start of superclass information */
- "mpiposix", /* name */
- MAXADDR, /* maxaddr */
- H5F_CLOSE_SEMI, /* fc_degree */
- NULL, /* sb_size */
- NULL, /* sb_encode */
- NULL, /* sb_decode */
- sizeof(H5FD_mpiposix_fapl_t), /* fapl_size */
- H5FD_mpiposix_fapl_get, /* fapl_get */
- H5FD_mpiposix_fapl_copy, /* fapl_copy */
- H5FD_mpiposix_fapl_free, /* fapl_free */
- 0, /* dxpl_size */
- NULL, /* dxpl_copy */
- NULL, /* dxpl_free */
- H5FD_mpiposix_open, /* open */
- H5FD_mpiposix_close, /* close */
- H5FD_mpiposix_cmp, /* cmp */
- H5FD_mpiposix_query, /* query */
- NULL, /* get_type_map */
- NULL, /* alloc */
- NULL, /* free */
- H5FD_mpiposix_get_eoa, /* get_eoa */
- H5FD_mpiposix_set_eoa, /* set_eoa */
- H5FD_mpiposix_get_eof, /* get_eof */
- H5FD_mpiposix_get_handle, /* get_handle */
- H5FD_mpiposix_read, /* read */
- H5FD_mpiposix_write, /* write */
- NULL, /* flush */
- H5FD_mpiposix_truncate, /* truncate */
- NULL, /* lock */
- NULL, /* unlock */
- H5FD_FLMAP_DICHOTOMY /* fl_map */
- }, /* End of superclass information */
- H5FD_mpiposix_mpi_rank, /* get_rank */
- H5FD_mpiposix_mpi_size, /* get_size */
- H5FD_mpiposix_communicator /* get_comm */
-};
-
-
-/*-------------------------------------------------------------------------
- * Function: H5FD_mpiposix_init_interface
- *
- * Purpose: Initializes any interface-specific data or routines.
- *
- * Return: Success: The driver ID for the mpiposix driver.
- * Failure: Negative.
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-H5FD_mpiposix_init_interface(void)
-{
- FUNC_ENTER_NOAPI_NOINIT_NOERR
-
- FUNC_LEAVE_NOAPI(H5FD_mpiposix_init())
-} /* H5FD_mpiposix_init_interface() */
-
-
-/*-------------------------------------------------------------------------
- * Function: H5FD_mpiposix_init
- *
- * Purpose: Initialize this driver by registering the driver with the
- * library.
- *
- * Return: Success: The driver ID for the mpiposix driver.
- * Failure: Negative.
- *
- * Programmer: Quincey Koziol
- * Thursday, July 11, 2002
- *
- *-------------------------------------------------------------------------
- */
-hid_t
-H5FD_mpiposix_init(void)
-{
- hid_t ret_value = H5FD_MPIPOSIX_g; /* Return value */
-
- FUNC_ENTER_NOAPI(FAIL)
-
- if(H5I_VFL != H5I_get_type(H5FD_MPIPOSIX_g))
- H5FD_MPIPOSIX_g = H5FD_register((const H5FD_class_t *)&H5FD_mpiposix_g, sizeof(H5FD_class_mpi_t), FALSE);
-
- /* Set return value */
- ret_value = H5FD_MPIPOSIX_g;
-
-done:
- FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5FD_mpiposix_init() */
-
-
-/*---------------------------------------------------------------------------
- * Function: H5FD_mpiposix_term
- *
- * Purpose: Shut down the VFD
- *
- * Returns: SUCCEED (can't fail)
- *
- * Programmer: Quincey Koziol
- * Friday, Jan 30, 2004
- *
- * Modification:
- *
- *---------------------------------------------------------------------------
- */
-void
-H5FD_mpiposix_term(void)
-{
- FUNC_ENTER_NOAPI_NOINIT_NOERR
-
- /* Reset VFL ID */
- H5FD_MPIPOSIX_g = 0;
-
- FUNC_LEAVE_NOAPI_VOID
-} /* end H5FD_mpiposix_term() */
-
-
-/*-------------------------------------------------------------------------
- * Function: H5Pset_fapl_mpiposix
- *
- * Purpose: Store the user supplied MPI communicator COMM in
- * the file access property list FAPL_ID which can then be used
- * to create and/or open the file. This function is available
- * only in the parallel HDF5 library and is not collective.
- *
- * comm is the MPI communicator to be used for file open as
- * defined in MPI_FILE_OPEN of MPI-2. This function makes a
- * duplicate of comm. Any modification to comm after this function
- * call returns has no effect on the access property list.
- *
- * If fapl_id has previously set comm value, it will be replaced
- * and the old communicator is freed.
- *
- * Return: SUCCEED/FAIL
- *
- * Programmer: Quincey Koziol
- * Thursday, July 11, 2002
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5Pset_fapl_mpiposix(hid_t fapl_id, MPI_Comm comm, hbool_t use_gpfs)
-{
- H5FD_mpiposix_fapl_t fa;
- H5P_genplist_t *plist; /* Property list pointer */
- herr_t ret_value;
-
- FUNC_ENTER_API(FAIL)
- H5TRACE3("e", "iMcb", fapl_id, comm, use_gpfs);
-
- /* Check arguments */
- if(NULL == (plist = H5P_object_verify(fapl_id,H5P_FILE_ACCESS)))
- HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "not a file access list")
- if (MPI_COMM_NULL == comm)
- HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "not a valid communicator")
-
- /* Initialize driver specific properties */
- fa.comm = comm;
- fa.use_gpfs = use_gpfs;
-
- /* duplication is done during driver setting. */
- ret_value = H5P_set_driver(plist, H5FD_MPIPOSIX, &fa);
-
-done:
- FUNC_LEAVE_API(ret_value)
-} /* end H5Pset_fapl_mpiposix() */
-
-
-/*-------------------------------------------------------------------------
- * Function: H5Pget_fapl_mpiposix
- *
- * Purpose: If the file access property list is set to the H5FD_MPIPOSIX
- * driver then this function returns a duplicate of the MPI
- * communicator through the comm pointer. It is the responsibility
- * of the application to free the returned communicator.
- *
- * Return: Success: Non-negative with the communicator and
- * information returned through the COMM
- * argument if non-null. Since it is a duplicate
- * of the stored object, future modifications to
- * the access property list do not affect it and
- * it is the responsibility of the application to
- * free it.
- * Failure: Negative
- *
- * Programmer: Quincey Koziol
- * Thursday, July 11, 2002
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5Pget_fapl_mpiposix(hid_t fapl_id, MPI_Comm *comm/*out*/, hbool_t *use_gpfs/*out*/)
-{
- H5FD_mpiposix_fapl_t *fa;
- H5P_genplist_t *plist; /* Property list pointer */
- int mpi_code; /* mpi return code */
- herr_t ret_value = SUCCEED; /* Return value */
-
- FUNC_ENTER_API(FAIL)
- H5TRACE3("e", "ixx", fapl_id, comm, use_gpfs);
-
- if(NULL == (plist = H5P_object_verify(fapl_id,H5P_FILE_ACCESS)))
- HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "not a file access list")
- if (H5FD_MPIPOSIX != H5P_get_driver(plist))
- HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "incorrect VFL driver")
- if (NULL == (fa = H5P_get_driver_info(plist)))
- HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "bad VFL driver info")
-
- /* Get MPI Communicator */
- if (comm){
- if (MPI_SUCCESS != (mpi_code = MPI_Comm_dup(fa->comm, comm)))
- HMPI_GOTO_ERROR(FAIL, "MPI_Comm_dup failed", mpi_code)
- }
-
- if (use_gpfs)
- *use_gpfs = fa->use_gpfs;
-
-done:
- FUNC_LEAVE_API(ret_value)
-} /* end H5Pget_fapl_mpiposix() */
-
-
-/*-------------------------------------------------------------------------
- * Function: H5FD_mpiposix_fapl_get
- *
- * Purpose: Returns a file access property list which could be used to
- * create another file the same as this one.
- *
- * Return: Success: Ptr to new file access property list with all
- * fields copied from the file pointer.
- * Failure: NULL
- *
- * Programmer: Quincey Koziol
- * Thursday, July 11, 2002
- *
- *-------------------------------------------------------------------------
- */
-static void *
-H5FD_mpiposix_fapl_get(H5FD_t *_file)
-{
- H5FD_mpiposix_t *file = (H5FD_mpiposix_t*)_file;
- H5FD_mpiposix_fapl_t *fa = NULL;
- int mpi_code; /* MPI return code */
- void *ret_value; /* Return value */
-
- FUNC_ENTER_NOAPI_NOINIT
-
- HDassert(file);
- HDassert(H5FD_MPIPOSIX == file->pub.driver_id);
-
- if (NULL == (fa = H5MM_calloc(sizeof(H5FD_mpiposix_fapl_t))))
- HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
-
- /* Duplicate the communicator. */
- if (MPI_SUCCESS != (mpi_code=MPI_Comm_dup(file->comm, &fa->comm)))
- HMPI_GOTO_ERROR(NULL, "MPI_Comm_dup failed", mpi_code)
-
- fa->use_gpfs = file->use_gpfs;
-
- /* Set return value */
- ret_value=fa;
-
-done:
- FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5FD_mpiposix_fapl_get() */
-
-
-/*-------------------------------------------------------------------------
- * Function: H5FD_mpiposix_fapl_copy
- *
- * Purpose: Copies the mpiposix-specific file access properties.
- *
- * Return: Success: Ptr to a new property list
- * Failure: NULL
- *
- * Programmer: Albert Cheng
- * Apr 24, 2003
- *
- *-------------------------------------------------------------------------
- */
-static void *
-H5FD_mpiposix_fapl_copy(const void *_old_fa)
-{
- void *ret_value = NULL;
- const H5FD_mpiposix_fapl_t *old_fa = (const H5FD_mpiposix_fapl_t*)_old_fa;
- H5FD_mpiposix_fapl_t *new_fa = NULL;
- int mpi_code; /* MPI return code */
-
- FUNC_ENTER_NOAPI_NOINIT
-
- if (NULL == (new_fa = H5MM_malloc(sizeof(H5FD_mpiposix_fapl_t))))
- HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
-
- /* Copy the general information */
- HDmemcpy(new_fa, old_fa, sizeof(H5FD_mpiposix_fapl_t));
-
- /* Duplicate communicator. */
- if (MPI_SUCCESS != (mpi_code = MPI_Comm_dup(old_fa->comm, &new_fa->comm)))
- HMPI_GOTO_ERROR(NULL, "MPI_Comm_dup failed", mpi_code)
-
- new_fa->use_gpfs = old_fa->use_gpfs;
- ret_value = new_fa;
-
-done:
- if (NULL == ret_value){
- /* cleanup */
- if (new_fa)
- H5MM_xfree(new_fa);
- }
-
- FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5FD_mpiposix_fapl_copy() */
-
-
-/*-------------------------------------------------------------------------
- * Function: H5FD_mpiposix_fapl_free
- *
- * Purpose: Frees the mpiposix-specific file access properties.
- *
- * Return: SUCCEED (can't fail)
- *
- * Programmer: Albert Cheng
- * Apr 24, 2003
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-H5FD_mpiposix_fapl_free(void *_fa)
-{
- H5FD_mpiposix_fapl_t *fa = (H5FD_mpiposix_fapl_t*)_fa;
-
- FUNC_ENTER_NOAPI_NOINIT_NOERR
-
- HDassert(fa);
-
- /* Free the internal communicator */
- HDassert(MPI_COMM_NULL != fa->comm);
- MPI_Comm_free(&fa->comm);
- H5MM_xfree(fa);
-
- FUNC_LEAVE_NOAPI(SUCCEED)
-} /* end H5FD_mpiposix_fapl_free() */
-
-
-/*-------------------------------------------------------------------------
- * Function: H5FD_mpiposix_open
- *
- * Purpose: Opens a file with name NAME. The FLAGS are a bit field with
- * purpose similar to the second argument of open(2) and which
- * are defined in H5Fpublic.h. The file access property list
- * FAPL_ID contains the properties driver properties and MAXADDR
- * is the largest address which this file will be expected to
- * access. This is collective.
- *
- * Return: Success: A new file pointer.
- * Failure: NULL
- *
- * Programmer: Quincey Koziol
- * Thursday, July 11, 2002
- *
- *-------------------------------------------------------------------------
- */
-static H5FD_t *
-H5FD_mpiposix_open(const char *name, unsigned flags, hid_t fapl_id,
- haddr_t maxaddr)
-{
- H5FD_mpiposix_t *file = NULL; /* New MPIPOSIX file struct */
- int o_flags; /* Flags for file open call */
- int fd = -1; /* File handle for file opened */
- int mpi_rank; /* MPI rank of this process */
- int mpi_size; /* Total number of MPI processes */
- int mpi_code; /* mpi return code */
- const H5FD_mpiposix_fapl_t *fa = NULL; /* MPIPOSIX file access property list information */
- H5FD_mpiposix_fapl_t _fa; /* Private copy of default file access property list information */
- H5P_genplist_t *plist; /* Property list pointer */
- h5_stat_t sb; /* Portable 'stat' struct */
-#ifdef H5_HAVE_WIN32_API
- struct _BY_HANDLE_FILE_INFORMATION fileinfo;
-#endif
- H5FD_t *ret_value = NULL; /* Return value */
- MPI_Comm comm_dup = MPI_COMM_NULL;
-
- FUNC_ENTER_NOAPI_NOINIT
-
- /* Check arguments */
- if (!name || !*name)
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "invalid file name")
- if (0 == maxaddr || HADDR_UNDEF == maxaddr)
- HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, NULL, "bogus maxaddr")
- if (ADDR_OVERFLOW(maxaddr))
- HGOTO_ERROR(H5E_ARGS, H5E_OVERFLOW, NULL, "bogus maxaddr")
-
- /* Obtain a pointer to mpiposix-specific file access properties */
- if(NULL == (plist = H5P_object_verify(fapl_id,H5P_FILE_ACCESS)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a file access property list")
- if (H5P_FILE_ACCESS_DEFAULT == fapl_id || H5FD_MPIPOSIX != H5P_get_driver(plist)) {
- _fa.comm = MPI_COMM_SELF; /*default*/
- _fa.use_gpfs = FALSE;
- fa = &_fa;
- } /* end if */
- else {
- if(NULL == (fa = (const H5FD_mpiposix_fapl_t *)H5P_get_driver_info(plist)))
- HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, NULL, "bad VFL driver info")
- } /* end else */
-
- /* Duplicate the communicator for use by this file. */
- if (MPI_SUCCESS != (mpi_code = MPI_Comm_dup(fa->comm, &comm_dup)))
- HMPI_GOTO_ERROR(NULL, "MPI_Comm_dup failed", mpi_code)
-
- /* Get the MPI rank of this process and the total number of processes */
- if (MPI_SUCCESS != (mpi_code = MPI_Comm_rank (comm_dup, &mpi_rank)))
- HMPI_GOTO_ERROR(NULL, "MPI_Comm_rank failed", mpi_code)
- if (MPI_SUCCESS != (mpi_code = MPI_Comm_size (comm_dup, &mpi_size)))
- HMPI_GOTO_ERROR(NULL, "MPI_Comm_size failed", mpi_code)
-
- /* Build the open flags */
- o_flags = (H5F_ACC_RDWR & flags) ? O_RDWR : O_RDONLY;
-
- /* Only set the creation flag(s) for process 0 */
- if(0 == mpi_rank) {
- if (H5F_ACC_TRUNC & flags)
- o_flags |= O_TRUNC;
- if (H5F_ACC_CREAT & flags)
- o_flags |= O_CREAT;
- if (H5F_ACC_EXCL & flags)
- o_flags |= O_EXCL;
- } /* end if */
-
- /* Process 0 opens (or creates) the file while the rest of the
- * processes wait. Then process 0 signals the other processes and they
- * open (never create) the file and all processes proceed.
- */
- /* Process 0 opens (or creates) file and broadcasts result to other processes */
- if(0 == mpi_rank) {
- /* Open the file */
- fd = HDopen(name, o_flags, 0666);
- } /* end if */
-
- /* Broadcast the results of the open() from process 0
- *
- * This is necessary because of the "tentative open" code in H5F_open()
- * where the file is attempted to be opened with different flags from the
- * user's, in order to check for the file's existence, etc. Here, process 0
- * gets different flags from the other processes (since it is in charge of
- * creating the file, if necessary) and can fail in situations where the
- * other process's file opens would succeed, so allow the other processes
- * to check for that situation and bail out now also. - QAK
- */
- if (MPI_SUCCESS != (mpi_code= MPI_Bcast(&fd, sizeof(int), MPI_BYTE, 0, comm_dup)))
- HMPI_GOTO_ERROR(NULL, "MPI_Bcast failed", mpi_code)
-
- /* If the file open on process 0 failed, bail out on all processes now */
- if(fd < 0)
- HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to open file")
-
- /* Other processes (non 0) wait for broadcast result from process 0 and then open file */
- if(mpi_rank != 0) {
- /* Open the file */
- if ((fd = HDopen(name, o_flags, 0666)) < 0)
- HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to open file")
- } /* end if */
-
- /* Process 0 fstat()s the file and broadcasts the results to the other processes */
- if(0 == mpi_rank) {
- /* Get the stat information */
- if (HDfstat(fd, &sb) < 0)
- HGOTO_ERROR(H5E_FILE, H5E_BADFILE, NULL, "unable to fstat file")
- } /* end if */
-
- /* Broadcast the results of the fstat() from process 0 */
- if (MPI_SUCCESS != (mpi_code = MPI_Bcast(&sb, sizeof(h5_stat_t), MPI_BYTE, 0, comm_dup)))
- HMPI_GOTO_ERROR(NULL, "MPI_Bcast failed", mpi_code)
-
-#ifdef H5_HAVE_GPFS
- if (fa->use_gpfs) {
- /*
- * Free all byte range tokens. This is a good thing to do if raw data
- * is aligned on 256kB boundaries (a GPFS page is 256kB). Care should
- * be taken that there aren't too many sub-page writes, or the mmfsd
- * may become overwhelmed. This should probably eventually be passed
- * down here as a property. The gpfs_fcntl() will most likely fail if
- * 'fd' isn't on a GPFS file system. */
- struct {
- gpfsFcntlHeader_t hdr;
- gpfsFreeRange_t fr;
- } hint;
- HDmemset(&hint, 0, sizeof hint);
- hint.hdr.totalLength = sizeof hint;
- hint.hdr.fcntlVersion = GPFS_FCNTL_CURRENT_VERSION;
- hint.fr.structLen = sizeof hint.fr;
- hint.fr.structType = GPFS_FREE_RANGE;
- hint.fr.start = 0;
- hint.fr.length = 0;
-
- if (gpfs_fcntl(fd, &hint) < 0)
- HGOTO_ERROR(H5E_FILE, H5E_FCNTL, NULL, "failed to send hints to GPFS")
- }
-#endif /* H5_HAVE_GPFS */
-
- /* Build the file struct and initialize it */
- if (NULL == (file=H5MM_calloc(sizeof(H5FD_mpiposix_t))))
- HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
-
-#ifdef REPORT_IO
- HDfprintf(stderr, "open: rank=%d name=%s file=0x%08lx\n", mpi_rank, name, (unsigned long)file);
-#endif
-
- /* Set the general file information */
- file->fd = fd;
- file->eof = sb.st_size;
-
- /* for H5_HAVE_WIN32_API support. H5_HAVE_WIN32_API 'stat' does not have
- * st_blksize and st_blksize is only used for the H5_HAVE_GPFS case.
- */
-#ifdef H5_HAVE_GPFS
- file->blksize = sb.st_blksize;
-#endif
-
- /* Set this field in the H5FD_mpiposix_t struct for later use */
- file->use_gpfs = fa->use_gpfs;
-
- /* Set the MPI information */
- file->comm = comm_dup;
- file->mpi_rank = mpi_rank;
- file->mpi_size = mpi_size;
-
- /* Reset the last file I/O operation */
- file->pos = HADDR_UNDEF;
- file->op = OP_UNKNOWN;
-
- /* Set the information for the file's device and inode */
-#ifdef H5_HAVE_WIN32_API
- file->hFile = (HANDLE)_get_osfhandle(fd);
- if(INVALID_HANDLE_VALUE == file->hFile)
- HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to get Windows file handle")
-
- if(!GetFileInformationByHandle((HANDLE)file->hFile, &fileinfo))
- HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to get Windows file information")
-
- file->nFileIndexHigh = fileinfo.nFileIndexHigh;
- file->nFileIndexLow = fileinfo.nFileIndexLow;
- file->dwVolumeSerialNumber = fileinfo.dwVolumeSerialNumber;
-#else /* H5_HAVE_WIN32_API */
- file->device = sb.st_dev;
-#ifdef H5_VMS
- file->inode[0] = sb.st_ino[0];
- file->inode[1] = sb.st_ino[1];
- file->inode[2] = sb.st_ino[2];
-#else /* H5_VMS */
- file->inode = sb.st_ino;
-#endif /* H5_VMS */
-#endif /* H5_HAVE_WIN32_API */
-
- /* Indicate success */
- ret_value = (H5FD_t *)file;
-
-done:
- /* Error cleanup */
- if(NULL == ret_value) {
- /* Close the file if it was left open */
- if(fd != -1)
- HDclose(fd);
- if (MPI_COMM_NULL != comm_dup)
- MPI_Comm_free(&comm_dup);
- } /* end if */
-
- FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5FD_mpiposix_open() */
-
-
-/*-------------------------------------------------------------------------
- * Function: H5FD_mpiposix_close
- *
- * Purpose: Closes a file.
- *
- * Return: SUCCEED/FAIL
- *
- * Programmer: Quincey Koziol
- * Thursday, July 11, 2002
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-H5FD_mpiposix_close(H5FD_t *_file)
-{
- H5FD_mpiposix_t *file = (H5FD_mpiposix_t*)_file;
- herr_t ret_value = SUCCEED; /* Return value */
-
- FUNC_ENTER_NOAPI_NOINIT
-
- HDassert(file);
- HDassert(H5FD_MPIPOSIX == file->pub.driver_id);
-
- /* Close the unix file */
- if(HDclose(file->fd) < 0)
- HGOTO_ERROR(H5E_IO, H5E_CANTCLOSEFILE, FAIL, "unable to close file")
-
- /* make sure all processes have closed the file before returning. */
- MPI_Barrier(file->comm);
- /* Clean up other stuff */
- MPI_Comm_free(&file->comm);
- H5MM_xfree(file);
-
-done:
- FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5FD_mpiposix_close() */
-
-
-/*-------------------------------------------------------------------------
- * Function: H5FD_mpiposix_cmp
- *
- * Purpose: Compares two files belonging to this driver using an
- * arbitrary (but consistent) ordering.
- *
- * Return: Success: A value like strcmp()
- * Failure: never fails (arguments were checked by the caller).
- *
- * Programmer: Quincey Koziol
- * Thursday, July 11, 2002
- *
- *-------------------------------------------------------------------------
- */
-static int
-H5FD_mpiposix_cmp(const H5FD_t *_f1, const H5FD_t *_f2)
-{
- const H5FD_mpiposix_t *f1 = (const H5FD_mpiposix_t*)_f1;
- const H5FD_mpiposix_t *f2 = (const H5FD_mpiposix_t*)_f2;
- int ret_value = 0;
-
- FUNC_ENTER_NOAPI_NOINIT_NOERR
-
-#ifdef H5_HAVE_WIN32_API
- if(f1->dwVolumeSerialNumber < f2->dwVolumeSerialNumber) HGOTO_DONE(-1)
- if(f1->dwVolumeSerialNumber > f2->dwVolumeSerialNumber) HGOTO_DONE(1)
-
- if(f1->nFileIndexHigh < f2->nFileIndexHigh) HGOTO_DONE(-1)
- if(f1->nFileIndexHigh > f2->nFileIndexHigh) HGOTO_DONE(1)
-
- if(f1->nFileIndexLow < f2->nFileIndexLow) HGOTO_DONE(-1)
- if(f1->nFileIndexLow > f2->nFileIndexLow) HGOTO_DONE(1)
-#else /* H5_HAVE_WIN32_API */
-#ifdef H5_DEV_T_IS_SCALAR
- if(f1->device < f2->device) HGOTO_DONE(-1)
- if(f1->device > f2->device) HGOTO_DONE(1)
-#else /* H5_DEV_T_IS_SCALAR */
- /* If dev_t isn't a scalar value on this system, just use memcmp to
- * determine if the values are the same or not. The actual return value
- * shouldn't really matter...
- */
- if(HDmemcmp(&(f1->device),&(f2->device),sizeof(dev_t)) < 0) HGOTO_DONE(-1)
- if(HDmemcmp(&(f1->device),&(f2->device),sizeof(dev_t)) > 0) HGOTO_DONE(1)
-#endif /* H5_DEV_T_IS_SCALAR */
-#ifdef H5_VMS
- if(HDmemcmp(&(f1->inode), &(f2->inode), 3 * sizeof(ino_t)) < 0) HGOTO_DONE(-1)
- if(HDmemcmp(&(f1->inode), &(f2->inode), 3 * sizeof(ino_t)) > 0) HGOTO_DONE(1)
-#else /* H5_VMS */
- if(f1->inode < f2->inode) HGOTO_DONE(-1)
- if(f1->inode > f2->inode) HGOTO_DONE(1)
-#endif /* H5_VMS */
-#endif /* H5_HAVE_WIN32_API */
-
-done:
- FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5FD_mpiposix_cmp() */
-
-
-/*-------------------------------------------------------------------------
- * Function: H5FD_mpiposix_query
- *
- * Purpose: Set the flags that this VFL driver is capable of supporting.
- * (listed in H5FDpublic.h)
- *
- * Return: SUCCEED (can't fail)
- *
- * Programmer: Quincey Koziol
- * Thursday, July 11, 2002
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-H5FD_mpiposix_query(const H5FD_t UNUSED *_file, unsigned long *flags /* out */)
-{
- FUNC_ENTER_NOAPI_NOINIT_NOERR
-
- /* Set the VFL feature flags that this driver supports */
- if(flags) {
- *flags=0;
- *flags |= H5FD_FEAT_AGGREGATE_METADATA; /* OK to aggregate metadata allocations */
- *flags |= H5FD_FEAT_AGGREGATE_SMALLDATA; /* OK to aggregate "small" raw data allocations */
- } /* end if */
-
- FUNC_LEAVE_NOAPI(SUCCEED)
-} /* end H5FD_mpiposix_query() */
-
-
-/*-------------------------------------------------------------------------
- * Function: H5FD_mpiposix_get_eoa
- *
- * Purpose: Gets the end-of-address marker for the file. The EOA marker
- * is the first address past the last byte allocated in the
- * format address space.
- *
- * Return: Success: The end-of-address marker.
- * Failure: HADDR_UNDEF
- *
- * Programmer: Quincey Koziol
- * Thursday, July 11, 2002
- *
- *-------------------------------------------------------------------------
- */
-static haddr_t
-H5FD_mpiposix_get_eoa(const H5FD_t *_file, H5FD_mem_t UNUSED type)
-{
- const H5FD_mpiposix_t *file = (const H5FD_mpiposix_t*)_file;
-
- FUNC_ENTER_NOAPI_NOINIT_NOERR
-
- HDassert(file);
- HDassert(H5FD_MPIPOSIX == file->pub.driver_id);
-
- FUNC_LEAVE_NOAPI(file->eoa)
-} /* end H5FD_mpiposix_get_eoa() */
-
-
-/*-------------------------------------------------------------------------
- * Function: H5FD_mpiposix_set_eoa
- *
- * Purpose: Set the end-of-address marker for the file. This function is
- * called shortly after an existing HDF5 file is opened in order
- * to tell the driver where the end of the HDF5 data is located.
- *
- * Return: SUCCEED (can't fail)
- *
- * Programmer: Quincey Koziol
- * Thursday, July 11, 2002
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-H5FD_mpiposix_set_eoa(H5FD_t *_file, H5FD_mem_t UNUSED type, haddr_t addr)
-{
- H5FD_mpiposix_t *file = (H5FD_mpiposix_t*)_file;
-
- FUNC_ENTER_NOAPI_NOINIT_NOERR
-
- HDassert(file);
- HDassert(H5FD_MPIPOSIX == file->pub.driver_id);
-
- file->eoa = addr;
-
- FUNC_LEAVE_NOAPI(SUCCEED)
-} /* end H5FD_mpi_posix_set_eoa() */
-
-
-/*-------------------------------------------------------------------------
- * Function: H5FD_mpiposix_get_eof
- *
- * Purpose: Gets the end-of-file marker for the file. The EOF marker
- * is the real size of the file.
- *
- * The MPIPOSIX driver doesn't bother keeping this field updated
- * since that's a relatively expensive operation. Fortunately
- * the library only needs the EOF just after the file is opened
- * in order to determine whether the file is empty, truncated,
- * or okay.
- *
- * Return: Success: The end-of-address marker.
- * Failure: HADDR_UNDEF
- *
- * Programmer: Quincey Koziol
- * Thursday, July 11, 2002
- *
- *-------------------------------------------------------------------------
- */
-static haddr_t
-H5FD_mpiposix_get_eof(const H5FD_t *_file)
-{
- const H5FD_mpiposix_t *file = (const H5FD_mpiposix_t*)_file;
-
- FUNC_ENTER_NOAPI_NOINIT_NOERR
-
- HDassert(file);
- HDassert(H5FD_MPIPOSIX == file->pub.driver_id);
-
- FUNC_LEAVE_NOAPI(MAX(file->eof, file->eoa))
-} /* end H5FD_mpiposix_get_eof() */
-
-
-/*-------------------------------------------------------------------------
- * Function: H5FD_mpiposix_get_handle
- *
- * Purpose: Returns the file handle of MPI-POSIX file driver.
- *
- * Returns: SUCCEED/FAIL
- *
- * Programmer: Raymond Lu
- * Sept. 16, 2002
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-H5FD_mpiposix_get_handle(H5FD_t *_file, hid_t UNUSED fapl, void** file_handle)
-{
- H5FD_mpiposix_t *file = (H5FD_mpiposix_t *)_file;
- herr_t ret_value = SUCCEED;
-
- FUNC_ENTER_NOAPI_NOINIT
-
- if(!file_handle)
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "file handle not valid")
-
- *file_handle = &(file->fd);
-
-done:
- FUNC_LEAVE_NOAPI(ret_value)
-}
-
-
-/*-------------------------------------------------------------------------
- * Function: H5FD_mpiposix_read
- *
- * Purpose: Reads SIZE bytes of data from FILE beginning at address ADDR
- * into buffer BUF according to data transfer properties in
- * DXPL_ID using potentially complex file and buffer types to
- * effect the transfer.
- *
- * Reading past the end of the file returns zeros instead of
- * failing.
- *
- * Return: Success: Non-negative. Result is stored in caller-supplied
- * buffer BUF.
- * Failure: Negative, Contents of buffer BUF are undefined.
- *
- * Programmer: Quincey Koziol
- * Thursday, July 11, 2002
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-H5FD_mpiposix_read(H5FD_t *_file, H5FD_mem_t UNUSED type, hid_t UNUSED dxpl_id,
- haddr_t addr, size_t size, void *buf/*out*/)
-{
- H5FD_mpiposix_t *file = (H5FD_mpiposix_t*)_file;
- ssize_t nbytes; /* Number of bytes read each I/O call */
- herr_t ret_value = SUCCEED;
-
- FUNC_ENTER_NOAPI_NOINIT
-
- HDassert(file);
- HDassert(H5FD_MPIPOSIX == file->pub.driver_id);
- HDassert(buf);
-
- /* Check for overflow conditions */
- if (HADDR_UNDEF == addr)
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "addr undefined")
- if (REGION_OVERFLOW(addr, size))
- HGOTO_ERROR(H5E_ARGS, H5E_OVERFLOW, FAIL, "addr overflow")
- if((addr + size) > file->eoa)
- HGOTO_ERROR(H5E_ARGS, H5E_OVERFLOW, FAIL, "addr overflow")
-
-#ifdef REPORT_IO
- {
- int commrank;
- MPI_Comm_rank(MPI_COMM_WORLD, &commrank);
- HDfprintf(stderr, "read: rank=%d file=0x%08lx type=%d, addr=%a size=%Zu\n",
- commrank, (unsigned long)file, (int)type, addr, size);
- }
-#endif
-
- /* Seek to the correct location */
- if(addr != file->pos || OP_READ != file->op) {
- if(HDlseek(file->fd, (HDoff_t)addr, SEEK_SET) < 0)
- HGOTO_ERROR(H5E_IO, H5E_SEEKERROR, FAIL, "unable to seek to proper position")
- } /* end if */
-
- /* Read data, being careful of interrupted system calls, partial results,
- * and the end of the file.
- */
- while(size > 0) {
-
- h5_posix_io_t bytes_in = 0; /* # of bytes to read */
- h5_posix_io_ret_t bytes_read = -1; /* # of bytes actually read */
-
- /* Trying to read more bytes than the return type can handle is
- * undefined behavior in POSIX.
- */
- if(size > H5_POSIX_MAX_IO_BYTES)
- bytes_in = H5_POSIX_MAX_IO_BYTES;
- else
- bytes_in = (h5_posix_io_t)size;
-
- do {
- bytes_read = HDread(file->fd, buf, bytes_in);
- } while(-1 == bytes_read && EINTR == errno);
-
- if(-1 == bytes_read) { /* error */
- int myerrno = errno;
- time_t mytime = HDtime(NULL);
- HDoff_t myoffset = HDlseek(file->fd, (HDoff_t)0, SEEK_CUR);
-
- HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "file read failed: time = %s, file descriptor = %d, errno = %d, error message = '%s', buf = %p, total read size = %llu, bytes this sub-read = %llu, bytes actually read = %llu, offset = %llu", HDctime(&mytime), file->fd, myerrno, HDstrerror(myerrno), buf, (unsigned long long)size, (unsigned long long)bytes_in, (unsigned long long)bytes_read, (unsigned long long)myoffset);
- } /* end if */
-
- if(0 == bytes_read) {
- /* end of file but not end of format address space */
- HDmemset(buf, 0, size);
- break;
- } /* end if */
-
- HDassert(bytes_read >= 0);
- HDassert((size_t)bytes_read <= size);
-
- size -= (size_t)bytes_read;
- addr += (haddr_t)bytes_read;
- buf = (char *)buf + bytes_read;
- } /* end while */
-
- /* Update current position */
- file->pos = addr;
- file->op = OP_READ;
-
-done:
- /* Check for error */
- if(ret_value < 0) {
- /* Reset last file I/O information */
- file->pos = HADDR_UNDEF;
- file->op = OP_UNKNOWN;
- } /* end if */
-
- FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5FD_mpiposix_read() */
-
-
-/*-------------------------------------------------------------------------
- * Function: H5FD_mpiposix_write
- *
- * Purpose: Writes SIZE bytes of data to FILE beginning at address ADDR
- * from buffer BUF according to data transfer properties in
- * DXPL_ID using potentially complex file and buffer types to
- * effect the transfer.
- *
- * Return: SUCCEED/FAIL
- *
- * Programmer: Quincey Koziol
- * Thursday, July 11, 2002
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-H5FD_mpiposix_write(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr,
- size_t size, const void *buf)
-{
- H5FD_mpiposix_t *file = (H5FD_mpiposix_t*)_file;
-#if 0 /* JRM */
- int mpi_code; /* MPI return code */
-#endif /* JRM */
- ssize_t nbytes; /* Number of bytes written each I/O call */
- H5P_genplist_t *plist; /* Property list pointer */
- herr_t ret_value = SUCCEED; /* Return value */
-
- FUNC_ENTER_NOAPI_NOINIT
-
- HDassert(file);
- HDassert(H5FD_MPIPOSIX == file->pub.driver_id);
- HDassert(H5I_GENPROP_LST == H5I_get_type(dxpl_id));
- HDassert(TRUE == H5P_isa_class(dxpl_id,H5P_DATASET_XFER));
- HDassert(buf);
-
- /* Check for overflow conditions */
- if (HADDR_UNDEF == addr)
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "addr undefined")
- if (REGION_OVERFLOW(addr, size))
- HGOTO_ERROR(H5E_ARGS, H5E_OVERFLOW, FAIL, "addr overflow")
- if ((addr + size) > file->eoa)
- HGOTO_ERROR(H5E_ARGS, H5E_OVERFLOW, FAIL, "addr overflow")
-
- /* Obtain the data transfer properties */
- if(NULL == (plist = H5I_object(dxpl_id)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file access property list")
-
- /* Metadata specific actions */
- /* All metadata is now written from process 0 -- thus this function
- * needs to be re-written to reflect this. For now I have simply
- * commented out the code that attempts to synchronize metadata
- * writes between processes, but we should really just flag an error
- * whenever any process other than process 0 attempts to write
- * metadata.
- * -- JRM 9/1/05
- */
- if(type != H5FD_MEM_DRAW) {
- unsigned block_before_meta_write = 0; /* Whether to block before a metadata write */
-
- /* Check if we need to synchronize all processes before attempting
- * metadata write (Prevents race condition where the process writing
- * the metadata goes ahead and writes the metadata to the file before
- * all the processes have read the data, "transmitting" data from the
- * "future" to the reading process. -QAK )
- *
- * The only time we don't want to block before a metadata write is when
- * we are flushing out a bunch of metadata. Then, we block before the
- * first write and don't block for further writes in the sequence.
- */
- if(H5P_exist_plist(plist,H5AC_BLOCK_BEFORE_META_WRITE_NAME) > 0)
- if(H5P_get(plist,H5AC_BLOCK_BEFORE_META_WRITE_NAME,&block_before_meta_write) < 0)
- HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get H5AC property")
-
-#if 0 /* JRM */
- if(block_before_meta_write)
- if (MPI_SUCCESS != (mpi_code = MPI_Barrier(file->comm)))
- HMPI_GOTO_ERROR(FAIL, "MPI_Barrier failed", mpi_code)
-#endif /* JRM */
-
-#if 0 /* JRM -- 3/23/10 */ /* this is no longer always the case */
- /* Only one process will do the actual write if all procs in comm write same metadata */
- if (file->mpi_rank != H5_PAR_META_WRITE)
- HGOTO_DONE(SUCCEED) /* skip the actual write */
-#endif /* JRM */
- } /* end if */
-
-#ifdef REPORT_IO
- {
- int commrank;
- MPI_Comm_rank(MPI_COMM_WORLD, &commrank);
- HDfprintf(stderr, "write: rank=%d file=0x%08lx type=%d, addr=%a size=%Zu %s\n",
- commrank, (unsigned long)file, (int)type, addr, size,
- 0 == file->naccess ? "(FIRST ACCESS)" : "");
- }
-#endif
-
- if (0 == file->naccess++) {
- /* First write access to this file */
-#ifdef H5_HAVE_GPFS
- if (file->use_gpfs) {
- struct {
- gpfsFcntlHeader_t hdr;
- gpfsMultipleAccessRange_t mar;
- } hint;
- HDmemset(&hint, 0, sizeof hint);
- hint.hdr.totalLength = sizeof hint;
- hint.hdr.fcntlVersion = GPFS_FCNTL_CURRENT_VERSION;
- hint.mar.structLen = sizeof hint.mar;
- hint.mar.structType = GPFS_MULTIPLE_ACCESS_RANGE;
- hint.mar.accRangeCnt = 1;
- hint.mar.accRangeArray[0].blockNumber = addr / file->blksize;
- hint.mar.accRangeArray[0].start = addr % file->blksize;
- hint.mar.accRangeArray[0].length = MIN(file->blksize-hint.mar.accRangeArray[0].start, size);
- hint.mar.accRangeArray[0].isWrite = 1;
- if (gpfs_fcntl(file->fd, &hint)<0)
- HGOTO_ERROR(H5E_FILE, H5E_FCNTL, NULL, "failed to send hints to GPFS")
- }
-#endif /* H5_HAVE_GPFS */
- }
-
- /* Seek to the correct location */
- if(addr != file->pos || OP_WRITE != file->op) {
- if(HDlseek(file->fd, (HDoff_t)addr, SEEK_SET) < 0)
- HSYS_GOTO_ERROR(H5E_IO, H5E_SEEKERROR, FAIL, "unable to seek to proper position")
- } /* end if */
-
- /* Write data, being careful of interrupted system calls, partial results,
- * and the end of the file.
- */
- while(size > 0) {
-
- h5_posix_io_t bytes_in = 0; /* # of bytes to write */
- h5_posix_io_ret_t bytes_wrote = -1; /* # of bytes actually written */
-
- /* Trying to write more bytes than the return type can handle is
- * undefined behavior in POSIX.
- */
- if(size > H5_POSIX_MAX_IO_BYTES)
- bytes_in = H5_POSIX_MAX_IO_BYTES;
- else
- bytes_in = (h5_posix_io_t)size;
-
- do {
- bytes_wrote = HDwrite(file->fd, buf, bytes_in);
- } while(-1 == bytes_wrote && EINTR == errno);
-
- if(-1 == bytes_wrote) { /* error */
- int myerrno = errno;
- time_t mytime = HDtime(NULL);
- HDoff_t myoffset = HDlseek(file->fd, (HDoff_t)0, SEEK_CUR);
-
- HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "file write failed: time = %s, file descriptor = %d, errno = %d, error message = '%s', buf = %p, total write size = %llu, bytes this sub-write = %llu, bytes actually written = %llu, offset = %llu", HDctime(&mytime), file->fd, myerrno, HDstrerror(myerrno), buf, (unsigned long long)size, (unsigned long long)bytes_in, (unsigned long long)bytes_wrote, (unsigned long long)myoffset);
- } /* end if */
-
- if(0 == bytes_wrote) {
- /* end of file but not end of format address space */
- HDmemset(buf, 0, size);
- break;
- } /* end if */
-
- HDassert(bytes_wrote >= 0);
- HDassert((size_t)bytes_wrote <= size);
-
- size -= (size_t)bytes_wrote;
- addr += (haddr_t)bytes_wrote;
- buf = (char *)buf + bytes_wrote;
- } /* end while */
-
- /* Update current position */
- file->pos = addr;
- file->op = OP_WRITE;
-
-done:
- /* Check for error */
- if(ret_value < 0) {
- /* Reset last file I/O information */
- file->pos = HADDR_UNDEF;
- file->op = OP_UNKNOWN;
- } /* end if */
-#if 0 /* JRM */
- /* Since metadata writes are now done by process 0 only, this broadcast
- * is no longer needed. I leave it in and commented out to remind us
- * that we need to re-work this function to reflect this reallity.
- *
- * -- JRM 9/1/05
- */
-
- /* Guard against getting into metadata broadcast in failure cases */
- else {
- /* when only one process writes, need to broadcast the ret_value to other processes */
- if (type != H5FD_MEM_DRAW) {
- if (MPI_SUCCESS != (mpi_code= MPI_Bcast(&ret_value, sizeof(ret_value), MPI_BYTE, H5_PAR_META_WRITE, file->comm)))
- HMPI_GOTO_ERROR(FAIL, "MPI_Bcast failed", mpi_code)
- } /* end if */
- } /* end else */
-#endif /* JRM */
-
- FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5FD_mpiposix_write() */
-
-
-/*-------------------------------------------------------------------------
- * Function: H5FD_mpiposix_truncate
- *
- * Purpose: Makes sure that the true file size is the same (or larger)
- * than the end-of-address.
- *
- * Return: SUCCEED/FAIL
- *
- * Programmer: Quincey Koziol
- * Thursday, July 11, 2002
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-H5FD_mpiposix_truncate(H5FD_t *_file, hid_t UNUSED dxpl_id, hbool_t UNUSED closing)
-{
- H5FD_mpiposix_t *file = (H5FD_mpiposix_t*)_file;
- herr_t ret_value = SUCCEED; /* Return value */
- int mpi_code; /* MPI return code */
-
- FUNC_ENTER_NOAPI_NOINIT
-
- HDassert(file);
- HDassert(H5FD_MPIPOSIX == file->pub.driver_id);
-
- /* Extend the file to make sure it's large enough */
- if(file->eoa > file->last_eoa) {
- /* Use the round-robin process to truncate (extend) the file */
- if(file->mpi_rank == H5_PAR_META_WRITE) {
-
-#ifdef H5_HAVE_WIN32_API
- LARGE_INTEGER li; /* 64-bit (union) integer for SetFilePointer() call */
- DWORD dwPtrLow; /* Low-order pointer bits from SetFilePointer()
- * Only used as an error code here.
- */
- DWORD dwError; /* DWORD error code from GetLastError() */
- BOOL bError; /* Boolean error flag */
-
- /* Windows uses this odd QuadPart union for 32/64-bit portability */
- li.QuadPart = (__int64)file->eoa;
-
- /* Extend the file to make sure it's large enough.
- *
- * Since INVALID_SET_FILE_POINTER can technically be a valid return value
- * from SetFilePointer(), we also need to check GetLastError().
- */
- dwPtrLow = SetFilePointer(file->hFile, li.LowPart, &li.HighPart, FILE_BEGIN);
- if(INVALID_SET_FILE_POINTER == dwPtrLow) {
- dwError = GetLastError();
- if(dwError != NO_ERROR )
- HGOTO_ERROR(H5E_FILE, H5E_FILEOPEN, FAIL, "unable to set file pointer")
- }
-
- bError = SetEndOfFile(file->hFile);
- if(0 == bError)
- HGOTO_ERROR(H5E_IO, H5E_SEEKERROR, FAIL, "unable to extend file properly")
-#else /* H5_HAVE_WIN32_API */
-#ifdef H5_VMS
- /* Reset seek offset to the beginning of the file, so that the file isn't
- * re-extended later. This may happen on Open VMS. */
- if(-1 == HDlseek(file->fd, (HDoff_t)0, SEEK_SET))
- HSYS_GOTO_ERROR(H5E_IO, H5E_SEEKERROR, FAIL, "unable to seek to proper position")
-#endif /* H5_VMS */
- if(-1 == HDftruncate(file->fd, (HDoff_t)file->eoa))
- HSYS_GOTO_ERROR(H5E_IO, H5E_SEEKERROR, FAIL, "unable to extend file properly")
-#endif /* H5_HAVE_WIN32_API */
- } /* end if */
-
- /* Don't let any proc return until all have extended the file.
- * (Prevents race condition where some processes go ahead and write
- * more data to the file before all the processes have finished making
- * it the shorter length, potentially truncating the file and dropping
- * the new data written)
- */
- if(MPI_SUCCESS != (mpi_code = MPI_Barrier(file->comm)))
- HMPI_GOTO_ERROR(FAIL, "MPI_Barrier failed", mpi_code)
-
- /* Update the 'last' eoa and eof values */
- file->last_eoa = file->eoa;
- file->eof = file->eoa;
-
- /* Reset last file I/O information */
- file->pos = HADDR_UNDEF;
- file->op = OP_UNKNOWN;
- } /* end if */
-
-done:
- FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5FD_mpiposix_truncate() */
-
-
-/*-------------------------------------------------------------------------
- * Function: H5FD_mpiposix_mpi_rank
- *
- * Purpose: Returns the MPI rank for a process
- *
- * Return: MPI rank. Cannot report failure.
- *
- * Programmer: Quincey Koziol
- * Thursday, July 11, 2002
- *
- *-------------------------------------------------------------------------
- */
-static int
-H5FD_mpiposix_mpi_rank(const H5FD_t *_file)
-{
- const H5FD_mpiposix_t *file = (const H5FD_mpiposix_t*)_file;
-
- FUNC_ENTER_NOAPI_NOINIT_NOERR
-
- HDassert(file);
- HDassert(H5FD_MPIPOSIX == file->pub.driver_id);
-
- FUNC_LEAVE_NOAPI(file->mpi_rank)
-} /* end H5FD_mpiposix_mpi_rank() */
-
-
-/*-------------------------------------------------------------------------
- * Function: H5FD_mpiposix_mpi_size
- *
- * Purpose: Returns the number of MPI processes
- *
- * Return: The number of MPI processes. Cannot report failure.
- *
- * Programmer: Quincey Koziol
- * Thursday, July 11, 2002
- *
- *-------------------------------------------------------------------------
- */
-static int
-H5FD_mpiposix_mpi_size(const H5FD_t *_file)
-{
- const H5FD_mpiposix_t *file = (const H5FD_mpiposix_t*)_file;
-
- FUNC_ENTER_NOAPI_NOINIT_NOERR
-
- HDassert(file);
- HDassert(H5FD_MPIPOSIX == file->pub.driver_id);
-
- FUNC_LEAVE_NOAPI(file->mpi_size)
-} /* end H5FD_mpiposix_mpi_size() */
-
-
-/*-------------------------------------------------------------------------
- * Function: H5FD_mpiposix_communicator
- *
- * Purpose: Returns the MPI communicator for the file.
- *
- * Return: The MPI communicator. Cannot report failure.
- *
- * Programmer: Quincey Koziol
- * Thursday, July 11, 2002
- *
- *-------------------------------------------------------------------------
- */
-static MPI_Comm
-H5FD_mpiposix_communicator(const H5FD_t *_file)
-{
- const H5FD_mpiposix_t *file = (const H5FD_mpiposix_t*)_file;
-
- FUNC_ENTER_NOAPI_NOINIT_NOERR
-
- HDassert(file);
- HDassert(H5FD_MPIPOSIX == file->pub.driver_id);
-
- FUNC_LEAVE_NOAPI(file->comm)
-} /* end H5FD_mpi_posix_communicator() */
-
-#endif /*H5_HAVE_PARALLEL*/
diff --git a/src/H5FDmpiposix.h b/src/H5FDmpiposix.h
deleted file mode 100644
index fdf30a1..0000000
--- a/src/H5FDmpiposix.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * Copyright by The HDF Group. *
- * Copyright by the Board of Trustees of the University of Illinois. *
- * All rights reserved. *
- * *
- * This file is part of HDF5. The full HDF5 copyright notice, including *
- * terms governing use, modification, and redistribution, is contained in *
- * the files COPYING and Copyright.html. COPYING can be found at the root *
- * of the source code distribution tree; Copyright.html can be found at the *
- * root level of an installed copy of the electronic HDF5 document set and *
- * is linked from the top-level documents page. It can also be found at *
- * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have *
- * access to either file, you may request a copy from help@hdfgroup.org. *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-/*
- * Programmer: Quincey Koziol <koziol@hdfgroup.org>
- * Thursday, July 11, 2002
- *
- * Purpose: The public header file for the mpiposix driver.
- */
-
-#ifndef __H5FDmpiposix_H
-#define __H5FDmpiposix_H
-
-#ifdef H5_HAVE_PARALLEL
-# define H5FD_MPIPOSIX (H5FD_mpiposix_init())
-#else
-# define H5FD_MPIPOSIX (-1)
-#endif
-
-/* Macros */
-
-#ifdef H5_HAVE_PARALLEL
-
-/* Function prototypes */
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-H5_DLL hid_t H5FD_mpiposix_init(void);
-H5_DLL void H5FD_mpiposix_term(void);
-H5_DLL herr_t H5Pset_fapl_mpiposix(hid_t fapl_id, MPI_Comm comm, hbool_t use_gpfs);
-H5_DLL herr_t H5Pget_fapl_mpiposix(hid_t fapl_id, MPI_Comm *comm/*out*/, hbool_t *use_gpfs/*out*/);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /*H5_HAVE_PARALLEL*/
-
-#endif /* __H5FDmpiposix_H */
diff --git a/src/H5FDprivate.h b/src/H5FDprivate.h
index 41c6b38..cdd2023 100644
--- a/src/H5FDprivate.h
+++ b/src/H5FDprivate.h
@@ -43,12 +43,9 @@
#define IS_H5FD_MPIO(f) /* (H5F_t *f) */ \
(H5FD_MPIO==H5F_DRIVER_ID(f))
-#define IS_H5FD_MPIPOSIX(f) /* (H5F_t *f) */ \
- (H5FD_MPIPOSIX==H5F_DRIVER_ID(f))
-
/* Single macro to check for all file drivers that use MPI */
#define IS_H5FD_MPI(file) \
- (IS_H5FD_MPIO(file) || IS_H5FD_MPIPOSIX(file))
+ (IS_H5FD_MPIO(file))
#ifdef H5_HAVE_PARALLEL
/* ======== Temporary data transfer properties ======== */
diff --git a/src/H5Ppublic.h b/src/H5Ppublic.h
index 54999b9..10fa782 100644
--- a/src/H5Ppublic.h
+++ b/src/H5Ppublic.h
@@ -158,11 +158,10 @@ typedef enum H5D_mpio_no_collective_cause_t {
H5D_MPIO_SET_INDEPENDENT = 0x01,
H5D_MPIO_DATATYPE_CONVERSION = 0x02,
H5D_MPIO_DATA_TRANSFORMS = 0x04,
- H5D_MPIO_SET_MPIPOSIX = 0x08,
+ H5D_MPIO_MPI_OPT_TYPES_ENV_VAR_DISABLED = 0x08,
H5D_MPIO_NOT_SIMPLE_OR_SCALAR_DATASPACES = 0x10,
- H5D_MPIO_POINT_SELECTIONS = 0x20,
- H5D_MPIO_NOT_CONTIGUOUS_OR_CHUNKED_DATASET = 0x40,
- H5D_MPIO_FILTERS = 0x80
+ H5D_MPIO_NOT_CONTIGUOUS_OR_CHUNKED_DATASET = 0x20,
+ H5D_MPIO_FILTERS = 0x40
} H5D_mpio_no_collective_cause_t;
/********************/
diff --git a/src/H5S.c b/src/H5S.c
index 1ba0248..65588bc 100644
--- a/src/H5S.c
+++ b/src/H5S.c
@@ -67,10 +67,6 @@ static H5S_t *H5S_decode(const unsigned char *buf);
/*****************************/
/* Library Private Variables */
/*****************************/
-#ifdef H5_HAVE_PARALLEL
-/* Global vars whose value can be set from environment variable also */
-hbool_t H5S_mpi_opt_types_g = TRUE;
-#endif /* H5_HAVE_PARALLEL */
/*******************/
@@ -119,15 +115,6 @@ H5S_init_interface(void)
if(H5I_register_type(H5I_DATASPACE_CLS) < 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL, "unable to initialize interface")
-#ifdef H5_HAVE_PARALLEL
- {
- /* Allow MPI buf-and-file-type optimizations? */
- const char *s = HDgetenv ("HDF5_MPI_OPT_TYPES");
- if (s && HDisdigit(*s))
- H5S_mpi_opt_types_g = (hbool_t)HDstrtol (s, NULL, 0);
- }
-#endif /* H5_HAVE_PARALLEL */
-
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5S_init_interface() */
diff --git a/src/H5Sprivate.h b/src/H5Sprivate.h
index be8a28f..44cd6c3 100644
--- a/src/H5Sprivate.h
+++ b/src/H5Sprivate.h
@@ -268,10 +268,6 @@ H5_DLL herr_t H5S_select_iter_next(H5S_sel_iter_t *sel_iter, size_t nelem);
H5_DLL herr_t H5S_select_iter_release(H5S_sel_iter_t *sel_iter);
#ifdef H5_HAVE_PARALLEL
-/* Global vars whose value comes from environment variable */
-/* (Defined in H5S.c) */
-H5_DLLVAR hbool_t H5S_mpi_opt_types_g;
-
H5_DLL herr_t H5S_mpio_space_type(const H5S_t *space, size_t elmt_size,
/* out: */ MPI_Datatype *new_type,
int *count,
diff --git a/src/H5config.h.in b/src/H5config.h.in
index 02bafd8..76de6c6 100644
--- a/src/H5config.h.in
+++ b/src/H5config.h.in
@@ -174,12 +174,6 @@
/* Define to 1 if you have the `get_fpc_csr' function. */
#undef HAVE_GET_FPC_CSR
-/* Define if we have GPFS support */
-#undef HAVE_GPFS
-
-/* Define to 1 if you have the <gpfs.h> header file. */
-#undef HAVE_GPFS_H
-
/* Define if library will contain instrumentation to detect correct
optimization operation */
#undef HAVE_INSTRUMENTED_LIBRARY
diff --git a/src/H5trace.c b/src/H5trace.c
index f7d48c7..b8f0b6a 100644
--- a/src/H5trace.c
+++ b/src/H5trace.c
@@ -544,48 +544,45 @@ H5_trace(const double *returning, const char *func, const char *type, ...)
} /* end if */
else {
H5D_mpio_no_collective_cause_t nocol_cause_mode = (H5D_mpio_no_collective_cause_t)va_arg(ap, int);
+ hbool_t flag_already_displayed = FALSE;
- switch(nocol_cause_mode) {
- case H5D_MPIO_COLLECTIVE:
- fprintf(out, "H5D_MPIO_COLLECTIVE");
- break;
-
- case H5D_MPIO_SET_INDEPENDENT:
- fprintf(out, "H5D_MPIO_SET_INDEPENDENT");
- break;
-
- case H5D_MPIO_DATATYPE_CONVERSION:
- fprintf(out, "H5D_MPIO_DATATYPE_CONVERSION");
- break;
-
- case H5D_MPIO_DATA_TRANSFORMS:
- fprintf(out, "H5D_MPIO_DATA_TRANSFORMS");
- break;
-
- case H5D_MPIO_SET_MPIPOSIX:
- fprintf(out, "H5D_MPIO_SET_MPIPOSIX");
- break;
-
- case H5D_MPIO_NOT_SIMPLE_OR_SCALAR_DATASPACES:
- fprintf(out, "H5D_MPIO_NOT_SIMPLE_OR_SCALAR_DATASPACES");
- break;
-
- case H5D_MPIO_POINT_SELECTIONS:
- fprintf(out, "H5D_MPIO_POINT_SELECTIONS");
- break;
-
- case H5D_MPIO_NOT_CONTIGUOUS_OR_CHUNKED_DATASET:
- fprintf(out, "H5D_MPIO_NOT_CONTIGUOUS_OR_CHUNKED_DATASET");
- break;
-
- case H5D_MPIO_FILTERS:
- fprintf(out, "H5D_MPIO_FILTERS");
- break;
+ /* Check for all bit-flags which might be set */
+ if(nocol_cause_mode & H5D_MPIO_COLLECTIVE) {
+ fprintf(out, "H5D_MPIO_COLLECTIVE");
+ flag_already_displayed = TRUE;
+ } /* end if */
+ if(nocol_cause_mode & H5D_MPIO_SET_INDEPENDENT) {
+ fprintf(out, "%sH5D_MPIO_SET_INDEPENDENT", flag_already_displayed ? " | " : "");
+ flag_already_displayed = TRUE;
+ } /* end if */
+ if(nocol_cause_mode & H5D_MPIO_DATATYPE_CONVERSION) {
+ fprintf(out, "%sH5D_MPIO_DATATYPE_CONVERSION", flag_already_displayed ? " | " : "");
+ flag_already_displayed = TRUE;
+ } /* end if */
+ if(nocol_cause_mode & H5D_MPIO_DATA_TRANSFORMS) {
+ fprintf(out, "%sH5D_MPIO_DATA_TRANSFORMS", flag_already_displayed ? " | " : "");
+ flag_already_displayed = TRUE;
+ } /* end if */
+ if(nocol_cause_mode & H5D_MPIO_MPI_OPT_TYPES_ENV_VAR_DISABLED) {
+ fprintf(out, "%sH5D_MPIO_MPI_OPT_TYPES_ENV_VAR_DISABLED", flag_already_displayed ? " | " : "");
+ flag_already_displayed = TRUE;
+ } /* end if */
+ if(nocol_cause_mode & H5D_MPIO_NOT_SIMPLE_OR_SCALAR_DATASPACES) {
+ fprintf(out, "%sH5D_MPIO_NOT_SIMPLE_OR_SCALAR_DATASPACES", flag_already_displayed ? " | " : "");
+ flag_already_displayed = TRUE;
+ } /* end if */
+ if(nocol_cause_mode & H5D_MPIO_NOT_CONTIGUOUS_OR_CHUNKED_DATASET) {
+ fprintf(out, "%sH5D_MPIO_NOT_CONTIGUOUS_OR_CHUNKED_DATASET", flag_already_displayed ? " | " : "");
+ flag_already_displayed = TRUE;
+ } /* end if */
+ if(nocol_cause_mode & H5D_MPIO_FILTERS) {
+ fprintf(out, "%sH5D_MPIO_FILTERS", flag_already_displayed ? " | " : "");
+ flag_already_displayed = TRUE;
+ } /* end if */
- default:
- fprintf(out, "%ld", (long)nocol_cause_mode);
- break;
- } /* end switch */
+ /* Display '<none>' if there's no flags set */
+ if(!flag_already_displayed)
+ fprintf(out, "<none>");
} /* end else */
break;
diff --git a/src/Makefile.am b/src/Makefile.am
index e7c1968..b19f205 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -56,7 +56,7 @@ libhdf5_la_SOURCES= H5.c H5checksum.c H5dbg.c H5system.c H5timer.c H5trace.c \
H5Fsfile.c H5Fsuper.c H5Fsuper_cache.c H5Ftest.c \
H5FD.c H5FDcore.c \
H5FDdirect.c H5FDfamily.c H5FDint.c H5FDlog.c H5FDmpi.c H5FDmpio.c \
- H5FDmpiposix.c H5FDmulti.c H5FDsec2.c H5FDspace.c H5FDstdio.c \
+ H5FDmulti.c H5FDsec2.c H5FDspace.c H5FDstdio.c \
H5FL.c H5FO.c H5FS.c H5FScache.c H5FSdbg.c H5FSsection.c H5FSstat.c H5FStest.c \
H5G.c H5Gbtree2.c H5Gcache.c \
H5Gcompact.c H5Gdense.c H5Gdeprec.c H5Gent.c \
@@ -108,8 +108,9 @@ libhdf5_la_SOURCES= H5.c H5checksum.c H5dbg.c H5system.c H5timer.c H5trace.c \
include_HEADERS = hdf5.h H5api_adpt.h H5overflow.h H5pubconf.h H5public.h H5version.h \
H5Apublic.h H5ACpublic.h \
H5Cpublic.h H5Dpublic.h \
- H5Epubgen.h H5Epublic.h H5Fpublic.h H5FDpublic.h H5FDcore.h H5FDdirect.h \
- H5FDfamily.h H5FDlog.h H5FDmpi.h H5FDmpio.h H5FDmpiposix.h \
+ H5Epubgen.h H5Epublic.h H5Fpublic.h \
+ H5FDpublic.h H5FDcore.h H5FDdirect.h \
+ H5FDfamily.h H5FDlog.h H5FDmpi.h H5FDmpio.h \
H5FDmulti.h H5FDsec2.h H5FDstdio.h \
H5Gpublic.h H5Ipublic.h H5Lpublic.h \
H5MMpublic.h H5Opublic.h H5Ppublic.h \
diff --git a/src/Makefile.in b/src/Makefile.in
index 110d6de..4a2e5e1 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -132,13 +132,13 @@ am_libhdf5_la_OBJECTS = H5.lo H5checksum.lo H5dbg.lo H5system.lo \
H5Fmpi.lo H5Fquery.lo H5Fsfile.lo H5Fsuper.lo \
H5Fsuper_cache.lo H5Ftest.lo H5FD.lo H5FDcore.lo H5FDdirect.lo \
H5FDfamily.lo H5FDint.lo H5FDlog.lo H5FDmpi.lo H5FDmpio.lo \
- H5FDmpiposix.lo H5FDmulti.lo H5FDsec2.lo H5FDspace.lo \
- H5FDstdio.lo H5FL.lo H5FO.lo H5FS.lo H5FScache.lo H5FSdbg.lo \
- H5FSsection.lo H5FSstat.lo H5FStest.lo H5G.lo H5Gbtree2.lo \
- H5Gcache.lo H5Gcompact.lo H5Gdense.lo H5Gdeprec.lo H5Gent.lo \
- H5Gint.lo H5Glink.lo H5Gloc.lo H5Gname.lo H5Gnode.lo H5Gobj.lo \
- H5Goh.lo H5Groot.lo H5Gstab.lo H5Gtest.lo H5Gtraverse.lo \
- H5HF.lo H5HFbtree2.lo H5HFcache.lo H5HFdbg.lo H5HFdblock.lo \
+ H5FDmulti.lo H5FDsec2.lo H5FDspace.lo H5FDstdio.lo H5FL.lo \
+ H5FO.lo H5FS.lo H5FScache.lo H5FSdbg.lo H5FSsection.lo \
+ H5FSstat.lo H5FStest.lo H5G.lo H5Gbtree2.lo H5Gcache.lo \
+ H5Gcompact.lo H5Gdense.lo H5Gdeprec.lo H5Gent.lo H5Gint.lo \
+ H5Glink.lo H5Gloc.lo H5Gname.lo H5Gnode.lo H5Gobj.lo H5Goh.lo \
+ H5Groot.lo H5Gstab.lo H5Gtest.lo H5Gtraverse.lo H5HF.lo \
+ H5HFbtree2.lo H5HFcache.lo H5HFdbg.lo H5HFdblock.lo \
H5HFdtable.lo H5HFhdr.lo H5HFhuge.lo H5HFiblock.lo H5HFiter.lo \
H5HFman.lo H5HFsection.lo H5HFspace.lo H5HFstat.lo H5HFtest.lo \
H5HFtiny.lo H5HG.lo H5HGcache.lo H5HGdbg.lo H5HGquery.lo \
@@ -302,7 +302,6 @@ FC_VERSION = @FC_VERSION@
FGREP = @FGREP@
FILTERS = @FILTERS@
FSEARCH_DIRS = @FSEARCH_DIRS@
-GPFS = @GPFS@
GREP = @GREP@
H5_CFLAGS = @H5_CFLAGS@
H5_CPPFLAGS = @H5_CPPFLAGS@
@@ -546,7 +545,7 @@ libhdf5_la_SOURCES = H5.c H5checksum.c H5dbg.c H5system.c H5timer.c H5trace.c \
H5Fsfile.c H5Fsuper.c H5Fsuper_cache.c H5Ftest.c \
H5FD.c H5FDcore.c \
H5FDdirect.c H5FDfamily.c H5FDint.c H5FDlog.c H5FDmpi.c H5FDmpio.c \
- H5FDmpiposix.c H5FDmulti.c H5FDsec2.c H5FDspace.c H5FDstdio.c \
+ H5FDmulti.c H5FDsec2.c H5FDspace.c H5FDstdio.c \
H5FL.c H5FO.c H5FS.c H5FScache.c H5FSdbg.c H5FSsection.c H5FSstat.c H5FStest.c \
H5G.c H5Gbtree2.c H5Gcache.c \
H5Gcompact.c H5Gdense.c H5Gdeprec.c H5Gent.c \
@@ -598,8 +597,9 @@ libhdf5_la_SOURCES = H5.c H5checksum.c H5dbg.c H5system.c H5timer.c H5trace.c \
include_HEADERS = hdf5.h H5api_adpt.h H5overflow.h H5pubconf.h H5public.h H5version.h \
H5Apublic.h H5ACpublic.h \
H5Cpublic.h H5Dpublic.h \
- H5Epubgen.h H5Epublic.h H5Fpublic.h H5FDpublic.h H5FDcore.h H5FDdirect.h \
- H5FDfamily.h H5FDlog.h H5FDmpi.h H5FDmpio.h H5FDmpiposix.h \
+ H5Epubgen.h H5Epublic.h H5Fpublic.h \
+ H5FDpublic.h H5FDcore.h H5FDdirect.h \
+ H5FDfamily.h H5FDlog.h H5FDmpi.h H5FDmpio.h \
H5FDmulti.h H5FDsec2.h H5FDstdio.h \
H5Gpublic.h H5Ipublic.h H5Lpublic.h \
H5MMpublic.h H5Opublic.h H5Ppublic.h \
@@ -791,7 +791,6 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5FDlog.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5FDmpi.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5FDmpio.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5FDmpiposix.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5FDmulti.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5FDsec2.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5FDspace.Plo@am__quote@
diff --git a/src/hdf5.lnt b/src/hdf5.lnt
index 28d8807..f3e81f8 100644
--- a/src/hdf5.lnt
+++ b/src/hdf5.lnt
@@ -92,6 +92,5 @@
macros cleaned up, but have not been linted
due to their dependencies on features that we don't support on Windows:
H5FDmpio.c
- H5FDmpiposix.c
H5FDstream.c
*/
diff --git a/src/libhdf5.settings.in b/src/libhdf5.settings.in
index 343fa34..0402ffa 100644
--- a/src/libhdf5.settings.in
+++ b/src/libhdf5.settings.in
@@ -69,7 +69,6 @@ Features:
Clear file buffers before write: @CLEARFILEBUF@
Using memory checker: @USINGMEMCHECKER@
Function Stack Tracing: @CODESTACK@
- GPFS: @GPFS@
Strict File Format Checks: @STRICT_FORMAT_CHECKS@
Optimization Instrumentation: @INSTRUMENT@
Large File Support (LFS): @LARGEFILE@