mirror of
https://github.com/HDFGroup/hdf5.git
synced 2025-04-12 17:31:09 +08:00
[svn-r30107] Moved dataset flush and evict code to H5D_close from H5Dclose.
This commit is contained in:
parent
b236c21601
commit
35f8a064c5
44
src/H5D.c
44
src/H5D.c
@ -308,45 +308,31 @@ done:
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: H5Dclose
|
||||
* Function: H5Dclose
|
||||
*
|
||||
* Purpose: Closes access to a dataset (DATASET_ID) and releases
|
||||
* resources used by it. It is illegal to subsequently use that
|
||||
* same dataset ID in calls to other dataset functions.
|
||||
* Purpose: Closes access to a dataset (DATASET_ID) and releases
|
||||
* resources used by it. It is illegal to subsequently use that
|
||||
* same dataset ID in calls to other dataset functions.
|
||||
*
|
||||
* Return: Non-negative on success/Negative on failure
|
||||
* Return: Non-negative on success/Negative on failure
|
||||
*
|
||||
* Programmer: Robb Matzke
|
||||
* Thursday, December 4, 1997
|
||||
* Programmer: Robb Matzke
|
||||
* Thursday, December 4, 1997
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
herr_t
|
||||
H5Dclose(hid_t dset_id)
|
||||
{
|
||||
H5D_t *dset = NULL; /* Dataset */
|
||||
H5F_t *file = NULL; /* File */
|
||||
hbool_t evict = FALSE; /* Evict metadata on close? */
|
||||
haddr_t tag = HADDR_UNDEF; /* Metadata tag for evictions */
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE1("e", "i", dset_id);
|
||||
|
||||
/* Check args */
|
||||
if(NULL == (dset = (H5D_t *)H5I_object_verify(dset_id, H5I_DATASET)))
|
||||
if(NULL == H5I_object_verify(dset_id, H5I_DATASET))
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset")
|
||||
|
||||
/* Check if this is the last object reference and we'll be evicting
|
||||
* on close. We need to cache this info since it will be gone after the
|
||||
* decrement call frees the struct.
|
||||
*/
|
||||
file = dset->oloc.file;
|
||||
if(1 == dset->shared->fo_count && H5F_EVICT_ON_CLOSE(file)) {
|
||||
evict = TRUE;
|
||||
tag = dset->oloc.addr;
|
||||
} /* end if */
|
||||
|
||||
/*
|
||||
* Decrement the counter on the dataset. It will be freed if the count
|
||||
* reaches zero.
|
||||
@ -354,20 +340,6 @@ H5Dclose(hid_t dset_id)
|
||||
if(H5I_dec_app_ref_always_close(dset_id) < 0)
|
||||
HGOTO_ERROR(H5E_DATASET, H5E_CANTDEC, FAIL, "can't decrement count on dataset ID")
|
||||
|
||||
/* Clean up metadata in the metadata cache if evicting on close */
|
||||
if(evict && H5F_SHARED(file)) {
|
||||
// printf("DUMPING CACHE - BEFORE FLUSH\n");
|
||||
// H5AC_dump_cache(file);
|
||||
if(H5AC_flush_tagged_metadata(file, tag, H5AC_ind_read_dxpl_id) < 0)
|
||||
HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to flush tagged metadata")
|
||||
// printf("DUMPING CACHE - BETWEEN FLUSH AND EVICT\n");
|
||||
// H5AC_dump_cache(file);
|
||||
if(H5AC_evict_tagged_metadata(file, tag, FALSE, H5AC_ind_read_dxpl_id) < 0)
|
||||
HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to evict tagged metadata")
|
||||
// printf("DUMPING CACHE - AFTER EVICT\n");
|
||||
// H5AC_dump_cache(file);
|
||||
} /* end if */
|
||||
|
||||
done:
|
||||
FUNC_LEAVE_API(ret_value)
|
||||
} /* end H5Dclose() */
|
||||
|
44
src/H5Dint.c
44
src/H5Dint.c
@ -1775,9 +1775,9 @@ done:
|
||||
herr_t
|
||||
H5D_close(H5D_t *dataset)
|
||||
{
|
||||
hbool_t free_failed = FALSE;
|
||||
hbool_t corked; /* Whether the dataset is corked or not */
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
hbool_t free_failed = FALSE; /* Set if freeing sub-components failed */
|
||||
hbool_t corked; /* Whether the dataset is corked or not */
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_NOAPI(FAIL)
|
||||
|
||||
@ -1792,6 +1792,7 @@ H5D_close(H5D_t *dataset)
|
||||
|
||||
dataset->shared->fo_count--;
|
||||
if(dataset->shared->fo_count == 0) {
|
||||
|
||||
/* Flush the dataset's information. Continue to close even if it fails. */
|
||||
if(H5D__flush_real(dataset, H5AC_ind_read_dxpl_id) < 0)
|
||||
HDONE_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "unable to flush cached dataset info")
|
||||
@ -1886,12 +1887,12 @@ H5D_close(H5D_t *dataset)
|
||||
(H5O_msg_reset(H5O_FILL_ID, &dataset->shared->dcpl_cache.fill) < 0) ||
|
||||
(H5O_msg_reset(H5O_EFL_ID, &dataset->shared->dcpl_cache.efl) < 0);
|
||||
|
||||
/* Uncork cache entries with object address tag */
|
||||
if(H5AC_cork(dataset->oloc.file, dataset->oloc.addr, H5AC__GET_CORKED, &corked) < 0)
|
||||
HDONE_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "unable to retrieve an object's cork status")
|
||||
if(corked)
|
||||
if(H5AC_cork(dataset->oloc.file, dataset->oloc.addr, H5AC__UNCORK, NULL) < 0)
|
||||
HDONE_ERROR(H5E_DATASET, H5E_CANTUNCORK, FAIL, "unable to uncork an object")
|
||||
/* Uncork cache entries with object address tag */
|
||||
if(H5AC_cork(dataset->oloc.file, dataset->oloc.addr, H5AC__GET_CORKED, &corked) < 0)
|
||||
HDONE_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "unable to retrieve an object's cork status")
|
||||
if(corked)
|
||||
if(H5AC_cork(dataset->oloc.file, dataset->oloc.addr, H5AC__UNCORK, NULL) < 0)
|
||||
HDONE_ERROR(H5E_DATASET, H5E_CANTUNCORK, FAIL, "unable to uncork an object")
|
||||
|
||||
/*
|
||||
* Release datatype, dataspace and creation property list -- there isn't
|
||||
@ -1912,6 +1913,21 @@ H5D_close(H5D_t *dataset)
|
||||
if(H5O_close(&(dataset->oloc)) < 0)
|
||||
HGOTO_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "unable to release object header")
|
||||
|
||||
/* Evict dataset metadata if evicting on close */
|
||||
if(H5F_SHARED(dataset->oloc.file) && H5F_EVICT_ON_CLOSE(dataset->oloc.file)) {
|
||||
// printf("tag: 0x%3llx\n", dataset->oloc.addr);
|
||||
// printf("DUMPING CACHE - BEFORE FLUSH\n");
|
||||
// H5AC_dump_cache(dataset->oloc.file);
|
||||
if(H5AC_flush_tagged_metadata(dataset->oloc.file, dataset->oloc.addr, H5AC_ind_read_dxpl_id) < 0)
|
||||
HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to flush tagged metadata")
|
||||
// printf("DUMPING CACHE - BETWEEN FLUSH AND EVICT\n");
|
||||
// H5AC_dump_cache(dataset->oloc.file);
|
||||
if(H5AC_evict_tagged_metadata(dataset->oloc.file, dataset->oloc.addr, FALSE, H5AC_ind_read_dxpl_id) < 0)
|
||||
HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to evict tagged metadata")
|
||||
// printf("DUMPING CACHE - AFTER EVICT\n");
|
||||
// H5AC_dump_cache(dataset->oloc.file);
|
||||
} /* end if */
|
||||
|
||||
/*
|
||||
* Free memory. Before freeing the memory set the file pointer to NULL.
|
||||
* We always check for a null file pointer in other H5D functions to be
|
||||
@ -1919,8 +1935,8 @@ H5D_close(H5D_t *dataset)
|
||||
* above).
|
||||
*/
|
||||
dataset->oloc.file = NULL;
|
||||
|
||||
dataset->shared = H5FL_FREE(H5D_shared_t, dataset->shared);
|
||||
|
||||
} /* end if */
|
||||
else {
|
||||
/* Decrement the ref. count for this object in the top file */
|
||||
@ -1938,16 +1954,16 @@ H5D_close(H5D_t *dataset)
|
||||
HGOTO_ERROR(H5E_DATASET, H5E_CANTRELEASE, FAIL, "problem attempting to free location")
|
||||
} /* end else */
|
||||
|
||||
/* Release the dataset's path info */
|
||||
if(H5G_name_free(&(dataset->path)) < 0)
|
||||
free_failed = TRUE;
|
||||
/* Release the dataset's path info */
|
||||
if(H5G_name_free(&(dataset->path)) < 0)
|
||||
free_failed = TRUE;
|
||||
|
||||
/* Free the dataset's memory structure */
|
||||
dataset = H5FL_FREE(H5D_t, dataset);
|
||||
|
||||
/* Check if anything failed in the middle... */
|
||||
if(free_failed)
|
||||
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "couldn't free a component of the dataset, but the dataset was freed anyway.")
|
||||
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "couldn't free a component of the dataset, but the dataset was freed anyway.")
|
||||
|
||||
done:
|
||||
FUNC_LEAVE_NOAPI(ret_value)
|
||||
|
Loading…
x
Reference in New Issue
Block a user