mirror of
https://github.com/HDFGroup/hdf5.git
synced 2024-11-27 02:10:55 +08:00
[svn-r29626] Description:
Revise method of invoking object flush callback. Tested on: MacOSX/64 10.11.4 (amazon) w/serial & parallel (h5committest forthcoming)
This commit is contained in:
parent
2221a9a96e
commit
c7d4951634
18
src/H5Doh.c
18
src/H5Doh.c
@ -55,7 +55,7 @@ static void *H5O__dset_create(H5F_t *f, void *_crt_info, H5G_loc_t *obj_loc,
|
||||
static H5O_loc_t *H5O__dset_get_oloc(hid_t obj_id);
|
||||
static herr_t H5O__dset_bh_info(const H5O_loc_t *loc, hid_t dxpl_id, H5O_t *oh,
|
||||
H5_ih_info_t *bh_info);
|
||||
static herr_t H5O__dset_flush(H5G_loc_t *obj_loc, hid_t dxpl_id);
|
||||
static herr_t H5O__dset_flush(void *_obj_ptr, hid_t dxpl_id);
|
||||
|
||||
|
||||
/*********************/
|
||||
@ -443,33 +443,27 @@ done:
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
static herr_t
|
||||
H5O__dset_flush(H5G_loc_t *obj_loc, hid_t dxpl_id)
|
||||
H5O__dset_flush(void *_obj_ptr, hid_t dxpl_id)
|
||||
{
|
||||
H5D_t *dset = NULL; /* Dataset opened */
|
||||
H5D_t *dset = (H5D_t *)_obj_ptr; /* Pointer to dataset object */
|
||||
H5O_type_t obj_type; /* Type of object at location */
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_STATIC
|
||||
|
||||
HDassert(obj_loc);
|
||||
HDassert(obj_loc->oloc);
|
||||
HDassert(dset);
|
||||
HDassert(&dset->oloc);
|
||||
|
||||
/* Check that the object found is the correct type */
|
||||
if(H5O_obj_type(obj_loc->oloc, &obj_type, dxpl_id) < 0)
|
||||
if(H5O_obj_type(&dset->oloc, &obj_type, dxpl_id) < 0)
|
||||
HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get object type")
|
||||
if(obj_type != H5O_TYPE_DATASET)
|
||||
HGOTO_ERROR(H5E_DATASET, H5E_BADTYPE, FAIL, "not a dataset")
|
||||
|
||||
/* Open the dataset */
|
||||
if(NULL == (dset = H5D_open(obj_loc, H5P_DATASET_ACCESS_DEFAULT, dxpl_id)))
|
||||
HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, FAIL, "unable to open dataset")
|
||||
|
||||
if(H5D__flush_real(dset, dxpl_id) < 0)
|
||||
HDONE_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "unable to flush cached dataset info")
|
||||
|
||||
done:
|
||||
if(dset && H5D_close(dset) < 0)
|
||||
HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "unable to release dataset")
|
||||
FUNC_LEAVE_NOAPI(ret_value)
|
||||
} /* end H5O__dset_flush() */
|
||||
|
||||
|
@ -354,17 +354,30 @@ H5O_copy_header_real(const H5O_loc_t *oloc_src, H5O_loc_t *oloc_dst /*out*/,
|
||||
H5G_loc_t tmp_loc; /* Location of object */
|
||||
H5O_loc_t tmp_oloc; /* Location of object */
|
||||
H5G_name_t tmp_path; /* Object's path */
|
||||
void *obj_ptr = NULL; /* Object pointer */
|
||||
hid_t tmp_id = -1; /* Object ID */
|
||||
|
||||
tmp_loc.oloc = &tmp_oloc;
|
||||
tmp_loc.path = &tmp_path;
|
||||
tmp_oloc.file = oloc_src->file;
|
||||
tmp_oloc.addr = oloc_src->addr;
|
||||
tmp_oloc.holding_file = oloc_src->holding_file;
|
||||
tmp_oloc.holding_file = FALSE;
|
||||
H5G_name_reset(tmp_loc.path);
|
||||
|
||||
/* Flush the object of this class */
|
||||
if(obj_class->flush && obj_class->flush(&tmp_loc, dxpl_id) < 0)
|
||||
/* Get a temporary ID */
|
||||
if((tmp_id = obj_class->open(&tmp_loc, H5P_DEFAULT, dxpl_id, FALSE)) < 0)
|
||||
HGOTO_ERROR(H5E_OHDR, H5E_CANTFLUSH, FAIL, "unable to open object")
|
||||
|
||||
/* Get object pointer */
|
||||
obj_ptr = H5I_object(tmp_id);
|
||||
|
||||
/* Flush the object */
|
||||
if(obj_class->flush && obj_class->flush(obj_ptr, dxpl_id) < 0)
|
||||
HGOTO_ERROR(H5E_OHDR, H5E_CANTFLUSH, FAIL, "unable to flush object")
|
||||
|
||||
/* Release the temporary ID */
|
||||
if(tmp_id != -1 && H5I_dec_app_ref(tmp_id))
|
||||
HGOTO_ERROR(H5E_OHDR, H5E_CANTRELEASE, FAIL, "unable to close temporary ID")
|
||||
} /* end if */
|
||||
|
||||
/* Get source object header */
|
||||
|
@ -325,7 +325,7 @@ typedef struct H5O_obj_class_t {
|
||||
void *(*create)(H5F_t *, void *, H5G_loc_t *, hid_t ); /*create an object of this class */
|
||||
H5O_loc_t *(*get_oloc)(hid_t ); /*get the object header location for an object */
|
||||
herr_t (*bh_info)(const H5O_loc_t *loc, hid_t dxpl_id, H5O_t *oh, H5_ih_info_t *bh_info); /*get the index & heap info for an object */
|
||||
herr_t (*flush)(H5G_loc_t *loc, hid_t dxpl_id); /*flush an opened object of this class */
|
||||
herr_t (*flush)(void *obj_ptr, hid_t dxpl_id); /*flush an opened object of this class */
|
||||
} H5O_obj_class_t;
|
||||
|
||||
/* Node in skip list to map addresses from one file to another during object header copy */
|
||||
@ -606,7 +606,6 @@ H5_DLL herr_t H5O_attr_link(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh, void *_mesg
|
||||
H5_DLL herr_t H5O_attr_count_real(H5F_t *f, hid_t dxpl_id, H5O_t *oh,
|
||||
hsize_t *nattrs);
|
||||
|
||||
|
||||
/* These functions operate on object locations */
|
||||
H5_DLL H5O_loc_t *H5O_get_loc(hid_t id);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user