summaryrefslogtreecommitdiffstats
path: root/src/H5HFpkg.h
diff options
context:
space:
mode:
authorQuincey Koziol <koziol@hdfgroup.org>2006-04-30 13:32:41 (GMT)
committerQuincey Koziol <koziol@hdfgroup.org>2006-04-30 13:32:41 (GMT)
commit4965bf1839b4219c3063e27d37bc59a777cc1fb5 (patch)
tree925c87307aa9c13c66c301b0d3ca9283e9b20d32 /src/H5HFpkg.h
parenteb96132022da938d4b54ae4dd482919a178c4ee5 (diff)
downloadhdf5-4965bf1839b4219c3063e27d37bc59a777cc1fb5.zip
hdf5-4965bf1839b4219c3063e27d37bc59a777cc1fb5.tar.gz
hdf5-4965bf1839b4219c3063e27d37bc59a777cc1fb5.tar.bz2
[svn-r12317] Purpose:
Code checkpoint Description: More progress on fractal heap, can now re-open an existing heap, although the free space algorithm still needs work. Also, use the new "pinned entry" metadata cache code. Platforms tested: FreeBSD 4.11 (sleipnir) Linux 2.4 (heping) Solaris 9 (shanti) Linux 2.4/64 (mir)
Diffstat (limited to 'src/H5HFpkg.h')
-rw-r--r--src/H5HFpkg.h263
1 files changed, 163 insertions, 100 deletions
diff --git a/src/H5HFpkg.h b/src/H5HFpkg.h
index 1f1518b..af06770 100644
--- a/src/H5HFpkg.h
+++ b/src/H5HFpkg.h
@@ -79,6 +79,7 @@
+ (h)->sizeof_size /* Total std. free entries */ \
+ (h)->sizeof_size /* Total size of heap */ \
+ (h)->sizeof_size /* Size of man. space in heap */ \
+ + (h)->sizeof_size /* Size of alloacted man. space in heap */ \
+ (h)->sizeof_size /* Size of std. space in heap */ \
+ (h)->sizeof_size /* Number of objects in heap */ \
+ H5HF_DTABLE_INFO_SIZE(h) /* Size of managed obj. doubling-table info */ \
@@ -99,9 +100,6 @@
\
/* Fractal heap managed, absolutely mapped direct block specific fields */ \
+ (h)->sizeof_addr /* File address of heap owning the block */ \
- + (h)->sizeof_addr /* File address of parent block */ \
- + 2 /* Entry within parent block */ \
- + 2 /* # of rows for parent block */ \
+ (h)->heap_off_size /* Offset of the block in the heap */ \
+ H5HF_SIZEOF_OFFSET_LEN(s) /* Offset of first descriptor in free list */ \
)
@@ -111,9 +109,6 @@
\
/* Fractal heap managed, absolutely mapped direct block specific fields */ \
+ (h)->sizeof_addr /* File address of heap owning the block */ \
- + (h)->sizeof_addr /* File address of parent block */ \
- + 2 /* Entry within parent block */ \
- + 2 /* # of rows for parent block */ \
+ (h)->heap_off_size /* Offset of the block in the heap */ \
+ (d)->blk_off_size /* Offset of first descriptor in free list */ \
)
@@ -125,11 +120,7 @@
\
/* Fractal heap managed, absolutely mapped indirect block specific fields */ \
+ (h)->sizeof_addr /* File address of heap owning the block */ \
- + (h)->sizeof_addr /* File address of parent block */ \
- + 2 /* Entry within parent block */ \
- + 2 /* # of rows for parent block */ \
+ (h)->heap_off_size /* Offset of the block in the heap */ \
- + 4 /* Next block entry to allocate from */ \
+ (MIN((i)->nrows, (h)->man_dtable.max_direct_rows) * (h)->man_dtable.cparam.width * ((h)->sizeof_addr + (h)->man_dtable.max_dir_blk_off_size)) /* Size of entries for direct blocks */ \
+ ((((i)->nrows > (h)->man_dtable.max_direct_rows) ? ((i)->nrows - (h)->man_dtable.max_direct_rows) : 0) * (h)->man_dtable.cparam.width * ((h)->sizeof_addr + (h)->heap_off_size)) /* Size of entries for indirect blocks */ \
)
@@ -148,7 +139,7 @@ typedef struct H5HF_dtable_t {
/* Immutable, pre-set information for table */
H5HF_dtable_cparam_t cparam; /* Creation parameters for table */
- /* Derived information (stored, vary during lifetime of table) */
+ /* Derived information (stored, varies during lifetime of table) */
haddr_t table_addr; /* Address of first block for table */
/* Undefined if no space allocated for table */
unsigned curr_root_rows; /* Current number of rows in the root indirect block */
@@ -175,46 +166,34 @@ typedef struct H5HF_dtable_t {
/* Fractal heap free list info (forward decl - defined in H5HFflist.c) */
typedef struct H5HF_freelist_t H5HF_freelist_t;
-/* Fractal heap free list section info */
-typedef struct H5HF_free_section_t {
- haddr_t sect_addr; /* Address of free list section in the file */
- /* (Not actually used as address, used as unique ID for free list node) */
- size_t sect_size; /* Size of free space section */
- /* (section size is "object size", without the metadata overhead, since metadata overhead varies from block to block) */
- /* (for range sections, this is the largest single section within the range) */
- enum {H5HF_SECT_SINGLE, H5HF_SECT_RANGE, H5HF_SECT_INDIRECT} type; /* Type of free space section */
- union {
- struct {
- haddr_t dblock_addr; /* Address of direct block for free section */
- size_t dblock_size; /* Size of direct block */
- /* (Needed to retrieve direct block) */
- } single;
- struct {
- haddr_t iblock_addr; /* Address of indirect block for free section */
- unsigned iblock_nrows; /* Number of rows in indirect block */
- /* (Needed to retrieve indirect block) */
- unsigned row; /* Row for range of blocks */
- unsigned col; /* Column for range of blocks */
- unsigned num_entries; /* Number of entries covered */
- } range;
- struct {
- haddr_t iblock_addr; /* Address of indirect block for free section */
- unsigned iblock_nrows; /* Number of rows in indirect block */
- /* (Needed to retrieve indirect block) */
- unsigned row; /* Row for range of blocks */
- unsigned col; /* Column for range of blocks */
- unsigned num_entries; /* Number of entries covered */
- unsigned indir_row; /* Row for indirect range of blocks */
- unsigned indir_nrows; /* Number of rows in indirect blocks */
- } indirect;
- } u;
-} H5HF_free_section_t;
+/* Forward decl indirect block info */
+typedef struct H5HF_indirect_t H5HF_indirect_t;
+
+/* Fractal heap block location */
+typedef struct H5HF_block_loc_t {
+ /* Necessary table fields */
+ unsigned row; /* Row of block in doubling table */
+ unsigned col; /* Column of block in doubling table */
+
+ /* Derived/computed/cached table fields */
+ unsigned entry; /* Entry of block in doubling table */
+
+ /* Infrastructure */
+ H5HF_indirect_t *context; /* Pointer to the indirect block containing the block */
+ struct H5HF_block_loc_t *up; /* Pointer to next level up in the stack of levels */
+} H5HF_block_loc_t;
+
+/* Fractal heap block iterator info */
+typedef struct H5HF_block_iter_t {
+ hbool_t ready; /* Set if iterator is finished initializing */
+ H5HF_block_loc_t *curr; /* Pointer to the current level information for iterator */
+} H5HF_block_iter_t;
/* The fractal heap header information */
/* (Each fractal heap header has certain information that is shared across all
* the instances of blocks in that fractal heap)
*/
-typedef struct H5HF_t {
+typedef struct H5HF_hdr_t {
/* Information for H5AC cache functions, _must_ be first field in structure */
H5AC_info_t cache_info;
@@ -225,20 +204,28 @@ typedef struct H5HF_t {
/* Statistics for heap */
hsize_t total_size; /* Total amount of space used by heap (managed & standalone) */
hsize_t man_size; /* Total amount of managed space in heap */
+ hsize_t man_alloc_size; /* Total amount of allocated managed space in heap */
hsize_t std_size; /* Total amount of standalone space in heap */
hsize_t nobjs; /* Number of objects in heap */
/* Cached/computed values (not stored in header) */
size_t rc; /* Reference count of child blocks */
hbool_t dirty; /* Shared info is modified */
- hbool_t evicted; /* Shared info is evicted from cache */
haddr_t heap_addr; /* Address of heap header in the file */
H5AC_protect_t mode; /* Access mode for heap */
H5F_t *f; /* Pointer to file for heap */
size_t sizeof_size; /* Size of file sizes */
size_t sizeof_addr; /* Size of file addresses */
- H5HF_freelist_t *flist; /* Free list for objects in heap */
size_t id_len; /* Size of heap IDs */
+ H5HF_freelist_t *flist; /* Free list for objects in heap */
+ unsigned fl_gen; /* Free list "generation" */
+ H5HF_block_iter_t next_block; /* Block iterator for searching for next block with space */
+ hbool_t freelist_sync; /* If the heap's free list in memory is in sync with the free list on disk */
+ /* (ie. all existing blocks have been scanned
+ * for free space (or heap is new and there are
+ * no blocks with unknown free space) and new
+ * free space is added by adding new blocks)
+ */
/* Doubling table information */
/* (Partially set by user, partially derived/updated internally) */
@@ -254,7 +241,7 @@ typedef struct H5HF_t {
hbool_t debug_objs; /* Is the heap storing objects in 'debug' format */
hbool_t have_io_filter; /* Does the heap have I/O filters for the direct blocks? */
hbool_t write_once; /* Is heap being written in "write once" mode? */
-} H5HF_t;
+} H5HF_hdr_t;
/* Indirect block entry */
typedef struct H5HF_indirect_ent_t {
@@ -264,33 +251,27 @@ typedef struct H5HF_indirect_ent_t {
} H5HF_indirect_ent_t;
/* Fractal heap indirect block */
-typedef struct H5HF_indirect_t {
+struct H5HF_indirect_t {
/* Information for H5AC cache functions, _must_ be first field in structure */
H5AC_info_t cache_info;
- /* Internal heap information */
+ /* Internal heap information (not stored) */
size_t rc; /* Reference count of child blocks */
hbool_t dirty; /* Info is modified */
- hbool_t evicted; /* Info is evicted from cache */
- H5HF_t *shared; /* Shared heap header info */
+ H5HF_hdr_t *hdr; /* Shared heap header info */
+ unsigned fl_gen; /* Free list "generation" */
struct H5HF_indirect_t *parent; /* Shared parent indirect block info */
+ unsigned par_entry; /* Entry in parent's table */
hsize_t child_free_space; /* Total amount of free space in children */
haddr_t addr; /* Address of this indirect block on disk */
unsigned nrows; /* Total # of rows in indirect block */
unsigned max_rows; /* Max. # of rows in indirect block */
size_t size; /* Size of indirect block on disk */
- unsigned next_col; /* "Column" of next managed block (in doubling table) */
- unsigned next_row; /* "Row" of next managed block (in doubling table) */
- hsize_t next_size; /* Size of next managed block */
- H5HF_indirect_ent_t *ents; /* Pointer to block entry table */
/* Stored values */
- haddr_t par_addr; /* Address of parent block on disk */
- unsigned par_entry; /* Entry in parent's table */
- unsigned par_nrows; /* Total # of rows in parent indirect block */
hsize_t block_off; /* Offset of the block within the heap's address space */
- size_t next_entry; /* Entry of next managed block */
-} H5HF_indirect_t;
+ H5HF_indirect_ent_t *ents; /* Pointer to block entry table */
+};
/* Direct block free list node */
typedef struct H5HF_direct_free_node_t {
@@ -314,8 +295,10 @@ typedef struct H5HF_direct_t {
H5AC_info_t cache_info;
/* Internal heap information */
- H5HF_t *shared; /* Shared heap header info */
+ H5HF_hdr_t *hdr; /* Shared heap header info */
+ unsigned fl_gen; /* Free list "generation" */
H5HF_indirect_t *parent; /* Shared parent indirect block info */
+ unsigned par_entry; /* Entry in parent's table */
size_t size; /* Size of direct block */
unsigned blk_off_size; /* Size of offsets in the block */
size_t blk_free_space; /* Total amount of free space in block */
@@ -323,13 +306,16 @@ typedef struct H5HF_direct_t {
uint8_t *blk; /* Pointer to buffer containing block data */
/* Stored values */
- haddr_t par_addr; /* Address of parent block on disk */
- unsigned par_entry; /* Entry in parent's table */
- unsigned par_nrows; /* Total # of rows in parent indirect block */
hsize_t block_off; /* Offset of the block within the heap's address space */
size_t free_list_head; /* Offset of head of free list in block */
} H5HF_direct_t;
+/* Fractal heap */
+struct H5HF_t {
+ H5HF_hdr_t *hdr; /* Pointer to internal fractal heap header info */
+ unsigned fo_count; /* Open object count for file */
+};
+
/* Fractal heap metadata statistics info */
typedef struct H5HF_stat_t {
hsize_t total_size; /* Total size of heap allocated (man & std) */
@@ -339,6 +325,56 @@ typedef struct H5HF_stat_t {
hsize_t nobjs; /* Number of objects in heap */
} H5HF_stat_t;
+/* Fractal heap free list section info */
+typedef struct H5HF_free_section_t {
+ haddr_t sect_addr; /* Address of free list section in the file */
+ /* (Not actually used as address, used as unique ID for free list node) */
+ size_t sect_size; /* Size of free space section */
+ /* (section size is "object size", without the metadata overhead, since metadata overhead varies from block to block) */
+ /* (for range sections, this is the largest single section within the range) */
+ enum {
+ H5HF_SECT_SINGLE, /* Section is actual bytes in a direct block */
+ H5HF_SECT_OPAQUE, /* Section is an opaque # of bytes in child of an indirect block */
+ H5HF_SECT_RANGE, /* Section is a range of direct blocks in an indirect block row */
+ H5HF_SECT_INDIRECT} /* Section is a range of _indirect_ blocks in an indirect block row */
+ type; /* Type of free space section */
+ union {
+ struct {
+ H5HF_indirect_t *parent; /* Indirect block parent for free section's direct block */
+ unsigned par_entry; /* Entry of free section's direct block in parent indirect block */
+ /* (Needed to retrieve direct block) */
+
+ haddr_t dblock_addr; /* Address of direct block for free section */
+ size_t dblock_size; /* Size of direct block */
+ /* (Needed to retrieve direct block) */
+ } single;
+ struct {
+ H5HF_indirect_t *iblock; /* Indirect block parent for free section's child block */
+ unsigned entry; /* Entry of free section's child block in parent indirect block */
+ } opaque;
+ struct {
+ H5HF_indirect_t *iblock; /* Indirect block for free section */
+ unsigned row; /* Row for range of blocks */
+ unsigned col; /* Column for range of blocks */
+ unsigned num_entries; /* Number of entries covered */
+ } range;
+ struct {
+ H5HF_indirect_t *iblock; /* Indirect block for free section */
+ unsigned row; /* Row for range of blocks */
+ unsigned col; /* Column for range of blocks */
+ unsigned num_entries; /* Number of entries covered */
+ unsigned indir_row; /* Row for indirect range of blocks */
+ unsigned indir_nrows; /* Number of rows in indirect blocks */
+ } indirect;
+ } u;
+} H5HF_free_section_t;
+
+/* Fractal heap "parent info" (for loading a block) */
+typedef struct H5HF_parent_t {
+ H5HF_hdr_t *hdr; /* Pointer to heap header info */
+ H5HF_indirect_t *iblock; /* Pointer to parent indirect block */
+ unsigned entry; /* Location of block in parent's entry table */
+} H5HF_parent_t;
/*****************************/
/* Package Private Variables */
@@ -353,8 +389,8 @@ H5_DLLVAR const H5AC_class_t H5AC_FHEAP_DBLOCK[1];
/* H5HF indirect block inherits cache-like properties from H5AC */
H5_DLLVAR const H5AC_class_t H5AC_FHEAP_IBLOCK[1];
-/* Declare a free list to manage the H5HF_t struct */
-H5FL_EXTERN(H5HF_t);
+/* Declare a free list to manage the H5HF_hdr_t struct */
+H5FL_EXTERN(H5HF_hdr_t);
/* Declare a free list to manage the H5HF_direct_t struct */
H5FL_EXTERN(H5HF_direct_t);
@@ -383,57 +419,68 @@ H5FL_EXTERN(H5HF_free_section_t);
/******************************/
/* Routines for managing shared fractal heap header */
-H5_DLL H5HF_t * H5HF_hdr_alloc(H5F_t *f);
-H5_DLL herr_t H5HF_hdr_init(H5HF_t *hdr, haddr_t heap_addr, H5HF_create_t *cparam);
-H5_DLL herr_t H5HF_hdr_finish_init(H5HF_t *hdr);
+H5_DLL H5HF_hdr_t * H5HF_hdr_alloc(H5F_t *f);
+H5_DLL herr_t H5HF_hdr_init(H5HF_hdr_t *hdr, haddr_t fh_addr, H5HF_create_t *cparam);
+H5_DLL herr_t H5HF_hdr_finish_init(H5HF_hdr_t *hdr);
/* Doubling table routines */
H5_DLL herr_t H5HF_dtable_init(H5HF_dtable_t *dtable);
H5_DLL herr_t H5HF_dtable_dest(H5HF_dtable_t *dtable);
H5_DLL herr_t H5HF_dtable_lookup(const H5HF_dtable_t *dtable, hsize_t off,
unsigned *row, unsigned *col);
+H5_DLL unsigned H5HF_dtable_size_to_row(H5HF_dtable_t *dtable, size_t block_size);
/* Heap header routines */
-H5_DLL herr_t H5HF_cache_hdr_dest_real(H5HF_t *hdr);
-H5_DLL herr_t H5HF_hdr_incr(H5HF_t *hdr);
-H5_DLL herr_t H5HF_hdr_decr(H5HF_t *hdr);
-H5_DLL herr_t H5HF_hdr_dirty(hid_t dxpl_id, H5HF_t *hdr);
-H5_DLL herr_t H5HF_hdr_extend_heap(H5HF_t *hdr, hsize_t new_size, hsize_t extra_free);
+H5_DLL herr_t H5HF_hdr_incr(H5HF_hdr_t *hdr);
+H5_DLL herr_t H5HF_hdr_decr(H5HF_hdr_t *hdr);
+H5_DLL herr_t H5HF_hdr_dirty(H5HF_hdr_t *hdr);
+H5_DLL herr_t H5HF_hdr_extend_heap(H5HF_hdr_t *hdr, hsize_t new_size, hsize_t extra_free);
+H5_DLL herr_t H5HF_hdr_inc_alloc(H5HF_hdr_t *hdr, hsize_t new_alloc_size,
+ unsigned nentries);
/* Indirect block routines */
-H5_DLL herr_t H5HF_cache_iblock_dest_real(H5HF_indirect_t *iblock);
H5_DLL herr_t H5HF_iblock_incr(H5HF_indirect_t *iblock);
H5_DLL herr_t H5HF_iblock_decr(H5HF_indirect_t *iblock);
-H5_DLL herr_t H5HF_iblock_dirty(hid_t dxpl_id, H5HF_indirect_t *iblock);
-H5_DLL H5HF_indirect_t * H5HF_man_iblock_place_dblock(H5HF_t *fh, hid_t dxpl_id,
- size_t min_dblock_size, haddr_t *addr_p, size_t *entry_p,
- size_t *dblock_size);
-H5_DLL herr_t H5HF_man_iblock_alloc_range(H5HF_t *hdr, hid_t dxpl_id,
- H5HF_free_section_t **sec_node, size_t obj_size);
-H5_DLL herr_t H5HF_man_iblock_alloc_indirect(H5HF_t *hdr, hid_t dxpl_id,
- H5HF_free_section_t **sec_node, size_t obj_size);
+H5_DLL herr_t H5HF_iblock_dirty(H5HF_indirect_t *iblock);
+H5_DLL H5HF_indirect_t * H5HF_man_iblock_place_dblock(H5HF_hdr_t *fh, hid_t dxpl_id,
+ size_t min_dblock_size, size_t *entry_p, size_t *dblock_size);
+H5_DLL herr_t H5HF_man_iblock_alloc_range(H5HF_hdr_t *hdr, hid_t dxpl_id,
+ H5HF_free_section_t **sec_node);
+H5_DLL herr_t H5HF_man_iblock_alloc_indirect(H5HF_hdr_t *hdr, hid_t dxpl_id,
+ H5HF_free_section_t **sec_node);
+H5_DLL herr_t H5HF_man_iblock_alloc_opaque(H5HF_hdr_t *hdr, hid_t dxpl_id,
+ H5HF_free_section_t **sec_node);
+H5_DLL H5HF_indirect_t *H5HF_man_iblock_protect(H5HF_hdr_t *hdr, hid_t dxpl_id,
+ haddr_t iblock_addr, unsigned iblock_nrows,
+ H5HF_indirect_t *par_iblock, unsigned par_entry,
+ H5AC_protect_t rw);
/* Direct block routines */
-H5_DLL herr_t H5HF_man_dblock_new(H5HF_t *fh, hid_t dxpl_id, size_t request);
-H5_DLL herr_t H5HF_man_dblock_create(hid_t dxpl_id, H5HF_t *hdr,
+H5_DLL herr_t H5HF_man_dblock_new(H5HF_hdr_t *fh, hid_t dxpl_id, size_t request);
+H5_DLL herr_t H5HF_man_dblock_build_freelist(H5HF_direct_t *dblock, haddr_t dblock_addr);
+H5_DLL herr_t H5HF_man_dblock_destroy_freelist(H5HF_direct_t *dblock);
+H5_DLL herr_t H5HF_man_dblock_adj_free(H5HF_direct_t *dblock, ssize_t amt);
+H5_DLL herr_t H5HF_man_dblock_create(hid_t dxpl_id, H5HF_hdr_t *hdr,
H5HF_indirect_t *par_iblock, unsigned par_entry, size_t block_size,
hsize_t block_off, haddr_t *addr_p, H5HF_free_section_t **ret_sec_node);
-H5_DLL herr_t H5HF_man_dblock_adj_free(hid_t dxpl_id, H5HF_direct_t *dblock, ssize_t amt);
-H5_DLL herr_t H5HF_man_dblock_build_freelist(H5HF_direct_t *dblock, haddr_t dblock_addr);
+H5_DLL H5HF_direct_t *H5HF_man_dblock_protect(H5HF_hdr_t *hdr, hid_t dxpl_id,
+ haddr_t dblock_addr, size_t dblock_size,
+ H5HF_indirect_t *par_iblock, unsigned par_entry,
+ H5AC_protect_t rw);
/* Routines for internal operations */
H5_DLL herr_t H5HF_free_section_free_cb(void *item, void UNUSED *key,
void UNUSED *op_data);
-H5_DLL herr_t H5HF_man_find(H5HF_t *fh, hid_t dxpl_id, size_t request,
+H5_DLL herr_t H5HF_man_find(H5HF_hdr_t *fh, hid_t dxpl_id, size_t request,
H5HF_free_section_t **sec_node/*out*/);
-H5_DLL herr_t H5HF_man_insert(H5HF_t *fh, hid_t dxpl_id,
+H5_DLL herr_t H5HF_man_insert(H5HF_hdr_t *fh, hid_t dxpl_id,
H5HF_free_section_t *sec_node, size_t obj_size, const void *obj,
void *id);
-H5_DLL herr_t H5HF_man_read(H5HF_t *fh, hid_t dxpl_id, hsize_t obj_off,
+H5_DLL herr_t H5HF_man_read(H5HF_hdr_t *fh, hid_t dxpl_id, hsize_t obj_off,
size_t obj_len, void *obj);
/* Metadata cache callbacks */
-H5_DLL herr_t H5HF_cache_hdr_dest(H5F_t *f, H5HF_t *fh);
+H5_DLL herr_t H5HF_cache_hdr_dest(H5F_t *f, H5HF_hdr_t *fh);
H5_DLL herr_t H5HF_cache_dblock_dest(H5F_t *f, H5HF_direct_t *dblock);
H5_DLL herr_t H5HF_cache_iblock_dest(H5F_t *f, H5HF_indirect_t *iblock);
@@ -446,24 +493,40 @@ H5_DLL herr_t H5HF_iblock_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr,
FILE *stream, int indent, int fwidth, haddr_t hdr_addr, unsigned nrows);
/* Statistics routines */
-H5_DLL herr_t H5HF_stat_info(H5F_t *f, hid_t dxpl_id, haddr_t fh_addr,
- H5HF_stat_t *stats);
+H5_DLL herr_t H5HF_stat_info(H5HF_t *fh, H5HF_stat_t *stats);
/* Free list routines */
-H5_DLL H5HF_freelist_t * H5HF_flist_create(size_t max_block_size,
+H5_DLL H5HF_freelist_t * H5HF_flist_create(unsigned max_index_bits,
H5SL_operator_t node_free_op);
H5_DLL herr_t H5HF_flist_add(H5HF_freelist_t *flist, void *node, size_t *size_key,
haddr_t *addr_key);
H5_DLL htri_t H5HF_flist_find(H5HF_freelist_t *flist, size_t request,
void **node);
+H5_DLL herr_t H5HF_flist_reset(H5HF_freelist_t *flist);
H5_DLL herr_t H5HF_flist_free(H5HF_freelist_t *flist);
+/* Block iteration routines */
+H5_DLL herr_t H5HF_man_iter_init(H5HF_block_iter_t *biter);
+H5_DLL herr_t H5HF_man_iter_start_offset(H5HF_hdr_t *hdr, hid_t dxpl_id,
+ H5HF_block_iter_t *biter, hsize_t offset);
+H5_DLL herr_t H5HF_man_iter_start_entry(H5HF_hdr_t *hdr, H5HF_block_iter_t *biter,
+ H5HF_indirect_t *iblock, unsigned start_entry);
+H5_DLL herr_t H5HF_man_iter_next(H5HF_hdr_t *hdr, H5HF_block_iter_t *biter,
+ unsigned nentries);
+H5_DLL herr_t H5HF_man_iter_up(H5HF_block_iter_t *biter);
+H5_DLL herr_t H5HF_man_iter_down(H5HF_block_iter_t *biter, H5HF_indirect_t *iblock);
+H5_DLL herr_t H5HF_man_iter_reset(H5HF_block_iter_t *biter);
+H5_DLL herr_t H5HF_man_iter_update_iblock(H5HF_block_iter_t *biter, H5HF_indirect_t *iblock);
+H5_DLL herr_t H5HF_man_iter_curr(H5HF_block_iter_t *biter, unsigned *row, unsigned *col,
+ unsigned *entry, H5HF_indirect_t **block);
+H5_DLL herr_t H5HF_man_iter_offset(H5HF_hdr_t *hdr, H5HF_block_iter_t *biter,
+ hsize_t *offset);
+H5_DLL hbool_t H5HF_man_iter_ready(H5HF_block_iter_t *biter);
+
/* Testing routines */
#ifdef H5HF_TESTING
-H5_DLL herr_t H5HF_get_cparam_test(H5F_t *f, hid_t dxpl_id, haddr_t fh_addr,
- H5HF_create_t *cparam);
-H5_DLL hsize_t H5HF_get_dblock_free_test(H5F_t *f, hid_t dxpl_id,
- haddr_t fh_addr, unsigned row);
+H5_DLL herr_t H5HF_get_cparam_test(H5HF_t *fh, H5HF_create_t *cparam);
+H5_DLL hsize_t H5HF_get_dblock_free_test(H5HF_t *fh, unsigned row);
#endif /* H5HF_TESTING */
#endif /* _H5HFpkg_H */