summaryrefslogtreecommitdiffstats
path: root/src/H5FDstdio.c
diff options
context:
space:
mode:
authorQuincey Koziol <koziol@hdfgroup.org>2002-05-10 18:38:10 (GMT)
committerQuincey Koziol <koziol@hdfgroup.org>2002-05-10 18:38:10 (GMT)
commit084b35362bfac78604b02654cdc2067488c00300 (patch)
treee67284d7304850ef0428155c54a1d3d48c06875f /src/H5FDstdio.c
parent9815305745d7317d7bd6cee494a42bc2a62001c6 (diff)
downloadhdf5-084b35362bfac78604b02654cdc2067488c00300.zip
hdf5-084b35362bfac78604b02654cdc2067488c00300.tar.gz
hdf5-084b35362bfac78604b02654cdc2067488c00300.tar.bz2
[svn-r5393] Purpose:
New Feature Description: The VFL flush function is called immediately before a file is closed. This can cause duplicate syncronization actions to occur, if the VFL close function also performs them. Solution: Added 'closing' parameter to VFL 'flush' operation. This allows the VFL flush function to bypass operations that will be duplicated within the VFL close function. Additionally, use the 'closing' parameter to bypass calls to MPI_File_sync() when set. Since MPI_File_close() also syncronizes the file, this avoids the terrible performance hit taken when calling MPI_File_sync() as the file is closing. Platforms tested: IRIX64 6.5 (modi4)
Diffstat (limited to 'src/H5FDstdio.c')
-rw-r--r--src/H5FDstdio.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/src/H5FDstdio.c b/src/H5FDstdio.c
index 4085de7..0599431 100644
--- a/src/H5FDstdio.c
+++ b/src/H5FDstdio.c
@@ -141,7 +141,7 @@ static herr_t H5FD_stdio_read(H5FD_t *lf, H5FD_mem_t type, hid_t fapl_id, haddr_
size_t size, void *buf);
static herr_t H5FD_stdio_write(H5FD_t *lf, H5FD_mem_t type, hid_t fapl_id, haddr_t addr,
size_t size, const void *buf);
-static herr_t H5FD_stdio_flush(H5FD_t *_file);
+static herr_t H5FD_stdio_flush(H5FD_t *_file, hbool_t closing);
static const H5FD_class_t H5FD_stdio_g = {
"stdio", /*name */
@@ -376,7 +376,7 @@ H5FD_stdio_close(H5FD_t *_file)
/* Clear the error stack */
H5Eclear();
- if (H5FD_stdio_flush(_file)<0)
+ if (H5FD_stdio_flush(_file,1)<0)
H5Epush_ret(func, H5E_IO, H5E_WRITEERROR, "flush failed", -1);
if (fclose(file->fp) < 0)
H5Epush_ret(func, H5E_IO, H5E_CLOSEERROR, "fclose failed", -1);
@@ -797,7 +797,7 @@ H5FD_stdio_write(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr,
*-------------------------------------------------------------------------
*/
static herr_t
-H5FD_stdio_flush(H5FD_t *_file)
+H5FD_stdio_flush(H5FD_t *_file, hbool_t closing)
{
H5FD_stdio_t *file = (H5FD_stdio_t*)_file;
static const char *func="H5FD_stdio_flush"; /* Function Name for error reporting */
@@ -827,8 +827,10 @@ H5FD_stdio_flush(H5FD_t *_file)
/*
* Flush
*/
- if (fflush(file->fp) < 0)
- H5Epush_ret(func, H5E_IO, H5E_WRITEERROR, "fflush failed", -1);
+ if(!closing) {
+ if (fflush(file->fp) < 0)
+ H5Epush_ret(func, H5E_IO, H5E_WRITEERROR, "fflush failed", -1);
+ } /* end if */
} /* end if */
else {
/* Double-check for problems */