diff options
-rw-r--r-- | src/H5F.c | 2 | ||||
-rw-r--r-- | src/H5FDcore.c | 20 | ||||
-rw-r--r-- | src/H5Faccum.c | 14 | ||||
-rw-r--r-- | src/H5Fpkg.h | 2 | ||||
-rw-r--r-- | src/H5Fsuper_cache.c | 12 |
5 files changed, 33 insertions, 17 deletions
@@ -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 */ |