From c26d6a84e3c8531b67ae0ef92a0d70801501f4b0 Mon Sep 17 00:00:00 2001 From: Achim Gsell Date: Thu, 28 Jul 2016 17:24:34 +0200 Subject: [PATCH] adapted to new/changed function: h5priv_open_group(): open existing group h5priv_create_group(): create or open existing group h5priv_open_group_with_intermediates(): open existing group h5priv_create_group_with_intermediates(): create or open existing group --- src/h5core/h5_model.c | 16 +++- src/h5core/h5t_tags.c | 17 ++--- src/h5core/private/h5_hdf5.c | 35 --------- src/h5core/private/h5_hdf5.h | 109 +++++++++++++++++++++++++--- src/h5core/private/h5t_model_tetm.c | 26 +++---- src/h5core/private/h5t_model_trim.c | 25 +++---- 6 files changed, 140 insertions(+), 88 deletions(-) diff --git a/src/h5core/h5_model.c b/src/h5core/h5_model.c index a58de6d..648d845 100644 --- a/src/h5core/h5_model.c +++ b/src/h5core/h5_model.c @@ -50,10 +50,18 @@ h5_set_step ( "Open step #%lld for file %lld", (long long)f->step_idx, (long long)(size_t) f); - - TRY (f->step_gid = h5priv_open_group (is_writable(f), - f->file, - f->step_name)); + + h5_err_t exists; + TRY (exists = hdf5_link_exists (f->file, f->step_name)); + if (exists) { + TRY (f->step_gid = h5priv_open_group ( + f->file, + f->step_name)); + } else if (is_writable (f)) { + TRY (f->step_gid = h5priv_create_group ( + f->file, + f->step_name)); + } H5_RETURN (H5_SUCCESS); } diff --git a/src/h5core/h5t_tags.c b/src/h5core/h5t_tags.c index 1e66f3f..301572c 100644 --- a/src/h5core/h5t_tags.c +++ b/src/h5core/h5t_tags.c @@ -86,7 +86,7 @@ h5t_get_num_mtagsets ( if (!exists) H5_LEAVE (0); hid_t loc_id; - TRY (loc_id = h5priv_open_group (0, m->mesh_gid, "Tags")); + TRY (loc_id = h5priv_open_group (m->mesh_gid, "Tags")); TRY (num_mtagsets = hdf5_get_num_groups (loc_id)); TRY (hdf5_close_group (loc_id)); @@ -402,8 +402,9 @@ read_tagset ( hid_t loc_id = 0; // open HDF5 group - - TRY (loc_id = h5priv_open_group (0, tagset->parent_gid, "Tags", tagset->name)); + TRY (loc_id = h5priv_open_group_with_intermediates ( + tagset->parent_gid, + "Tags", tagset->name, NULL)); // read datasets: @@ -614,11 +615,9 @@ write_tagset ( tagset->num_values = entity->idx = val_idx; // write data - TRY (group_id = h5priv_open_group ( - 1, + TRY (group_id = h5priv_create_group_with_intermediates ( tagset->parent_gid, - "Tags", - tagset->name)); + "Tags", tagset->name, NULL)); h5_dsinfo_t dsinfo; memset (&dsinfo, 0, sizeof(dsinfo)); dsinfo.rank = 1; @@ -664,9 +663,9 @@ write_tagset ( open_space_all, open_space_all, values)); h5_int64_t scope = tagset->scope.min_level; - TRY (h5priv_write_attrib (group_id, "__scope_min__", H5_INT64_T, &scope, 1, 1)); + TRY (h5priv_write_attrib (group_id, "__scope_min__", H5_INT64_T, &scope, 1)); scope = tagset->scope.max_level; - TRY (h5priv_write_attrib (group_id, "__scope_max__", H5_INT64_T, &scope, 1, 1)); + TRY (h5priv_write_attrib (group_id, "__scope_max__", H5_INT64_T, &scope, 1)); TRY (hdf5_close_group (group_id)); TRY (h5_free (elems)); diff --git a/src/h5core/private/h5_hdf5.c b/src/h5core/private/h5_hdf5.c index d6863a8..942cd7f 100644 --- a/src/h5core/private/h5_hdf5.c +++ b/src/h5core/private/h5_hdf5.c @@ -52,41 +52,6 @@ h5priv_link_exists_ ( H5_RETURN (1); } -h5_err_t -h5priv_open_group_ ( - int create_intermediate, - const hid_t loc_id, - const char const* path[], - size_t size - ) { - H5_PRIV_FUNC_ENTER (h5_err_t, - "create_intermediate=%d, loc_id=%lld, (%s), path=%s, ...", - create_intermediate, (long long int)loc_id, hdf5_get_objname (loc_id), - path[0]); - hid_t hid = loc_id; - hid_t hid2 = 0; - h5_err_t exists; - for (size_t i=0; i < size; i++) { - TRY (exists = hdf5_link_exists (hid, path[i])); - if (exists) { - TRY (hid2 = hdf5_open_group (hid, path[i])); - } else if (create_intermediate) { - TRY (hid2 = hdf5_create_group (hid, path[i])); - } else { - H5_RETURN_ERROR ( - H5_ERR_HDF5, - "No such group '%s/%s'.", - hdf5_get_objname (hid), - path[i]); - - } - if (hid != loc_id) { - TRY (hdf5_close_group (hid)); - } - hid = hid2; - } - H5_RETURN (hid); -} typedef struct op_data { int queried_idx; diff --git a/src/h5core/private/h5_hdf5.h b/src/h5core/private/h5_hdf5.h index f25fc66..448846d 100644 --- a/src/h5core/private/h5_hdf5.h +++ b/src/h5core/private/h5_hdf5.h @@ -160,15 +160,6 @@ hdf5_create_group ( H5_RETURN (group_id); } -h5_err_t -h5priv_open_group_ (int, hid_t, const char const*[], size_t); - -#define h5priv_open_group(create_intermediate, loc_id, ...) \ - (h5priv_open_group_ (create_intermediate, \ - loc_id, \ - (const char const*[]) {__VA_ARGS__}, \ - PP_NARG(__VA_ARGS__))) - h5_err_t h5priv_link_exists_ ( const hid_t loc_id, @@ -201,6 +192,106 @@ hdf5_close_group ( H5_RETURN (H5_SUCCESS); } +static inline hid_t +h5priv_create_group ( + const hid_t loc_id, + const char const* group_name + ) { + H5_PRIV_FUNC_ENTER (hid_t, + "loc_id=%lld, (%s), group_name=%s", + (long long int)loc_id, hdf5_get_objname (loc_id), + group_name); + h5_err_t exists; + TRY (exists = hdf5_link_exists (loc_id, group_name)); + if (exists) { + TRY (ret_value = hdf5_open_group (loc_id, group_name)); + } else { + TRY (ret_value = hdf5_create_group (loc_id, group_name)); + } + H5_RETURN (ret_value); +} + +static inline hid_t +h5priv_open_group ( + const hid_t loc_id, + const char const* group_name + ) { + H5_PRIV_FUNC_ENTER (hid_t, + "loc_id=%lld, (%s), group_name=%s", + (long long int)loc_id, hdf5_get_objname (loc_id), + group_name); + h5_err_t exists; + TRY (exists = hdf5_link_exists (loc_id, group_name)); + if (exists) { + TRY (ret_value = hdf5_open_group (loc_id, group_name)); + } else { + H5_RETURN_ERROR ( + H5_ERR_HDF5, + "Group does not exist: '%s/%s'.", + hdf5_get_objname (loc_id), + group_name); + } + H5_RETURN (ret_value); +} + +static inline hid_t +h5priv_create_group_with_intermediates ( + const hid_t loc_id, + ... + ) { + va_list ap; + va_start(ap, loc_id); + char* group_name = va_arg(ap, char*); + H5_PRIV_FUNC_ENTER (hid_t, + "loc_id=%lld (%s), " + "group_name=%s, ...", + (long long int)loc_id, hdf5_get_objname (loc_id), + group_name); + hid_t parent_id = loc_id; + while (group_name != NULL) { + TRY (ret_value = h5priv_create_group ( + parent_id, + group_name)); + if (parent_id != loc_id) { + // close intermediate groups + TRY (hdf5_close_group (parent_id)); + } + group_name = va_arg(ap, char*); + parent_id = ret_value; + } + va_end (ap); + H5_RETURN (ret_value); +} + +static inline hid_t +h5priv_open_group_with_intermediates ( + const hid_t loc_id, + ... + ) { + va_list ap; + va_start(ap, loc_id); + char* group_name = va_arg(ap, char*); + H5_PRIV_FUNC_ENTER (hid_t, + "loc_id=%lld (%s), " + "group_name=%s, ...", + (long long int)loc_id, hdf5_get_objname (loc_id), + group_name); + hid_t parent_id = loc_id; + while (group_name != NULL) { + TRY (ret_value = h5priv_open_group ( + parent_id, + group_name)); + if (parent_id != loc_id) { + // close intermediate groups + TRY (hdf5_close_group (parent_id)); + } + group_name = va_arg(ap, char*); + parent_id = ret_value; + } + va_end(ap); + H5_RETURN (ret_value); +} + static inline h5_ssize_t hdf5_get_num_objs_in_group ( const hid_t group_id diff --git a/src/h5core/private/h5t_model_tetm.c b/src/h5core/private/h5t_model_tetm.c index 8a53e38..8eb98dc 100644 --- a/src/h5core/private/h5t_model_tetm.c +++ b/src/h5core/private/h5t_model_tetm.c @@ -47,11 +47,9 @@ h5t_open_tetrahedral_mesh_by_idx ( hid_t ctn_hid; char name[1024]; - TRY (ctn_hid = h5priv_open_group ( - 0, + TRY (ctn_hid = h5priv_open_group_with_intermediates ( f->root_gid, - H5T_CONTAINER_GRPNAME, - TETRAHEDRAL_MESHES_GRPNAME)); + H5T_CONTAINER_GRPNAME, TETRAHEDRAL_MESHES_GRPNAME, NULL)); TRY (hdf5_get_name_of_group_by_idx (ctn_hid, idx, name, sizeof (name))); TRY (hdf5_close_group (ctn_hid)); @@ -68,12 +66,11 @@ h5t_open_tetrahedral_mesh ( H5_CORE_API_ENTER (h5_err_t, "f=%p, name=%s, mesh=%p", f, name, mesh); hid_t mesh_hid; - TRY (mesh_hid = h5priv_open_group ( - 0, // do not create intermediate groups + TRY (mesh_hid = h5priv_open_group_with_intermediates ( f->root_gid, H5T_CONTAINER_GRPNAME, TETRAHEDRAL_MESHES_GRPNAME, - name)); + name, NULL)); TRY (*mesh = h5_calloc (1, sizeof(**mesh))); h5t_mesh_t* m = *mesh; @@ -106,12 +103,11 @@ h5t_open_tetrahedral_mesh_part ( H5_CORE_API_ENTER (h5_err_t, "f=%p, name=%s, mesh=%p", f, name, mesh); hid_t mesh_hid; - TRY (mesh_hid = h5priv_open_group ( - 0, + TRY (mesh_hid = h5priv_open_group_with_intermediates ( f->root_gid, H5T_CONTAINER_GRPNAME, TRIANGLE_MESHES_GRPNAME, - name)); + name, NULL)); TRY (*mesh = h5_calloc (1, sizeof(**mesh))); h5t_mesh_t* m = *mesh; @@ -157,12 +153,11 @@ h5t_add_tetrahedral_mesh ( name); } hid_t mesh_hid; - TRY (mesh_hid = h5priv_open_group ( - 1, // create intermediate groups in path + TRY (mesh_hid = h5priv_create_group_with_intermediates ( f->root_gid, H5T_CONTAINER_GRPNAME, TETRAHEDRAL_MESHES_GRPNAME, - name)); + name, NULL)); TRY (*mesh = h5_calloc (1, sizeof(**mesh))); h5t_mesh_t* m = *mesh; @@ -214,12 +209,11 @@ h5t_add_chunked_tetrahedral_mesh ( name); } hid_t mesh_hid; - TRY (mesh_hid = h5priv_open_group ( - 1, // create intermediate groups in path + TRY (mesh_hid = h5priv_create_group_with_intermediates ( f->root_gid, H5T_CONTAINER_GRPNAME, TETRAHEDRAL_MESHES_GRPNAME, - name)); + name, NULL)); TRY (*mesh = h5_calloc (1, sizeof(**mesh))); h5t_mesh_t* m = *mesh; diff --git a/src/h5core/private/h5t_model_trim.c b/src/h5core/private/h5t_model_trim.c index 9fe9df2..742e7cd 100644 --- a/src/h5core/private/h5t_model_trim.c +++ b/src/h5core/private/h5t_model_trim.c @@ -46,11 +46,10 @@ h5t_open_triangle_mesh_by_idx ( hid_t ctn_hid; char name[1024]; - TRY (ctn_hid = h5priv_open_group ( - 0, + TRY (ctn_hid = h5priv_open_group_with_intermediates ( f->root_gid, H5T_CONTAINER_GRPNAME, - TRIANGLE_MESHES_GRPNAME)); + TRIANGLE_MESHES_GRPNAME, NULL)); TRY (hdf5_get_name_of_group_by_idx (ctn_hid, idx, name, sizeof (name))); TRY (hdf5_close_group (ctn_hid)); @@ -73,12 +72,11 @@ h5t_open_triangle_mesh ( double start = MPI_Wtime(); #endif hid_t mesh_hid; - TRY (mesh_hid = h5priv_open_group ( - 0, + TRY (mesh_hid = h5priv_open_group_with_intermediates ( f->root_gid, H5T_CONTAINER_GRPNAME, TRIANGLE_MESHES_GRPNAME, - name)); + name, NULL)); TRY (*mesh = h5_calloc (1, sizeof(**mesh))); h5t_mesh_t* m = *mesh; @@ -119,12 +117,11 @@ h5t_open_triangle_mesh_part ( MPI_Barrier (f->props->comm); double start = MPI_Wtime(); #endif - TRY (mesh_hid = h5priv_open_group ( - 0, + TRY (mesh_hid = h5priv_open_group_with_intermediates ( f->root_gid, H5T_CONTAINER_GRPNAME, TRIANGLE_MESHES_GRPNAME, - name)); + name, NULL)); TRY (*mesh = h5_calloc (1, sizeof(**mesh))); h5t_mesh_t* m = *mesh; @@ -176,12 +173,11 @@ h5t_add_triangle_mesh ( name); } hid_t mesh_hid; - TRY (mesh_hid = h5priv_open_group ( - 1, // create intermediate groups in path + TRY (mesh_hid = h5priv_create_group_with_intermediates ( f->root_gid, H5T_CONTAINER_GRPNAME, TRIANGLE_MESHES_GRPNAME, - name)); + name, NULL)); TRY (*mesh = h5_calloc (1, sizeof(**mesh))); h5t_mesh_t* m = *mesh; @@ -240,12 +236,11 @@ h5t_add_chunked_triangle_mesh( name); } hid_t mesh_hid; - TRY (mesh_hid = h5priv_open_group ( - 1, // create intermediate groups in path + TRY (mesh_hid = h5priv_create_group_with_intermediates ( f->root_gid, H5T_CONTAINER_GRPNAME, TRIANGLE_MESHES_GRPNAME, - name)); + name, NULL)); TRY (*mesh = h5_calloc (1, sizeof(**mesh))); h5t_mesh_t* m = *mesh;