diff options
Diffstat (limited to 'src/H5Gpkg.h')
-rw-r--r-- | src/H5Gpkg.h | 227 |
1 files changed, 206 insertions, 21 deletions
diff --git a/src/H5Gpkg.h b/src/H5Gpkg.h index 4c6ec68..ad65fc1 100644 --- a/src/H5Gpkg.h +++ b/src/H5Gpkg.h @@ -36,6 +36,55 @@ #include "H5SLprivate.h" /* Skip lists */ #define H5G_SIZE_HINT 256 /* default root grp size hint */ +#define H5G_NLINKS 16 /*max symlinks to follow per lookup */ + +/* + * Various types of object header information can be cached in a symbol + * table entry (it's normal home is the object header to which the entry + * points). This datatype determines what (if anything) is cached in the + * symbol table entry. + */ +typedef enum H5G_type_t { + H5G_CACHED_ERROR = -1, /*force enum to be signed */ + H5G_NOTHING_CACHED = 0, /*nothing is cached, must be 0 */ + H5G_CACHED_STAB = 1, /*symbol table, `stab' */ + H5G_CACHED_SLINK = 2, /*symbolic link */ + + H5G_NCACHED = 3 /*THIS MUST BE LAST */ +} H5G_type_t; + +/* + * A symbol table entry caches these parameters from object header + * messages... The values are entered into the symbol table when an object + * header is created (by hand) and are extracted from the symbol table with a + * callback function registered in H5O_init_interface(). Be sure to update + * H5G_ent_decode(), H5G_ent_encode(), and H5G_ent_debug() as well. + */ +typedef union H5G_cache_t { + struct { + haddr_t btree_addr; /*file address of symbol table B-tree*/ + haddr_t heap_addr; /*file address of stab name heap */ + } stab; + + struct { + size_t lval_offset; /*link value offset */ + } slink; +} H5G_cache_t; + +/* + * A symbol table entry. The two important fields are `name_off' and + * `header'. The remaining fields are used for caching information that + * also appears in the object header to which this symbol table entry + * points. + */ +typedef struct H5G_entry_t { + hbool_t dirty; /*entry out-of-date? */ + H5G_type_t type; /*type of information cached */ + H5G_cache_t cache; /*cached data from object header */ + size_t name_off; /*offset of name within name heap */ + haddr_t header; /*file address of object header */ + H5F_t *file; /*file to which this obj hdr belongs */ +} H5G_entry_t; /* * A symbol table node is a collection of symbol table entries. It can @@ -63,8 +112,9 @@ struct H5G_shared_t { * above the H5G layer. */ struct H5G_t { - H5G_shared_t* shared; /*shared file object data */ - H5G_entry_t ent; /*info about the group */ + H5G_shared_t *shared; /* Shared file object data */ + H5O_loc_t oloc; /* Object location for group */ + H5G_name_t path; /* Group hierarchy path */ }; /* @@ -90,15 +140,12 @@ typedef H5G_bt_ud_common_t H5G_bt_ud0_t; /* * Data exchange structure for symbol table nodes. This structure is - * passed through the B-link tree layer to the methods for the objects - * to which the B-link tree points. + * passed through the B-link tree layer to the insert method for entries. */ typedef struct H5G_bt_ud1_t { /* downward */ H5G_bt_ud_common_t common; /* Common info for B-tree user data (must be first) */ - - /* downward for INSERT, upward for FIND */ - H5G_entry_t *ent; /*entry to insert into table */ + const H5O_link_t *lnk; /* Link to insert into table */ } H5G_bt_ud1_t; /* @@ -112,8 +159,25 @@ typedef struct H5G_bt_ud2_t { hbool_t adj_link; /* Whether to adjust the link count on objects */ /* upward */ + H5G_obj_t *obj_type; /*member type to be returned */ } H5G_bt_ud2_t; +/* Typedef for B-tree 'find' operation */ +typedef herr_t (*H5G_bt_find_op_t)(const H5G_entry_t *ent/*in*/, void *operator_data/*in,out*/); + +/* + * Data exchange structure for symbol table nodes. This structure is + * passed through the B-link tree layer to the 'find' method for entries. + */ +typedef struct H5G_bt_ud3_t { + /* downward */ + H5G_bt_ud_common_t common; /* Common info for B-tree user data (must be first) */ + H5G_bt_find_op_t op; /* Operator to call when correct entry is found */ + void *op_data; /* Data to pass to operator */ + + /* upward */ +} H5G_bt_ud3_t; + /* * Data exchange structure to pass through the B-tree layer for the * H5B_iterate function. @@ -127,7 +191,7 @@ typedef struct H5G_bt_it_ud1_t { int skip; /*initial entries to skip */ /* upward */ - int final_ent; /*final entry looked at */ + int *final_ent; /*final entry looked at */ } H5G_bt_it_ud1_t; /* @@ -164,18 +228,52 @@ typedef struct H5G_bt_it_ud3_t { typedef struct H5G_bt_it_ud4_t { /* downward */ haddr_t heap_addr; /*symbol table heap address */ - H5G_entry_t *grp_ent; /*entry of group */ + size_t max_links; /* Max. # of links array can store */ /* upward */ + H5O_link_t *lnk_table; /* Pointer to array of links to fill in */ + size_t nlinks; /* Links inserted into table */ } H5G_bt_it_ud4_t; /* Data passed to B-tree iteration for copying copy symblol table content */ typedef struct H5G_bt_it_ud5_t { + haddr_t src_heap_addr; /* heap address of the source symbol table */ + H5F_t *dst_file; /* File of destination group */ + H5O_stab_t *dst_stab; /* symbol table info for destination group */ H5SL_t *map_list; /* skip list to map copied object addresses */ - haddr_t heap_addr; /* heap address of the source symbol table */ - H5G_entry_t *loc_dst; /* group where new object is inserted to */ } H5G_bt_it_ud5_t; +/* Typedef for path traversal operations */ +typedef herr_t (*H5G_traverse_t)(H5G_loc_t *grp_loc/*in*/, const char *name, + const H5O_link_t *lnk/*in*/, H5G_loc_t *obj_loc/*out*/, void *operator_data/*in,out*/); + +/* "value" information for a link (as opposed to "name" of link) */ +typedef struct { + haddr_t addr; /* Address of object linked to */ +} H5G_linkvalue_hard_t; + +typedef struct { + char *name; /* Link value */ +} H5G_linkvalue_soft_t; + +typedef struct { + H5G_link_t type; /* Type of link */ + union { + H5G_linkvalue_hard_t hard; /* Information for hard link */ + H5G_linkvalue_soft_t soft; /* Information for soft link */ + } u; +} H5G_linkvalue_t; + +/* + * During name lookups (see H5G_traverse()) we sometimes want information about + * a symbolic link or a mount point. The normal operation is to follow the + * symbolic link or mount point and return information about its target. + */ +#define H5G_TARGET_NORMAL 0x0000 +#define H5G_TARGET_SLINK 0x0001 +#define H5G_TARGET_MOUNT 0x0002 +#define H5G_CRT_INTMD_GROUP 0x0004 + /* * This is the class identifier to give to the B-tree functions. */ @@ -185,32 +283,56 @@ H5_DLLVAR H5B_class_t H5B_SNODE[1]; H5_DLLVAR const H5AC_class_t H5AC_SNODE[1]; /* + * Utility functions + */ +H5_DLL H5G_t *H5G_rootof(H5F_t *f); +H5_DLL const char * H5G_component(const char *name, size_t *size_p); +H5_DLL herr_t H5G_traverse_term_interface(void); +H5_DLL herr_t H5G_traverse(const H5G_loc_t *loc, const char *name, + unsigned target, H5G_traverse_t op, void *op_data, hid_t dxpl_id); + +/* * Functions that understand symbol tables but not names. The * functions that understand names are exported to the rest of * the library and appear in H5Gprivate.h. */ -H5_DLL herr_t H5G_stab_create(H5F_t *f, hid_t dxpl_id, size_t size_hint, - H5G_entry_t *ent/*out*/); -H5_DLL herr_t H5G_stab_find(H5G_entry_t *grp_ent, const char *name, - H5G_entry_t *obj_ent/*out*/, hid_t dxpl_id); -H5_DLL herr_t H5G_stab_insert(H5G_entry_t *grp_ent, const char *name, - H5G_entry_t *obj_ent, hbool_t inc_link, hid_t dxpl_id); +H5_DLL herr_t H5G_stab_create(H5O_loc_t *grp_oloc, H5O_stab_t *stab, hid_t dxpl_id); +H5_DLL herr_t H5G_stab_create_components(H5F_t *f, H5O_stab_t *stab, size_t size_hint, hid_t dxpl_id); +H5_DLL herr_t H5G_stab_insert(H5O_loc_t *grp_oloc, const char *name, + H5O_link_t *obj_lnk, hid_t dxpl_id); +H5_DLL herr_t H5G_stab_insert_real(H5F_t *f, H5O_stab_t *stab, const char *name, + H5O_link_t *obj_lnk, hid_t dxpl_id); H5_DLL herr_t H5G_stab_delete(H5F_t *f, hid_t dxpl_id, const H5O_stab_t *stab, hbool_t adj_link); -H5_DLL herr_t H5G_stab_remove(H5G_entry_t *grp_ent, const char *name, hid_t dxpl_id); -H5_DLL herr_t H5G_stab_copy_tmp(H5F_t *f_dst, H5O_stab_t *stab_dst, +H5_DLL herr_t H5G_stab_iterate(H5O_loc_t *oloc, hid_t gid, int skip, + int *last_obj, H5G_iterate_t op, void *op_data, hid_t dxpl_id); +H5_DLL herr_t H5G_stab_count(struct H5O_loc_t *oloc, hsize_t *num_objs, hid_t dxpl_id); +H5_DLL ssize_t H5G_stab_get_name_by_idx(H5O_loc_t *oloc, hsize_t idx, char* name, + size_t size, hid_t dxpl_id); +H5_DLL H5G_obj_t H5G_stab_get_type_by_idx(H5O_loc_t *oloc, hsize_t idx, hid_t dxpl_id); - +H5_DLL herr_t H5G_stab_remove(H5O_loc_t *oloc, const char *name, + H5G_obj_t *obj_type, hid_t dxpl_id); +H5_DLL herr_t H5G_stab_lookup(H5O_loc_t *grp_oloc, const char *name, + H5O_link_t *lnk, hid_t dxpl_id); /* * Functions that understand symbol table entries. */ +H5_DLL herr_t H5G_ent_copy(H5G_entry_t *dst, const H5G_entry_t *src, + H5G_copy_depth_t depth); +H5_DLL herr_t H5G_ent_reset(H5G_entry_t *ent); H5_DLL herr_t H5G_ent_decode_vec(H5F_t *f, const uint8_t **pp, H5G_entry_t *ent, unsigned n); H5_DLL herr_t H5G_ent_encode_vec(H5F_t *f, uint8_t **pp, const H5G_entry_t *ent, unsigned n); -H5_DLL herr_t H5G_ent_set_name(H5G_entry_t *loc, H5G_entry_t *obj, const char *name); +H5_DLL herr_t H5G_ent_modified(H5G_entry_t *ent, H5G_type_t cache_type); +H5_DLL herr_t H5G_ent_convert(H5F_t *f, haddr_t heap_addr, const char *name, + const H5O_link_t *lnk, H5G_entry_t *ent, hid_t dxpl_id); +H5_DLL herr_t H5G_ent_debug(H5F_t *f, hid_t dxpl_id, const H5G_entry_t *ent, FILE * stream, + int indent, int fwidth, haddr_t heap); /* Functions that understand symbol table nodes */ +H5_DLL herr_t H5G_node_init(H5F_t *f); H5_DLL int H5G_node_iterate (H5F_t *f, hid_t dxpl_id, const void *_lt_key, haddr_t addr, const void *_rt_key, void *_udata); H5_DLL int H5G_node_sumup(H5F_t *f, hid_t dxpl_id, const void *_lt_key, haddr_t addr, @@ -221,5 +343,68 @@ H5_DLL int H5G_node_type(H5F_t *f, hid_t dxpl_id, const void *_lt_key, haddr_t a const void *_rt_key, void *_udata); H5_DLL int H5G_node_copy(H5F_t *f, hid_t dxpl_id, const void *_lt_key, haddr_t addr, const void *_rt_key, void *_udata); +H5_DLL int H5G_node_stab_convert(H5F_t *f, hid_t dxpl_id, const void *_lt_key, haddr_t addr, + const void *_rt_key, void *_udata); + +/* Functions that understand link messages */ +/* forward reference for later use */ +struct H5HL_t; /* defined in H5HLprivate.h */ +H5_DLL herr_t H5G_link_convert(H5O_link_t *lnk, const H5G_entry_t *ent, + const struct H5HL_t *_heap, const char *name); +H5_DLL herr_t H5G_link_insert(H5O_loc_t *grp_oloc, H5O_link_t *obj_lnk, + hid_t dxpl_id); +H5_DLL ssize_t H5G_link_get_name_by_idx(H5O_loc_t *oloc, hsize_t idx, char* name, + size_t size, hid_t dxpl_id); +H5_DLL H5G_obj_t H5G_link_get_type_by_idx(H5O_loc_t *oloc, hsize_t idx, + hid_t dxpl_id); +H5_DLL herr_t H5G_link_remove(const H5O_loc_t *oloc, const char *name, + H5G_obj_t *obj_type, hid_t dxpl_id); +H5_DLL herr_t H5G_link_iterate(H5O_loc_t *oloc, hid_t gid, int skip, + int *last_obj, H5G_iterate_t op, void *op_data, hid_t dxpl_id); +H5_DLL herr_t H5G_link_lookup(H5O_loc_t *grp_oloc, const char *name, + H5O_link_t *lnk, hid_t dxpl_id); + +/* Functions that understand objects */ +H5_DLL herr_t H5G_obj_create(H5F_t *f, hid_t dxpl_id, H5O_ginfo_t *ginfo, + H5O_loc_t *oloc/*out*/); +H5_DLL herr_t H5G_obj_insert(H5O_loc_t *grp_oloc, const char *name, + H5O_link_t *obj_lnk, hbool_t inc_link, hid_t dxpl_id); +H5_DLL herr_t H5G_obj_lookup(H5O_loc_t *grp_oloc, const char *name, + H5O_link_t *lnk, hid_t dxpl_id); +H5_DLL herr_t H5G_obj_iterate(hid_t loc_id, const char *name, int skip, + int *last_obj, H5G_iterate_t op, void *op_data, hid_t dxpl_id); +H5_DLL herr_t H5G_obj_count(struct H5O_loc_t *oloc, hsize_t *num_objs, hid_t dxpl_id); +H5_DLL ssize_t H5G_obj_get_name_by_idx(H5O_loc_t *oloc, hsize_t idx, + char* name, size_t size, hid_t dxpl_id); +H5_DLL H5G_obj_t H5G_obj_get_type_by_idx(H5O_loc_t *oloc, hsize_t idx, + hid_t dxpl_id); +H5_DLL herr_t H5G_obj_remove(H5O_loc_t *oloc, const char *name, + H5G_obj_t *obj_type, hid_t dxpl_id); +H5_DLL herr_t H5G_obj_find(H5G_loc_t *loc, const char *name, + unsigned traverse_flags, H5O_loc_t *obj_oloc, hid_t dxpl_id); + +/* + * These functions operate on group hierarchy names. + */ +H5_DLL herr_t H5G_name_init(H5G_name_t *name, const char *path); +H5_DLL herr_t H5G_name_set(H5G_name_t *loc, H5G_name_t *obj, const char *name); + +/* + * These functions operate on group "locations" + */ +H5_DLL herr_t H5G_loc_copy(H5G_loc_t *dst, H5G_loc_t *src, H5G_copy_depth_t depth); +H5_DLL herr_t H5G_loc_insert(H5G_loc_t *grp_loc, const char *name, + H5G_loc_t *obj_loc, hbool_t inc_link, hid_t dxpl_id); +H5_DLL herr_t H5G_loc_exists(const H5G_loc_t *loc, const char *name, hid_t dxpl_id); +H5_DLL herr_t H5G_loc_remove(H5G_loc_t *grp_loc, const char *name, + H5G_loc_t *obj_loc, hid_t dxpl_id); + +/* Testing functions */ +#ifdef H5G_TESTING +H5_DLL htri_t H5G_is_empty_test(hid_t gid); +H5_DLL htri_t H5G_has_links_test(hid_t gid, unsigned *nmsgs); +H5_DLL htri_t H5G_has_stab_test(hid_t gid); +#endif /* H5G_TESTING */ #endif + |