summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJerome Soumagne <jsoumagne@hdfgroup.org>2015-08-31 05:11:18 (GMT)
committerJerome Soumagne <jsoumagne@hdfgroup.org>2016-11-29 23:42:30 (GMT)
commitfa613443479d7933973ca23cf844b439723522e1 (patch)
tree48f3071b76f1e3851a4a74fb47b30732336bff34
parent665b7c3bae8c4e75790c717752f7656bf2477de1 (diff)
downloadhdf5-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.c23
-rw-r--r--src/H5Dint.c113
-rw-r--r--src/H5Doh.c3
-rw-r--r--src/H5Dpkg.h1
-rw-r--r--src/H5R.c3
5 files changed, 106 insertions, 37 deletions
diff --git a/src/H5D.c b/src/H5D.c
index 95d237b..eb0f956 100644
--- a/src/H5D.c
+++ b/src/H5D.c
@@ -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 */
diff --git a/src/H5R.c b/src/H5R.c
index 61b45e1..f324ff4 100644
--- a/src/H5R.c
+++ b/src/H5R.c
@@ -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;