summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/H5F.c2
-rw-r--r--src/H5FDcore.c20
-rw-r--r--src/H5Faccum.c14
-rw-r--r--src/H5Fpkg.h2
-rw-r--r--src/H5Fsuper_cache.c12
5 files changed, 33 insertions, 17 deletions
diff --git a/src/H5F.c b/src/H5F.c
index 6ae0759..e74b047 100644
--- a/src/H5F.c
+++ b/src/H5F.c
@@ -1065,7 +1065,7 @@ H5F_dest(H5F_t *f, hid_t dxpl_id)
} /* end if */
/* Destroy other components of the file */
- if(H5F_accum_reset(f) < 0)
+ if(H5F_accum_reset(f, dxpl_id) < 0)
/* Push error, but keep going*/
HDONE_ERROR(H5E_FILE, H5E_CANTRELEASE, FAIL, "problems closing file")
if(H5FO_dest(f) < 0)
diff --git a/src/H5FDcore.c b/src/H5FDcore.c
index 1e30ace..a08abdd 100644
--- a/src/H5FDcore.c
+++ b/src/H5FDcore.c
@@ -484,33 +484,33 @@ done:
* Programmer: Robb Matzke
* Thursday, July 29, 1999
*
- * Modifications:
- * Robb Matzke, 1999-10-19
- * The contents of memory are written to the backing store if
- * one is open.
*-------------------------------------------------------------------------
*/
static herr_t
H5FD_core_close(H5FD_t *_file)
{
H5FD_core_t *file = (H5FD_core_t*)_file;
- herr_t ret_value=SUCCEED; /* Return value */
+ herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_NOAPI(H5FD_core_close, FAIL)
+ /* Flush any changed buffers */
+ if(H5FD_core_flush(_file, (hid_t)-1, TRUE) < 0)
+ HGOTO_ERROR(H5E_FILE, H5E_CANTFLUSH, FAIL, "unable to flush file")
+
/* Release resources */
- if (file->fd>=0)
+ if(file->fd >= 0)
HDclose(file->fd);
- if (file->name)
+ if(file->name)
H5MM_xfree(file->name);
- if (file->mem)
+ if(file->mem)
H5MM_xfree(file->mem);
HDmemset(file, 0, sizeof(H5FD_core_t));
H5MM_xfree(file);
done:
FUNC_LEAVE_NOAPI(ret_value)
-}
+} /* end H5FD_core_close() */
/*-------------------------------------------------------------------------
@@ -973,7 +973,7 @@ H5FD_core_truncate(H5FD_t *_file, hid_t UNUSED dxpl_id, hbool_t UNUSED closing)
new_eof += file->increment;
/* Extend the file to make sure it's large enough */
- if(!H5F_addr_eq((haddr_t)new_eof, file->eof)) {
+ if(!H5F_addr_eq(file->eof, (haddr_t)new_eof)) {
unsigned char *x; /* Pointer to new buffer for file data */
/* (Re)allocate memory for the file buffer */
diff --git a/src/H5Faccum.c b/src/H5Faccum.c
index d4e142b..d8b9820 100644
--- a/src/H5Faccum.c
+++ b/src/H5Faccum.c
@@ -722,13 +722,19 @@ done:
*-------------------------------------------------------------------------
*/
herr_t
-H5F_accum_reset(H5F_t *f)
+H5F_accum_reset(H5F_t *f, hid_t dxpl_id)
{
- FUNC_ENTER_NOAPI_NOFUNC(H5F_accum_reset)
+ herr_t ret_value = SUCCEED; /* Return value */
+
+ FUNC_ENTER_NOAPI(H5F_accum_reset, FAIL)
HDassert(f);
HDassert(f->shared);
+ /* Flush any dirty data in accumulator */
+ if(H5F_accum_flush(f, dxpl_id) < 0)
+ HGOTO_ERROR(H5E_FILE, H5E_CANTFLUSH, FAIL, "can't flush metadata accumulator")
+
/* Check if we need to reset the metadata accumulator information */
if(f->shared->feature_flags & H5FD_FEAT_ACCUMULATE_METADATA) {
/* Sanity check */
@@ -744,7 +750,7 @@ H5F_accum_reset(H5F_t *f)
f->shared->accum.dirty = FALSE;
} /* end if */
- FUNC_LEAVE_NOAPI(SUCCEED)
+done:
+ FUNC_LEAVE_NOAPI(ret_value)
} /* end H5F_accum_reset() */
-
diff --git a/src/H5Fpkg.h b/src/H5Fpkg.h
index 37ad094..88ec8d9 100644
--- a/src/H5Fpkg.h
+++ b/src/H5Fpkg.h
@@ -314,7 +314,7 @@ H5_DLL htri_t H5F_accum_write(const H5F_t *f, hid_t dxpl_id, H5FD_mem_t type,
H5_DLL herr_t H5F_accum_free(H5F_t *f, hid_t dxpl_id, H5FD_mem_t type,
haddr_t addr, hsize_t size);
H5_DLL herr_t H5F_accum_flush(H5F_t *f, hid_t dxpl_id);
-H5_DLL herr_t H5F_accum_reset(H5F_t *f);
+H5_DLL herr_t H5F_accum_reset(H5F_t *f, hid_t dxpl_id);
/* Shared file list related routines */
H5_DLL herr_t H5F_sfile_add(H5F_file_t *shared);
diff --git a/src/H5Fsuper_cache.c b/src/H5Fsuper_cache.c
index 7df8f31..240ac9f 100644
--- a/src/H5Fsuper_cache.c
+++ b/src/H5Fsuper_cache.c
@@ -727,7 +727,9 @@ H5F_sblock_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5F_sup
H5_ASSIGN_OVERFLOW(driver_size, H5FD_sb_size(f->shared->lf), hsize_t, size_t);
if(driver_size > 0) {
H5O_drvinfo_t drvinfo; /* Driver info */
+ H5O_loc_t ext_loc; /* "Object location" for superblock extension */
uint8_t dbuf[H5F_MAX_DRVINFOBLOCK_SIZE]; /* Driver info block encoding buffer */
+ htri_t status; /* Indicate whether the message exists or not */
/* Sanity check */
HDassert(driver_size <= H5F_MAX_DRVINFOBLOCK_SIZE);
@@ -735,12 +737,20 @@ H5F_sblock_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5F_sup
/* Encode driver-specific data */
if(H5FD_sb_encode(f->shared->lf, drvinfo.name, dbuf) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "unable to encode driver information")
+
+ /* Open the superblock extension's object header */
+ if(H5F_super_ext_open(f, sblock->ext_addr, &ext_loc) < 0)
+ HGOTO_ERROR(H5E_FILE, H5E_CANTOPENOBJ, FAIL, "unable to open file's superblock extension")
/* Write driver info information to the superblock extension */
drvinfo.len = driver_size;
drvinfo.buf = dbuf;
- if(H5F_super_ext_write_msg(f, dxpl_id, &drvinfo, H5O_DRVINFO_ID, FALSE) < 0)
+ if(H5O_msg_write(&ext_loc, H5O_DRVINFO_ID, H5O_MSG_FLAG_DONTSHARE, H5O_UPDATE_TIME, &drvinfo, dxpl_id) < 0)
HGOTO_ERROR(H5E_FILE, H5E_WRITEERROR, FAIL, "unable to update driver info header message")
+
+ /* Close the superblock extension object header */
+ if(H5F_super_ext_close(f, &ext_loc) < 0)
+ HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEOBJ, FAIL, "unable to close file's superblock extension")
} /* end if */
} /* end if */
} /* end if */