diff options
author | Jerome Soumagne <jsoumagne@hdfgroup.org> | 2015-08-31 05:11:18 (GMT) |
---|---|---|
committer | Jerome Soumagne <jsoumagne@hdfgroup.org> | 2016-11-29 23:42:30 (GMT) |
commit | fa613443479d7933973ca23cf844b439723522e1 (patch) | |
tree | 48f3071b76f1e3851a4a74fb47b30732336bff34 | |
parent | 665b7c3bae8c4e75790c717752f7656bf2477de1 (diff) | |
download | hdf5-fa613443479d7933973ca23cf844b439723522e1.zip hdf5-fa613443479d7933973ca23cf844b439723522e1.tar.gz hdf5-fa613443479d7933973ca23cf844b439723522e1.tar.bz2 |
Save dset_id within H5D_t shared struct
Add H5D_open_index/H5D_close_index to open index when needed
-rw-r--r-- | src/H5D.c | 23 | ||||
-rw-r--r-- | src/H5Dint.c | 113 | ||||
-rw-r--r-- | src/H5Doh.c | 3 | ||||
-rw-r--r-- | src/H5Dpkg.h | 1 | ||||
-rw-r--r-- | src/H5R.c | 3 |
5 files changed, 106 insertions, 37 deletions
@@ -150,6 +150,9 @@ H5Dcreate2(hid_t loc_id, const char *name, hid_t type_id, hid_t space_id, if((ret_value = H5I_register(H5I_DATASET, dset, TRUE)) < 0) HGOTO_ERROR(H5E_DATASET, H5E_CANTREGISTER, FAIL, "unable to register dataset") + /* Keep ID of the dataset */ + dset->shared->dset_id = ret_value; + /* Create index if told to */ if(H5X_can_create(ret_value, dcpl_id) < 0) HGOTO_ERROR(H5E_DATASET, H5E_CANTCREATE, FAIL, "Index can't be created on this dataset") @@ -238,6 +241,9 @@ H5Dcreate_anon(hid_t loc_id, hid_t type_id, hid_t space_id, hid_t dcpl_id, if((ret_value = H5I_register(H5I_DATASET, dset, TRUE)) < 0) HGOTO_ERROR(H5E_DATASET, H5E_CANTREGISTER, FAIL, "unable to register dataset") + /* Keep ID of the dataset */ + dset->shared->dset_id = ret_value; + done: /* Release the dataset's object header, if it was created */ if(dset) { @@ -310,21 +316,8 @@ H5Dopen2(hid_t loc_id, const char *name, hid_t dapl_id) if((ret_value = H5I_register(H5I_DATASET, dset, TRUE)) < 0) HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "can't register dataset atom") - /* Open the index as well if present */ - if (dset->shared->idx_class) { - H5X_class_t *idx_class = dset->shared->idx_class; - void *idx_handle = NULL; - hid_t xapl_id = H5P_INDEX_ACCESS_DEFAULT; - size_t metadata_size = dset->shared->idx_info.metadata_size; - void *metadata = dset->shared->idx_info.metadata; - - if (NULL == idx_class->open) - HGOTO_ERROR(H5E_INDEX, H5E_BADVALUE, FAIL, "plugin open callback not defined"); - if (NULL == (idx_handle = idx_class->open(ret_value, xapl_id, - metadata_size, metadata))) - HGOTO_ERROR(H5E_INDEX, H5E_CANTOPENOBJ, FAIL, "cannot open index"); - dset->shared->idx_handle = idx_handle; - } + /* Keep ID of the dataset */ + dset->shared->dset_id = ret_value; done: if(ret_value < 0) diff --git a/src/H5Dint.c b/src/H5Dint.c index 41f423b..48b3894 100644 --- a/src/H5Dint.c +++ b/src/H5Dint.c @@ -67,6 +67,9 @@ static herr_t H5D__open_oid(H5D_t *dataset, hid_t dapl_id, hid_t dxpl_id); static herr_t H5D__init_storage(const H5D_t *dataset, hbool_t full_overwrite, hsize_t old_dim[], hid_t dxpl_id); +/* TODO change H5D_open_index to H5D__open_index */ +static herr_t H5D_open_index(H5D_t *dset, hid_t xapl_id); +static herr_t H5D_close_index(H5D_t *dset); static H5S_t *H5D__query(H5D_t *dset, const H5S_t *file_space, H5Q_t *query, hid_t xapl_id, hid_t xxpl_id); static H5S_t *H5D__query_singleton(H5D_t *dset, const H5S_t *file_space, H5Q_t *query, @@ -1586,14 +1589,8 @@ H5D_close(H5D_t *dataset) dataset->shared->fo_count--; if(dataset->shared->fo_count == 0) { /* Close index object if index is closed */ - if (dataset->shared->idx_handle) { - H5X_class_t *idx_class = dataset->shared->idx_class; - - if (NULL == (idx_class->close)) - HGOTO_ERROR(H5E_INDEX, H5E_BADVALUE, FAIL, "plugin close callback not defined"); - if (FAIL == idx_class->close(dataset->shared->idx_handle)) - HGOTO_ERROR(H5E_INDEX, H5E_CANTCLOSEOBJ, FAIL, "cannot close index"); - } + if (dataset->shared->idx_handle && (FAIL == H5D_close_index(dataset))) + HGOTO_ERROR(H5E_DATASET, H5E_CANTCLOSEOBJ, FAIL, "cannot close index") /* Flush the dataset's information. Continue to close even if it fails. */ if(H5D__flush_real(dataset, H5AC_dxpl_id) < 0) @@ -3174,6 +3171,82 @@ H5D_get_index(H5D_t *dset, unsigned max_count, H5X_class_t **idx_class, } /* end H5D_get_index() */ /*------------------------------------------------------------------------- + * Function: H5D_open_index + * + * Purpose: Open index. + * + * Return: Success: Non-negative + * Failure: Negative + * + *------------------------------------------------------------------------- + */ +static herr_t +H5D_open_index(H5D_t *dset, hid_t xapl_id) +{ + hid_t dset_id; + H5X_class_t *idx_class; + void *idx_handle = NULL; + size_t metadata_size; + void *metadata; + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI_NOINIT + + HDassert(dset); + + dset_id = dset->shared->dset_id; + idx_class = dset->shared->idx_class; + metadata_size = dset->shared->idx_info.metadata_size; + metadata = dset->shared->idx_info.metadata; + + if (NULL == H5I_object_verify(dset_id, H5I_DATASET)) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset"); + if (NULL == metadata) + HGOTO_ERROR(H5E_INDEX, H5E_BADVALUE, FAIL, "no index metadata was found"); + if (NULL == idx_class->open) + HGOTO_ERROR(H5E_INDEX, H5E_BADVALUE, FAIL, "plugin open callback not defined"); + if (NULL == (idx_handle = idx_class->open(dset_id, xapl_id, metadata_size, metadata))) + HGOTO_ERROR(H5E_INDEX, H5E_CANTOPENOBJ, FAIL, "cannot open index"); + + dset->shared->idx_handle = idx_handle; + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5D_open_index() */ + +/*------------------------------------------------------------------------- + * Function: H5D_close_index + * + * Purpose: Close index. + * + * Return: Success: Non-negative + * Failure: Negative + * + *------------------------------------------------------------------------- + */ +static herr_t +H5D_close_index(H5D_t *dset) +{ + H5X_class_t *idx_class; + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI_NOINIT + + HDassert(dset); + + idx_class = dset->shared->idx_class; + if (NULL == (idx_class->close)) + HGOTO_ERROR(H5E_INDEX, H5E_BADVALUE, FAIL, "plugin close callback not defined"); + if (FAIL == idx_class->close(dset->shared->idx_handle)) + HGOTO_ERROR(H5E_INDEX, H5E_CANTCLOSEOBJ, FAIL, "cannot close index"); + + dset->shared->idx_handle = NULL; + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5D_close_index() */ + +/*------------------------------------------------------------------------- * Function: H5D_remove_index * * Purpose: Remove index. @@ -3193,17 +3266,8 @@ H5D_remove_index(H5D_t *dset, unsigned H5_ATTR_UNUSED plugin_id) HDassert(dset); /* First close index if opened */ - if (dset->shared->idx_handle) { - H5X_class_t *idx_class = dset->shared->idx_class; - - if (NULL == (idx_class->close)) - HGOTO_ERROR(H5E_INDEX, H5E_BADVALUE, FAIL, "plugin close callback not defined"); - if (FAIL == idx_class->close(dset->shared->idx_handle)) - HGOTO_ERROR(H5E_INDEX, H5E_CANTCLOSEOBJ, FAIL, "cannot close index"); - - dset->shared->idx_class = NULL; - dset->shared->idx_handle = NULL; - } + if (dset->shared->idx_handle && (FAIL == H5D_close_index(dset))) + HGOTO_ERROR(H5E_INDEX, H5E_CANTCLOSEOBJ, FAIL, "cannot close index"); /* Remove idx_handle from dataset */ if (H5O_msg_remove(&dset->oloc, H5O_IDXINFO_ID, H5O_ALL, TRUE, H5AC_dxpl_id) < 0) @@ -3232,6 +3296,7 @@ herr_t H5D_get_index_size(H5D_t *dset, hsize_t *idx_size) { H5X_class_t *idx_class = NULL; hsize_t actual_size = 0; + hid_t xapl_id = H5P_INDEX_ACCESS_DEFAULT; /* TODO for now */ herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_NOAPI_NOINIT @@ -3239,12 +3304,13 @@ herr_t H5D_get_index_size(H5D_t *dset, hsize_t *idx_size) HDassert(dset); HDassert(idx_size); - if (!dset->shared->idx_handle) - HGOTO_ERROR(H5E_INDEX, H5E_BADVALUE, FAIL, "no index attached to dataset"); - idx_class = dset->shared->idx_class; + if (!idx_class) + HGOTO_ERROR(H5E_INDEX, H5E_BADVALUE, FAIL, "index class not defined"); if (NULL == (idx_class->get_size)) HGOTO_ERROR(H5E_INDEX, H5E_BADVALUE, FAIL, "plugin get size callback not defined"); + if (!dset->shared->idx_handle && (FAIL == H5D_open_index(dset, xapl_id))) + HGOTO_ERROR(H5E_INDEX, H5E_CANTOPENOBJ, FAIL, "cannot open index"); if (FAIL == idx_class->get_size(dset->shared->idx_handle, &actual_size)) HGOTO_ERROR(H5E_INDEX, H5E_CANTGET, FAIL, "cannot get index size"); @@ -3356,6 +3422,9 @@ H5D__query_singleton(H5D_t *dset, const H5S_t *file_space, H5Q_t *query, HGOTO_ERROR(H5E_INDEX, H5E_BADVALUE, NULL, "index class not defined"); if (NULL == idx_class->query) HGOTO_ERROR(H5E_INDEX, H5E_BADVALUE, NULL, "plugin query callback not defined"); + /* Open index if not opened yet */ + if (!dset->shared->idx_handle && (FAIL == H5D_open_index(dset, xapl_id))) + HGOTO_ERROR(H5E_INDEX, H5E_CANTOPENOBJ, NULL, "cannot open index"); /* Call plugin query */ if (FAIL == (space_id = idx_class->query(dset->shared->idx_handle, file_space_id, query->query_id, xxpl_id))) HGOTO_ERROR(H5E_INDEX, H5E_CANTSELECT, NULL, "cannot query index"); diff --git a/src/H5Doh.c b/src/H5Doh.c index db65479..9e6b509 100644 --- a/src/H5Doh.c +++ b/src/H5Doh.c @@ -252,6 +252,9 @@ H5O__dset_open(const H5G_loc_t *obj_loc, hid_t lapl_id, hid_t dxpl_id, hbool_t a if((ret_value = H5I_register(H5I_DATASET, dset, app_ref)) < 0) HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register dataset") + /* Keep ID of the dataset */ + dset->shared->dset_id = ret_value; + done: if(ret_value < 0) if(dset && H5D_close(dset) < 0) diff --git a/src/H5Dpkg.h b/src/H5Dpkg.h index 3bffb4b..a2ea840 100644 --- a/src/H5Dpkg.h +++ b/src/H5Dpkg.h @@ -409,6 +409,7 @@ typedef struct H5D_rdcdc_t { * there will be two IDs and two H5D_t structs, both sharing one H5D_shared_t. */ typedef struct H5D_shared_t { + hid_t dset_id; /* ID of this dataset */ size_t fo_count; /* Reference count */ hbool_t closing; /* Flag to indicate dataset is closing */ hid_t type_id; /* ID for dataset's datatype */ @@ -556,6 +556,9 @@ H5R_dereference(H5F_t *file, hid_t oapl_id, hid_t dxpl_id, H5R_type_t ref_type, H5D_close(dset); HGOTO_ERROR(H5E_DATASET, H5E_CANTREGISTER, FAIL, "can't register dataset") } /* end if */ + + /* TODO Keep ID of the dataset */ +// dset->shared->dset_id = ret_value; } /* end case */ break; |