diff options
Diffstat (limited to 'src/H5HFpkg.h')
-rw-r--r-- | src/H5HFpkg.h | 869 |
1 files changed, 419 insertions, 450 deletions
diff --git a/src/H5HFpkg.h b/src/H5HFpkg.h index 5324bc4..0cf76dc 100644 --- a/src/H5HFpkg.h +++ b/src/H5HFpkg.h @@ -30,152 +30,153 @@ #include "H5HFprivate.h" /* Other private headers needed by this file */ -#include "H5ACprivate.h" /* Metadata cache */ -#include "H5B2private.h" /* v2 B-trees */ -#include "H5FLprivate.h" /* Free Lists */ -#include "H5FSprivate.h" /* Free space manager */ -#include "H5SLprivate.h" /* Skip lists */ +#include "H5ACprivate.h" /* Metadata cache */ +#include "H5B2private.h" /* v2 B-trees */ +#include "H5FLprivate.h" /* Free Lists */ +#include "H5FSprivate.h" /* Free space manager */ +#include "H5SLprivate.h" /* Skip lists */ /**************************/ /* Package Private Macros */ /**************************/ /* Size of checksum information (on disk) */ -#define H5HF_SIZEOF_CHKSUM 4 +#define H5HF_SIZEOF_CHKSUM 4 /* "Standard" size of prefix information for fractal heap metadata */ -#define H5HF_METADATA_PREFIX_SIZE(c) ( \ - H5_SIZEOF_MAGIC /* Signature */ \ - + (unsigned)1 /* Version */ \ - + ((c) ? (unsigned)H5HF_SIZEOF_CHKSUM : (unsigned)0) /* Metadata checksum */ \ +#define H5HF_METADATA_PREFIX_SIZE(c) \ + (H5_SIZEOF_MAGIC /* Signature */ \ + + (unsigned)1 /* Version */ \ + + ((c) ? (unsigned)H5HF_SIZEOF_CHKSUM : (unsigned)0) /* Metadata checksum */ \ ) /* Size of doubling-table information */ -#define H5HF_DTABLE_INFO_SIZE(h) ( \ - (unsigned)2 /* Width of table (i.e. # of columns) */ \ - + (unsigned)(h)->sizeof_size /* Starting block size */ \ - + (unsigned)(h)->sizeof_size /* Maximum direct block size */ \ - + (unsigned)2 /* Max. size of heap (log2 of actual value - i.e. the # of bits) */ \ - + (unsigned)2 /* Starting # of rows in root indirect block */ \ - + (unsigned)(h)->sizeof_addr /* File address of table managed */ \ - + (unsigned)2 /* Current # of rows in root indirect block */ \ +#define H5HF_DTABLE_INFO_SIZE(h) \ + ((unsigned)2 /* Width of table (i.e. # of columns) */ \ + + (unsigned)(h)->sizeof_size /* Starting block size */ \ + + (unsigned)(h)->sizeof_size /* Maximum direct block size */ \ + + (unsigned)2 /* Max. size of heap (log2 of actual value - i.e. the # of bits) */ \ + + (unsigned)2 /* Starting # of rows in root indirect block */ \ + + (unsigned)(h)->sizeof_addr /* File address of table managed */ \ + + (unsigned)2 /* Current # of rows in root indirect block */ \ ) /* Flags for status byte */ -#define H5HF_HDR_FLAGS_HUGE_ID_WRAPPED 0x01 /* "huge" object IDs have wrapped */ -#define H5HF_HDR_FLAGS_CHECKSUM_DBLOCKS 0x02 /* checksum direct blocks */ +#define H5HF_HDR_FLAGS_HUGE_ID_WRAPPED 0x01 /* "huge" object IDs have wrapped */ +#define H5HF_HDR_FLAGS_CHECKSUM_DBLOCKS 0x02 /* checksum direct blocks */ /* Size of the fractal heap header on disk */ /* (this is the fixed-len portion, the variable-len I/O filter information * follows this information, if there are I/O filters for the heap) */ -#define H5HF_HEADER_SIZE(h) ( \ - /* General metadata fields */ \ - H5HF_METADATA_PREFIX_SIZE(TRUE) \ - \ - /* Fractal Heap Header specific fields */ \ - \ - /* General heap information */ \ - + (unsigned)2 /* Heap ID len */ \ - + (unsigned)2 /* I/O filters' encoded len */ \ - + (unsigned)1 /* Status flags */ \ - \ - /* "Huge" object fields */ \ - + (unsigned)4 /* Max. size of "managed" object */ \ - + (unsigned)(h)->sizeof_size /* Next ID for "huge" object */ \ - + (unsigned)(h)->sizeof_addr /* File address of "huge" object tracker B-tree */ \ - \ - /* "Managed" object free space fields */ \ - + (unsigned)(h)->sizeof_size /* Total man. free space */ \ - + (unsigned)(h)->sizeof_addr /* File address of free section header */ \ - \ - /* Statistics fields */ \ - + (unsigned)(h)->sizeof_size /* Size of man. space in heap */ \ - + (unsigned)(h)->sizeof_size /* Size of man. space iterator offset in heap */ \ - + (unsigned)(h)->sizeof_size /* Size of alloacted man. space in heap */ \ - + (unsigned)(h)->sizeof_size /* Number of man. objects in heap */ \ - + (unsigned)(h)->sizeof_size /* Size of huge space in heap */ \ - + (unsigned)(h)->sizeof_size /* Number of huge objects in heap */ \ - + (unsigned)(h)->sizeof_size /* Size of tiny space in heap */ \ - + (unsigned)(h)->sizeof_size /* Number of tiny objects in heap */ \ - \ - /* "Managed" object doubling table info */ \ - + H5HF_DTABLE_INFO_SIZE(h) /* Size of managed obj. doubling-table info */ \ +#define H5HF_HEADER_SIZE(h) \ + (/* General metadata fields */ \ + H5HF_METADATA_PREFIX_SIZE(TRUE) \ + \ + /* Fractal Heap Header specific fields */ \ + \ + /* General heap information */ \ + + (unsigned)2 /* Heap ID len */ \ + + (unsigned)2 /* I/O filters' encoded len */ \ + + (unsigned)1 /* Status flags */ \ + \ + /* "Huge" object fields */ \ + + (unsigned)4 /* Max. size of "managed" object */ \ + + (unsigned)(h)->sizeof_size /* Next ID for "huge" object */ \ + + (unsigned)(h)->sizeof_addr /* File address of "huge" object tracker B-tree */ \ + \ + /* "Managed" object free space fields */ \ + + (unsigned)(h)->sizeof_size /* Total man. free space */ \ + + (unsigned)(h)->sizeof_addr /* File address of free section header */ \ + \ + /* Statistics fields */ \ + + (unsigned)(h)->sizeof_size /* Size of man. space in heap */ \ + + (unsigned)(h)->sizeof_size /* Size of man. space iterator offset in heap */ \ + + (unsigned)(h)->sizeof_size /* Size of alloacted man. space in heap */ \ + + (unsigned)(h)->sizeof_size /* Number of man. objects in heap */ \ + + (unsigned)(h)->sizeof_size /* Size of huge space in heap */ \ + + (unsigned)(h)->sizeof_size /* Number of huge objects in heap */ \ + + (unsigned)(h)->sizeof_size /* Size of tiny space in heap */ \ + + (unsigned)(h)->sizeof_size /* Number of tiny objects in heap */ \ + \ + /* "Managed" object doubling table info */ \ + + H5HF_DTABLE_INFO_SIZE(h) /* Size of managed obj. doubling-table info */ \ ) /* Size of overhead for a direct block */ -#define H5HF_MAN_ABS_DIRECT_OVERHEAD(h) ( \ - /* General metadata fields */ \ - H5HF_METADATA_PREFIX_SIZE(h->checksum_dblocks) \ - \ - /* Fractal heap managed, absolutely mapped direct block specific fields */ \ - + (unsigned)(h)->sizeof_addr /* File address of heap owning the block */ \ - + (unsigned)(h)->heap_off_size /* Offset of the block in the heap */ \ +#define H5HF_MAN_ABS_DIRECT_OVERHEAD(h) \ + (/* General metadata fields */ \ + H5HF_METADATA_PREFIX_SIZE(h->checksum_dblocks) \ + \ + /* Fractal heap managed, absolutely mapped direct block specific fields */ \ + + (unsigned)(h)->sizeof_addr /* File address of heap owning the block */ \ + + (unsigned)(h)->heap_off_size /* Offset of the block in the heap */ \ ) /* Size of managed indirect block entry for a child direct block */ -#define H5HF_MAN_INDIRECT_CHILD_DIR_ENTRY_SIZE(h) ( \ - ((h)->filter_len > 0 ? \ - ((unsigned)(h)->sizeof_addr + (unsigned)(h)->sizeof_size + (unsigned)4) : /* Size of entries for filtered direct blocks */ \ - (unsigned)(h)->sizeof_addr) /* Size of entries for un-filtered direct blocks */ \ +#define H5HF_MAN_INDIRECT_CHILD_DIR_ENTRY_SIZE(h) \ + (((h)->filter_len > 0 ? ((unsigned)(h)->sizeof_addr + (unsigned)(h)->sizeof_size + (unsigned)4) \ + : /* Size of entries for filtered direct blocks */ \ + (unsigned)(h)->sizeof_addr) /* Size of entries for un-filtered direct blocks */ \ ) /* Size of managed indirect block */ -#define H5HF_MAN_INDIRECT_SIZE(h, r) ( \ - /* General metadata fields */ \ - H5HF_METADATA_PREFIX_SIZE(TRUE) \ - \ - /* Fractal heap managed, absolutely mapped indirect block specific fields */ \ - + (unsigned)(h)->sizeof_addr /* File address of heap owning the block */ \ - + (unsigned)(h)->heap_off_size /* Offset of the block in the heap */ \ - + (MIN(r, (h)->man_dtable.max_direct_rows) * (h)->man_dtable.cparam.width * H5HF_MAN_INDIRECT_CHILD_DIR_ENTRY_SIZE(h)) /* Size of entries for direct blocks */ \ - + (((r > (h)->man_dtable.max_direct_rows) ? (r - (h)->man_dtable.max_direct_rows) : 0) * (h)->man_dtable.cparam.width * (h)->sizeof_addr) /* Size of entries for indirect blocks */ \ +#define H5HF_MAN_INDIRECT_SIZE(h, r) \ + (/* General metadata fields */ \ + H5HF_METADATA_PREFIX_SIZE(TRUE) \ + \ + /* Fractal heap managed, absolutely mapped indirect block specific fields */ \ + + (unsigned)(h)->sizeof_addr /* File address of heap owning the block */ \ + + (unsigned)(h)->heap_off_size /* Offset of the block in the heap */ \ + + (MIN(r, (h)->man_dtable.max_direct_rows) * (h)->man_dtable.cparam.width * \ + H5HF_MAN_INDIRECT_CHILD_DIR_ENTRY_SIZE(h)) /* Size of entries for direct blocks */ \ + + (((r > (h)->man_dtable.max_direct_rows) ? (r - (h)->man_dtable.max_direct_rows) : 0) * \ + (h)->man_dtable.cparam.width * (h)->sizeof_addr) /* Size of entries for indirect blocks */ \ ) /* Compute the # of bytes required to store an offset into a given buffer size */ -#define H5HF_SIZEOF_OFFSET_BITS(b) (((b) + 7) / 8) -#define H5HF_SIZEOF_OFFSET_LEN(l) H5HF_SIZEOF_OFFSET_BITS(H5VM_log2_of2((unsigned)(l))) +#define H5HF_SIZEOF_OFFSET_BITS(b) (((b) + 7) / 8) +#define H5HF_SIZEOF_OFFSET_LEN(l) H5HF_SIZEOF_OFFSET_BITS(H5VM_log2_of2((unsigned)(l))) /* Heap ID bit flags */ /* Heap ID version (2 bits: 6-7) */ -#define H5HF_ID_VERS_CURR 0x00 /* Current version of ID format */ -#define H5HF_ID_VERS_MASK 0xC0 /* Mask for getting the ID version from flags */ +#define H5HF_ID_VERS_CURR 0x00 /* Current version of ID format */ +#define H5HF_ID_VERS_MASK 0xC0 /* Mask for getting the ID version from flags */ /* Heap ID type (2 bits: 4-5) */ -#define H5HF_ID_TYPE_MAN 0x00 /* "Managed" object - stored in fractal heap blocks */ -#define H5HF_ID_TYPE_HUGE 0x10 /* "Huge" object - stored in file directly */ -#define H5HF_ID_TYPE_TINY 0x20 /* "Tiny" object - stored in heap ID directly */ -#define H5HF_ID_TYPE_RESERVED 0x30 /* "?" object - reserved for future use */ -#define H5HF_ID_TYPE_MASK 0x30 /* Mask for getting the ID type from flags */ +#define H5HF_ID_TYPE_MAN 0x00 /* "Managed" object - stored in fractal heap blocks */ +#define H5HF_ID_TYPE_HUGE 0x10 /* "Huge" object - stored in file directly */ +#define H5HF_ID_TYPE_TINY 0x20 /* "Tiny" object - stored in heap ID directly */ +#define H5HF_ID_TYPE_RESERVED 0x30 /* "?" object - reserved for future use */ +#define H5HF_ID_TYPE_MASK 0x30 /* Mask for getting the ID type from flags */ /* Heap ID bits 0-3 reserved for future use */ /* Encode a "managed" heap ID */ -#define H5HF_MAN_ID_ENCODE(i, h, o, l) \ - *(i) = H5HF_ID_VERS_CURR | H5HF_ID_TYPE_MAN; \ - (i)++; \ - UINT64ENCODE_VAR((i), (o), (h)->heap_off_size); \ +#define H5HF_MAN_ID_ENCODE(i, h, o, l) \ + *(i) = H5HF_ID_VERS_CURR | H5HF_ID_TYPE_MAN; \ + (i)++; \ + UINT64ENCODE_VAR((i), (o), (h)->heap_off_size); \ UINT64ENCODE_VAR((i), (l), (h)->heap_len_size) /* Decode a "managed" heap ID */ -#define H5HF_MAN_ID_DECODE(i, h, f, o, l) \ - f = *(uint8_t *)i++; \ - UINT64DECODE_VAR((i), (o), (h)->heap_off_size); \ +#define H5HF_MAN_ID_DECODE(i, h, f, o, l) \ + f = *(uint8_t *)i++; \ + UINT64DECODE_VAR((i), (o), (h)->heap_off_size); \ UINT64DECODE_VAR((i), (l), (h)->heap_len_size) /* Free space section types for fractal heap */ /* (values stored in free space data structures in file) */ -#define H5HF_FSPACE_SECT_SINGLE 0 /* Section is a range of actual bytes in a direct block */ -#define H5HF_FSPACE_SECT_FIRST_ROW 1 /* Section is first range of blocks in an indirect block row */ -#define H5HF_FSPACE_SECT_NORMAL_ROW 2 /* Section is a range of blocks in an indirect block row */ -#define H5HF_FSPACE_SECT_INDIRECT 3 /* Section is a span of blocks in an indirect block */ +#define H5HF_FSPACE_SECT_SINGLE 0 /* Section is a range of actual bytes in a direct block */ +#define H5HF_FSPACE_SECT_FIRST_ROW 1 /* Section is first range of blocks in an indirect block row */ +#define H5HF_FSPACE_SECT_NORMAL_ROW 2 /* Section is a range of blocks in an indirect block row */ +#define H5HF_FSPACE_SECT_INDIRECT 3 /* Section is a span of blocks in an indirect block */ /* Flags for 'op' operations */ -#define H5HF_OP_MODIFY 0x0001 /* Operation will modify object */ -#define H5HF_OP_FLAGS (H5HF_OP_MODIFY) /* Bit-wise OR of all op flags */ +#define H5HF_OP_MODIFY 0x0001 /* Operation will modify object */ +#define H5HF_OP_FLAGS (H5HF_OP_MODIFY) /* Bit-wise OR of all op flags */ /* Flags for 'root_iblock_flags' field in header */ -#define H5HF_ROOT_IBLOCK_PINNED 0x01 -#define H5HF_ROOT_IBLOCK_PROTECTED 0x02 - +#define H5HF_ROOT_IBLOCK_PINNED 0x01 +#define H5HF_ROOT_IBLOCK_PROTECTED 0x02 /****************************/ /* Package Private Typedefs */ @@ -184,37 +185,37 @@ /* Doubling-table info */ typedef struct H5HF_dtable_t { /* Immutable, pre-set information for table */ - H5HF_dtable_cparam_t cparam; /* Creation parameters for table */ + H5HF_dtable_cparam_t cparam; /* Creation parameters for 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 */ - /* 0 indicates that the TABLE_ADDR field points - * to direct block (of START_BLOCK_SIZE) instead - * of indirect root block. - */ + 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 */ + /* 0 indicates that the TABLE_ADDR field points + * to direct block (of START_BLOCK_SIZE) instead + * of indirect root block. + */ /* Computed information (not stored) */ - unsigned max_root_rows; /* Maximum # of rows in root indirect block */ - unsigned max_direct_rows; /* Maximum # of direct rows in any indirect block */ - unsigned start_bits; /* # of bits for starting block size (i.e. log2(start_block_size)) */ - unsigned max_direct_bits; /* # of bits for max. direct block size (i.e. log2(max_direct_size)) */ - unsigned max_dir_blk_off_size; /* Max. size of offsets in direct blocks */ - unsigned first_row_bits; /* # of bits in address of first row */ - hsize_t num_id_first_row; /* Number of IDs in first row of table */ - hsize_t *row_block_size; /* Block size per row of indirect block */ - hsize_t *row_block_off; /* Cumulative offset per row of indirect block */ - hsize_t *row_tot_dblock_free; /* Total free space in dblocks for this row */ - /* (For indirect block rows, it's the total - * free space in all direct blocks referenced - * from the indirect block) - */ - size_t *row_max_dblock_free; /* Max. free space in dblocks for this row */ - /* (For indirect block rows, it's the maximum - * free space in a direct block referenced - * from the indirect block) - */ + unsigned max_root_rows; /* Maximum # of rows in root indirect block */ + unsigned max_direct_rows; /* Maximum # of direct rows in any indirect block */ + unsigned start_bits; /* # of bits for starting block size (i.e. log2(start_block_size)) */ + unsigned max_direct_bits; /* # of bits for max. direct block size (i.e. log2(max_direct_size)) */ + unsigned max_dir_blk_off_size; /* Max. size of offsets in direct blocks */ + unsigned first_row_bits; /* # of bits in address of first row */ + hsize_t num_id_first_row; /* Number of IDs in first row of table */ + hsize_t *row_block_size; /* Block size per row of indirect block */ + hsize_t *row_block_off; /* Cumulative offset per row of indirect block */ + hsize_t *row_tot_dblock_free; /* Total free space in dblocks for this row */ + /* (For indirect block rows, it's the total + * free space in all direct blocks referenced + * from the indirect block) + */ + size_t *row_max_dblock_free; /* Max. free space in dblocks for this row */ + /* (For indirect block rows, it's the maximum + * free space in a direct block referenced + * from the indirect block) + */ } H5HF_dtable_t; /* Fractal heap free list info (forward decl - defined in H5HFflist.c) */ @@ -223,39 +224,40 @@ typedef struct H5HF_freelist_t H5HF_freelist_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 */ + 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 */ + 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_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 */ + 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; /* Fractal heap free space section info */ typedef struct H5HF_free_section_t { - H5FS_section_info_t sect_info; /* Free space section information (must be first in struct) */ + H5FS_section_info_t sect_info; /* Free space section information (must be first in struct) */ 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 */ + 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 */ } single; struct { - struct H5HF_free_section_t *under; /* Pointer to indirect block underlying row section */ - unsigned row; /* Row for range of blocks */ - unsigned col; /* Column for range of blocks */ - unsigned num_entries; /* Number of entries covered */ + struct H5HF_free_section_t *under; /* Pointer to indirect block underlying row section */ + unsigned row; /* Row for range of blocks */ + unsigned col; /* Column for range of blocks */ + unsigned num_entries; /* Number of entries covered */ /* Fields that aren't stored */ - hbool_t checked_out; /* Flag to indicate that a row section is temporarily out of the free space manager */ + hbool_t checked_out; /* Flag to indicate that a row section is temporarily out of the free space + manager */ } row; struct { /* Holds either a pointer to an indirect block (if its "live") or @@ -265,23 +267,24 @@ typedef struct H5HF_free_section_t { * or not) */ union { - H5HF_indirect_t *iblock; /* Indirect block for free section */ - hsize_t iblock_off; /* Indirect block offset in "heap space" */ + H5HF_indirect_t *iblock; /* Indirect block for free section */ + hsize_t iblock_off; /* Indirect block offset in "heap space" */ } u; - unsigned row; /* Row for range of blocks */ - unsigned col; /* Column for range of blocks */ - unsigned num_entries; /* Number of entries covered */ + unsigned row; /* Row for range of blocks */ + unsigned col; /* Column for range of blocks */ + unsigned num_entries; /* Number of entries covered */ /* Fields that aren't stored */ - struct H5HF_free_section_t *parent; /* Pointer to "parent" indirect section */ - unsigned par_entry; /* Entry within parent indirect section */ - hsize_t span_size; /* Size of space tracked, in "heap space" */ - unsigned iblock_entries; /* Number of entries in indirect block where section is located */ - unsigned rc; /* Reference count of outstanding row & child indirect sections */ - unsigned dir_nrows; /* Number of direct rows in section */ - struct H5HF_free_section_t **dir_rows; /* Array of pointers to outstanding row sections */ - unsigned indir_nents; /* Number of indirect entries in section */ - struct H5HF_free_section_t **indir_ents; /* Array of pointers to outstanding child indirect sections */ + struct H5HF_free_section_t *parent; /* Pointer to "parent" indirect section */ + unsigned par_entry; /* Entry within parent indirect section */ + hsize_t span_size; /* Size of space tracked, in "heap space" */ + unsigned iblock_entries; /* Number of entries in indirect block where section is located */ + unsigned rc; /* Reference count of outstanding row & child indirect sections */ + unsigned dir_nrows; /* Number of direct rows in section */ + struct H5HF_free_section_t **dir_rows; /* Array of pointers to outstanding row sections */ + unsigned indir_nents; /* Number of indirect entries in section */ + struct H5HF_free_section_t * + *indir_ents; /* Array of pointers to outstanding child indirect sections */ } indirect; } u; } H5HF_free_section_t; @@ -295,79 +298,81 @@ struct H5HF_hdr_t { H5AC_info_t cache_info; /* General header information (stored in header) */ - unsigned id_len; /* Size of heap IDs (in bytes) */ - unsigned filter_len; /* Size of I/O filter information (in bytes) */ + unsigned id_len; /* Size of heap IDs (in bytes) */ + unsigned filter_len; /* Size of I/O filter information (in bytes) */ /* Flags for heap settings (stored in status byte in header) */ - hbool_t debug_objs; /* Is the heap storing objects in 'debug' format */ - hbool_t write_once; /* Is heap being written in "write once" mode? */ - hbool_t huge_ids_wrapped; /* Have "huge" object IDs wrapped around? */ - hbool_t checksum_dblocks; /* Should the direct blocks in the heap be checksummed? */ + hbool_t debug_objs; /* Is the heap storing objects in 'debug' format */ + hbool_t write_once; /* Is heap being written in "write once" mode? */ + hbool_t huge_ids_wrapped; /* Have "huge" object IDs wrapped around? */ + hbool_t checksum_dblocks; /* Should the direct blocks in the heap be checksummed? */ /* Doubling table information (partially stored in header) */ /* (Partially set by user, partially derived/updated internally) */ - H5HF_dtable_t man_dtable; /* Doubling-table info for managed objects */ + H5HF_dtable_t man_dtable; /* Doubling-table info for managed objects */ /* Free space information for managed objects (stored in header) */ - hsize_t total_man_free; /* Total amount of free space in managed blocks */ - haddr_t fs_addr; /* Address of free space header on disk */ + hsize_t total_man_free; /* Total amount of free space in managed blocks */ + haddr_t fs_addr; /* Address of free space header on disk */ /* "Huge" object support (stored in header) */ - uint32_t max_man_size; /* Max. size of object to manage in doubling table */ - hsize_t huge_next_id; /* Next ID to use for indirectly tracked 'huge' object */ - haddr_t huge_bt2_addr; /* Address of v2 B-tree for tracking "huge" object info */ + uint32_t max_man_size; /* Max. size of object to manage in doubling table */ + hsize_t huge_next_id; /* Next ID to use for indirectly tracked 'huge' object */ + haddr_t huge_bt2_addr; /* Address of v2 B-tree for tracking "huge" object info */ /* I/O filter support (stored in header, if any are used) */ - H5O_pline_t pline; /* I/O filter pipeline for heap objects */ - size_t pline_root_direct_size; /* Size of filtered root direct block */ + H5O_pline_t pline; /* I/O filter pipeline for heap objects */ + size_t pline_root_direct_size; /* Size of filtered root direct block */ unsigned pline_root_direct_filter_mask; /* I/O filter mask for filtered root direct block */ /* Statistics for heap (stored in header) */ - 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 man_iter_off; /* Offset of iterator in 'managed' heap space */ - hsize_t man_nobjs; /* Number of 'managed' objects in heap */ - hsize_t huge_size; /* Total size of 'huge' objects in heap */ - hsize_t huge_nobjs; /* Number of 'huge' objects in heap */ - hsize_t tiny_size; /* Total size of 'tiny' objects in heap */ - hsize_t tiny_nobjs; /* Number of 'tiny' objects in heap */ + 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 man_iter_off; /* Offset of iterator in 'managed' heap space */ + hsize_t man_nobjs; /* Number of 'managed' objects in heap */ + hsize_t huge_size; /* Total size of 'huge' objects in heap */ + hsize_t huge_nobjs; /* Number of 'huge' objects in heap */ + hsize_t tiny_size; /* Total size of 'tiny' objects in heap */ + hsize_t tiny_nobjs; /* Number of 'tiny' objects in heap */ /* Cached/computed values (not stored in header) */ - size_t rc; /* Reference count of heap's components using heap header */ - haddr_t heap_addr; /* Address of heap header in the file */ - size_t heap_size; /* Size of heap header in the file */ - unsigned mode; /* Access mode for heap */ - H5F_t *f; /* Pointer to file for heap */ - size_t file_rc; /* Reference count of files using heap header */ - hbool_t pending_delete; /* Heap is pending deletion */ - uint8_t sizeof_size; /* Size of file sizes */ - uint8_t sizeof_addr; /* Size of file addresses */ + size_t rc; /* Reference count of heap's components using heap header */ + haddr_t heap_addr; /* Address of heap header in the file */ + size_t heap_size; /* Size of heap header in the file */ + unsigned mode; /* Access mode for heap */ + H5F_t * f; /* Pointer to file for heap */ + size_t file_rc; /* Reference count of files using heap header */ + hbool_t pending_delete; /* Heap is pending deletion */ + uint8_t sizeof_size; /* Size of file sizes */ + uint8_t sizeof_addr; /* Size of file addresses */ struct H5HF_indirect_t *root_iblock; /* Pointer to root indirect block */ - unsigned root_iblock_flags; /* Flags to indicate whether root indirect block is pinned/protected */ - H5FS_t *fspace; /* Free space list for objects in heap */ + unsigned root_iblock_flags; /* Flags to indicate whether root indirect block is pinned/protected */ + H5FS_t * fspace; /* Free space list for objects in heap */ H5HF_block_iter_t next_block; /* Block iterator for searching for next block with space */ - H5B2_t *huge_bt2; /* v2 B-tree handle for huge objects */ - hsize_t huge_max_id; /* Max. 'huge' heap ID before rolling 'huge' heap IDs over */ - uint8_t huge_id_size; /* Size of 'huge' heap IDs (in bytes) */ - hbool_t huge_ids_direct; /* Flag to indicate that 'huge' object's offset & length are stored directly in heap ID */ - size_t tiny_max_len; /* Max. size of tiny objects for this heap */ - hbool_t tiny_len_extended; /* Flag to indicate that 'tiny' object's length is stored in extended form (i.e. w/extra byte) */ - uint8_t heap_off_size; /* Size of heap offsets (in bytes) */ - uint8_t heap_len_size; /* Size of heap ID lengths (in bytes) */ - hbool_t checked_filters; /* TRUE if pipeline passes can_apply checks */ + H5B2_t * huge_bt2; /* v2 B-tree handle for huge objects */ + hsize_t huge_max_id; /* Max. 'huge' heap ID before rolling 'huge' heap IDs over */ + uint8_t huge_id_size; /* Size of 'huge' heap IDs (in bytes) */ + hbool_t huge_ids_direct; /* Flag to indicate that 'huge' object's offset & length are stored directly in + heap ID */ + size_t tiny_max_len; /* Max. size of tiny objects for this heap */ + hbool_t tiny_len_extended; /* Flag to indicate that 'tiny' object's length is stored in extended form + (i.e. w/extra byte) */ + uint8_t heap_off_size; /* Size of heap offsets (in bytes) */ + uint8_t heap_len_size; /* Size of heap ID lengths (in bytes) */ + hbool_t checked_filters; /* TRUE if pipeline passes can_apply checks */ }; /* Common indirect block doubling table entry */ /* (common between entries pointing to direct & indirect child blocks) */ typedef struct H5HF_indirect_ent_t { - haddr_t addr; /* Direct block's address */ + haddr_t addr; /* Direct block's address */ } H5HF_indirect_ent_t; /* Extern indirect block doubling table entry for compressed direct blocks */ /* (only exists for indirect blocks in heaps that have I/O filters) */ typedef struct H5HF_indirect_filt_ent_t { - size_t size; /* Size of child direct block, after passing though I/O filters */ - unsigned filter_mask; /* Excluded filters for child direct block */ + size_t size; /* Size of child direct block, after passing though I/O filters */ + unsigned filter_mask; /* Excluded filters for child direct block */ } H5HF_indirect_filt_ent_t; /* Fractal heap indirect block */ @@ -376,32 +381,32 @@ struct H5HF_indirect_t { H5AC_info_t cache_info; /* Internal heap information (not stored) */ - size_t rc; /* Reference count of objects using this block */ - H5HF_hdr_t *hdr; /* Shared heap header info */ - struct H5HF_indirect_t *parent; /* Shared parent indirect block info */ - void *fd_parent; /* Saved copy of the parent pointer -- this */ - /* necessary as the parent field is sometimes */ - /* nulled out before the eviction notify call */ - /* is made from the metadata cache. Since */ - /* this call cancels flush dependencies, it */ - /* needs this information. */ - unsigned par_entry; /* Entry in parent's table */ - haddr_t addr; /* Address of this indirect block on disk */ - size_t size; /* Size of indirect block on disk */ - unsigned nrows; /* Total # of rows in indirect block */ - unsigned max_rows; /* Max. # of rows in indirect block */ - unsigned nchildren; /* Number of child blocks */ - unsigned max_child; /* Max. offset used in child entries */ - struct H5HF_indirect_t **child_iblocks; /* Array of pointers to pinned child indirect blocks */ - hbool_t removed_from_cache; /* Flag that indicates the block has */ - /* been removed from the metadata cache, but */ - /* is still 'live' due to a refcount (rc) > 0 */ - /* (usually from free space sections) */ + size_t rc; /* Reference count of objects using this block */ + H5HF_hdr_t * hdr; /* Shared heap header info */ + struct H5HF_indirect_t *parent; /* Shared parent indirect block info */ + void * fd_parent; /* Saved copy of the parent pointer -- this */ + /* necessary as the parent field is sometimes */ + /* nulled out before the eviction notify call */ + /* is made from the metadata cache. Since */ + /* this call cancels flush dependencies, it */ + /* needs this information. */ + unsigned par_entry; /* Entry in parent's table */ + haddr_t addr; /* Address of this indirect block on disk */ + size_t size; /* Size of indirect block on disk */ + unsigned nrows; /* Total # of rows in indirect block */ + unsigned max_rows; /* Max. # of rows in indirect block */ + unsigned nchildren; /* Number of child blocks */ + unsigned max_child; /* Max. offset used in child entries */ + struct H5HF_indirect_t **child_iblocks; /* Array of pointers to pinned child indirect blocks */ + hbool_t removed_from_cache; /* Flag that indicates the block has */ + /* been removed from the metadata cache, but */ + /* is still 'live' due to a refcount (rc) > 0 */ + /* (usually from free space sections) */ /* Stored values */ - hsize_t block_off; /* Offset of the block within the heap's address space */ - H5HF_indirect_ent_t *ents; /* Pointer to block entry table */ - H5HF_indirect_filt_ent_t *filt_ents; /* Pointer to filtered information for direct blocks */ + hsize_t block_off; /* Offset of the block within the heap's address space */ + H5HF_indirect_ent_t * ents; /* Pointer to block entry table */ + H5HF_indirect_filt_ent_t *filt_ents; /* Pointer to filtered information for direct blocks */ }; /* A fractal heap direct block */ @@ -410,146 +415,145 @@ typedef struct H5HF_direct_t { H5AC_info_t cache_info; /* Internal heap information */ - H5HF_hdr_t *hdr; /* Shared heap header info */ - H5HF_indirect_t *parent; /* Shared parent indirect block info */ - void *fd_parent; /* Saved copy of the parent pointer -- this */ - /* necessary as the parent field is sometimes */ - /* nulled out before the eviction notify call */ - /* is made from the metadata cache. Since */ - /* this call cancels flush dependencies, it */ - /* needs this information. */ - unsigned par_entry; /* Entry in parent's table */ - size_t size; /* Size of direct block */ - hsize_t file_size; /* Size of direct block in file (only valid when block's space is being freed) */ - uint8_t *blk; /* Pointer to buffer containing block data */ - uint8_t *write_buf; /* Pointer to buffer containing the block data */ - /* in form ready to copy to the metadata */ - /* cache's image buffer. */ - /* */ - /* This field is used by */ - /* H5HF_cache_dblock_pre_serialize() to pass */ - /* the serialized image of the direct block to */ - /* H5HF_cache_dblock_serialize(). It should */ - /* NULL at all other times. */ - /* */ - /* If I/O filters are enabled, the pre- */ - /* the pre-serialize function will allocate */ - /* a buffer, copy the filtered version of the */ - /* direct block image into it, and place the */ - /* base address of the buffer in this field. */ - /* The serialize function must discard this */ - /* buffer after it copies the contents into */ - /* the image buffer provided by the metadata */ - /* cache. */ - /* */ - /* If I/O filters are not enabled, the */ - /* write_buf field is simply set equal to the */ - /* blk field by the pre-serialize function, */ - /* and back to NULL by the serialize function. */ - size_t write_size; /* size of the buffer pointed to by write_buf. */ + H5HF_hdr_t * hdr; /* Shared heap header info */ + H5HF_indirect_t *parent; /* Shared parent indirect block info */ + void * fd_parent; /* Saved copy of the parent pointer -- this */ + /* necessary as the parent field is sometimes */ + /* nulled out before the eviction notify call */ + /* is made from the metadata cache. Since */ + /* this call cancels flush dependencies, it */ + /* needs this information. */ + unsigned par_entry; /* Entry in parent's table */ + size_t size; /* Size of direct block */ + hsize_t file_size; /* Size of direct block in file (only valid when block's space is being freed) */ + uint8_t *blk; /* Pointer to buffer containing block data */ + uint8_t *write_buf; /* Pointer to buffer containing the block data */ + /* in form ready to copy to the metadata */ + /* cache's image buffer. */ + /* */ + /* This field is used by */ + /* H5HF_cache_dblock_pre_serialize() to pass */ + /* the serialized image of the direct block to */ + /* H5HF_cache_dblock_serialize(). It should */ + /* NULL at all other times. */ + /* */ + /* If I/O filters are enabled, the pre- */ + /* the pre-serialize function will allocate */ + /* a buffer, copy the filtered version of the */ + /* direct block image into it, and place the */ + /* base address of the buffer in this field. */ + /* The serialize function must discard this */ + /* buffer after it copies the contents into */ + /* the image buffer provided by the metadata */ + /* cache. */ + /* */ + /* If I/O filters are not enabled, the */ + /* write_buf field is simply set equal to the */ + /* blk field by the pre-serialize function, */ + /* and back to NULL by the serialize function. */ + size_t write_size; /* size of the buffer pointed to by write_buf. */ /* Stored values */ - hsize_t block_off; /* Offset of the block within the heap's address space */ + hsize_t block_off; /* Offset of the block within the heap's address space */ } H5HF_direct_t; /* Fractal heap */ struct H5HF_t { - H5HF_hdr_t *hdr; /* Pointer to internal fractal heap header info */ - H5F_t *f; /* Pointer to file for heap */ + H5HF_hdr_t *hdr; /* Pointer to internal fractal heap header info */ + H5F_t * f; /* Pointer to file for heap */ }; /* 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_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; /* Typedef for indirectly accessed 'huge' object's records in the v2 B-tree */ typedef struct H5HF_huge_bt2_indir_rec_t { - haddr_t addr; /* Address of the object in the file */ - hsize_t len; /* Length of the object in the file */ - hsize_t id; /* ID used for object (not used for 'huge' objects directly accessed) */ + haddr_t addr; /* Address of the object in the file */ + hsize_t len; /* Length of the object in the file */ + hsize_t id; /* ID used for object (not used for 'huge' objects directly accessed) */ } H5HF_huge_bt2_indir_rec_t; /* Typedef for indirectly accessed, filtered 'huge' object's records in the v2 B-tree */ typedef struct H5HF_huge_bt2_filt_indir_rec_t { - haddr_t addr; /* Address of the filtered object in the file */ - hsize_t len; /* Length of the filtered object in the file */ - unsigned filter_mask; /* I/O pipeline filter mask for filtered object in the file */ - hsize_t obj_size; /* Size of the de-filtered object in memory */ - hsize_t id; /* ID used for object (not used for 'huge' objects directly accessed) */ + haddr_t addr; /* Address of the filtered object in the file */ + hsize_t len; /* Length of the filtered object in the file */ + unsigned filter_mask; /* I/O pipeline filter mask for filtered object in the file */ + hsize_t obj_size; /* Size of the de-filtered object in memory */ + hsize_t id; /* ID used for object (not used for 'huge' objects directly accessed) */ } H5HF_huge_bt2_filt_indir_rec_t; /* Typedef for directly accessed 'huge' object's records in the v2 B-tree */ typedef struct H5HF_huge_bt2_dir_rec_t { - haddr_t addr; /* Address of the object in the file */ - hsize_t len; /* Length of the object in the file */ + haddr_t addr; /* Address of the object in the file */ + hsize_t len; /* Length of the object in the file */ } H5HF_huge_bt2_dir_rec_t; /* Typedef for directly accessed, filtered 'huge' object's records in the v2 B-tree */ typedef struct H5HF_huge_bt2_filt_dir_rec_t { - haddr_t addr; /* Address of the filtered object in the file */ - hsize_t len; /* Length of the filtered object in the file */ - unsigned filter_mask; /* I/O pipeline filter mask for filtered object in the file */ - hsize_t obj_size; /* Size of the de-filtered object in memory */ + haddr_t addr; /* Address of the filtered object in the file */ + hsize_t len; /* Length of the filtered object in the file */ + unsigned filter_mask; /* I/O pipeline filter mask for filtered object in the file */ + hsize_t obj_size; /* Size of the de-filtered object in memory */ } H5HF_huge_bt2_filt_dir_rec_t; /* User data for free space section 'add' callback */ typedef struct { - H5HF_hdr_t *hdr; /* Fractal heap header */ + H5HF_hdr_t *hdr; /* Fractal heap header */ } H5HF_sect_add_ud_t; /* User data for v2 B-tree 'remove' callback on 'huge' objects */ typedef struct { - H5HF_hdr_t *hdr; /* Fractal heap header (in) */ - hsize_t obj_len; /* Length of object removed (out) */ + H5HF_hdr_t *hdr; /* Fractal heap header (in) */ + hsize_t obj_len; /* Length of object removed (out) */ } H5HF_huge_remove_ud_t; /* User data for fractal heap header cache client callback */ typedef struct H5HF_hdr_cache_ud_t { - H5F_t *f; /* File pointer */ + H5F_t *f; /* File pointer */ } H5HF_hdr_cache_ud_t; /* User data for fractal heap indirect block cache client callbacks */ typedef struct H5HF_iblock_cache_ud_t { - H5HF_parent_t * par_info; /* Parent info */ - H5F_t * f; /* File pointer */ - const unsigned *nrows; /* Number of rows */ + H5HF_parent_t * par_info; /* Parent info */ + H5F_t * f; /* File pointer */ + const unsigned *nrows; /* Number of rows */ } H5HF_iblock_cache_ud_t; /* User data for fractal heap direct block cache client callbacks */ typedef struct H5HF_dblock_cache_ud_t { - H5HF_parent_t par_info; /* Parent info */ - H5F_t * f; /* File pointer */ - size_t odi_size; /* On disk image size of the direct block. - * Note that there is no necessary relation - * between this value, and the actual - * direct block size, as conpression may - * reduce the size of the on disk image, - * and check sums may increase it. - */ - size_t dblock_size; /* size of the direct block, which bears - * no necessary relation to the block - * odi_size -- the size of the on disk - * image of the block. Note that the - * metadata cache is only interested - * in the odi_size, and thus it is this - * value that is passed to the cache in - * calls to it. - */ - unsigned filter_mask; /* Excluded filters for direct block */ - uint8_t *dblk; /* Pointer to the buffer containing the decompressed - * direct block data obtained in verify_chksum callback. - * It will be used later in deserialize callback. - */ + H5HF_parent_t par_info; /* Parent info */ + H5F_t * f; /* File pointer */ + size_t odi_size; /* On disk image size of the direct block. + * Note that there is no necessary relation + * between this value, and the actual + * direct block size, as conpression may + * reduce the size of the on disk image, + * and check sums may increase it. + */ + size_t dblock_size; /* size of the direct block, which bears + * no necessary relation to the block + * odi_size -- the size of the on disk + * image of the block. Note that the + * metadata cache is only interested + * in the odi_size, and thus it is this + * value that is passed to the cache in + * calls to it. + */ + unsigned filter_mask; /* Excluded filters for direct block */ + uint8_t *dblk; /* Pointer to the buffer containing the decompressed + * direct block data obtained in verify_chksum callback. + * It will be used later in deserialize callback. + */ htri_t decompressed; /* Indicate that the direct block has been * decompressed in verify_chksum callback. * It will be used later in deserialize callback. */ } H5HF_dblock_cache_ud_t; - /*****************************/ /* Package Private Variables */ /*****************************/ @@ -597,122 +601,102 @@ H5FL_EXTERN(H5HF_direct_t); /* Declare a free list to manage heap direct block data to/from disk */ H5FL_BLK_EXTERN(direct_block); - /******************************/ /* Package Private Prototypes */ /******************************/ /* 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 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(const H5HF_dtable_t *dtable, size_t block_size); H5_DLL unsigned H5HF__dtable_size_to_rows(const H5HF_dtable_t *dtable, hsize_t size); -H5_DLL hsize_t H5HF__dtable_span_size(const H5HF_dtable_t *dtable, unsigned start_row, - unsigned start_col, unsigned num_entries); +H5_DLL hsize_t H5HF__dtable_span_size(const H5HF_dtable_t *dtable, unsigned start_row, unsigned start_col, + unsigned num_entries); /* Heap header routines */ -H5_DLL H5HF_hdr_t * H5HF__hdr_alloc(H5F_t *f); -H5_DLL haddr_t H5HF__hdr_create(H5F_t *f, const H5HF_create_t *cparam); +H5_DLL H5HF_hdr_t *H5HF__hdr_alloc(H5F_t *f); +H5_DLL haddr_t H5HF__hdr_create(H5F_t *f, const H5HF_create_t *cparam); H5_DLL H5HF_hdr_t *H5HF__hdr_protect(H5F_t *f, haddr_t addr, unsigned flags); -H5_DLL herr_t H5HF__hdr_finish_init_phase1(H5HF_hdr_t *hdr); -H5_DLL herr_t H5HF__hdr_finish_init_phase2(H5HF_hdr_t *hdr); -H5_DLL herr_t H5HF__hdr_finish_init(H5HF_hdr_t *hdr); -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_fuse_incr(H5HF_hdr_t *hdr); -H5_DLL size_t H5HF__hdr_fuse_decr(H5HF_hdr_t *hdr); -H5_DLL herr_t H5HF__hdr_dirty(H5HF_hdr_t *hdr); -H5_DLL herr_t H5HF__hdr_adj_free(H5HF_hdr_t *hdr, ssize_t amt); -H5_DLL herr_t H5HF__hdr_adjust_heap(H5HF_hdr_t *hdr, hsize_t new_size, hssize_t extra_free); -H5_DLL herr_t H5HF__hdr_inc_alloc(H5HF_hdr_t *hdr, size_t alloc_size); -H5_DLL herr_t H5HF__hdr_start_iter(H5HF_hdr_t *hdr, H5HF_indirect_t *iblock, hsize_t curr_off, unsigned curr_entry); -H5_DLL herr_t H5HF__hdr_skip_blocks(H5HF_hdr_t *hdr, H5HF_indirect_t *iblock, - unsigned start_entry, unsigned nentries); -H5_DLL herr_t H5HF__hdr_update_iter(H5HF_hdr_t *hdr, size_t min_dblock_size); -H5_DLL herr_t H5HF__hdr_inc_iter(H5HF_hdr_t *hdr, hsize_t adv_size, unsigned nentries); -H5_DLL herr_t H5HF__hdr_reverse_iter(H5HF_hdr_t *hdr, haddr_t dblock_addr); -H5_DLL herr_t H5HF__hdr_reset_iter(H5HF_hdr_t *hdr, hsize_t curr_off); -H5_DLL herr_t H5HF__hdr_empty(H5HF_hdr_t *hdr); -H5_DLL herr_t H5HF__hdr_free(H5HF_hdr_t *hdr); -H5_DLL herr_t H5HF__hdr_delete(H5HF_hdr_t *hdr); +H5_DLL herr_t H5HF__hdr_finish_init_phase1(H5HF_hdr_t *hdr); +H5_DLL herr_t H5HF__hdr_finish_init_phase2(H5HF_hdr_t *hdr); +H5_DLL herr_t H5HF__hdr_finish_init(H5HF_hdr_t *hdr); +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_fuse_incr(H5HF_hdr_t *hdr); +H5_DLL size_t H5HF__hdr_fuse_decr(H5HF_hdr_t *hdr); +H5_DLL herr_t H5HF__hdr_dirty(H5HF_hdr_t *hdr); +H5_DLL herr_t H5HF__hdr_adj_free(H5HF_hdr_t *hdr, ssize_t amt); +H5_DLL herr_t H5HF__hdr_adjust_heap(H5HF_hdr_t *hdr, hsize_t new_size, hssize_t extra_free); +H5_DLL herr_t H5HF__hdr_inc_alloc(H5HF_hdr_t *hdr, size_t alloc_size); +H5_DLL herr_t H5HF__hdr_start_iter(H5HF_hdr_t *hdr, H5HF_indirect_t *iblock, hsize_t curr_off, + unsigned curr_entry); +H5_DLL herr_t H5HF__hdr_skip_blocks(H5HF_hdr_t *hdr, H5HF_indirect_t *iblock, unsigned start_entry, + unsigned nentries); +H5_DLL herr_t H5HF__hdr_update_iter(H5HF_hdr_t *hdr, size_t min_dblock_size); +H5_DLL herr_t H5HF__hdr_inc_iter(H5HF_hdr_t *hdr, hsize_t adv_size, unsigned nentries); +H5_DLL herr_t H5HF__hdr_reverse_iter(H5HF_hdr_t *hdr, haddr_t dblock_addr); +H5_DLL herr_t H5HF__hdr_reset_iter(H5HF_hdr_t *hdr, hsize_t curr_off); +H5_DLL herr_t H5HF__hdr_empty(H5HF_hdr_t *hdr); +H5_DLL herr_t H5HF__hdr_free(H5HF_hdr_t *hdr); +H5_DLL herr_t H5HF__hdr_delete(H5HF_hdr_t *hdr); /* Indirect block routines */ 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(H5HF_indirect_t *iblock); -H5_DLL herr_t H5HF__man_iblock_root_create(H5HF_hdr_t *hdr, - size_t min_dblock_size); -H5_DLL herr_t H5HF__man_iblock_root_double(H5HF_hdr_t *hdr, - size_t min_dblock_size); -H5_DLL herr_t H5HF__man_iblock_alloc_row(H5HF_hdr_t *hdr, - H5HF_free_section_t **sec_node); -H5_DLL herr_t H5HF__man_iblock_create(H5HF_hdr_t *hdr, H5HF_indirect_t *par_iblock, - unsigned par_entry, unsigned nrows, unsigned max_rows, haddr_t *addr_p); -H5_DLL H5HF_indirect_t *H5HF__man_iblock_protect(H5HF_hdr_t *hdr, haddr_t iblock_addr, - unsigned iblock_nrows, H5HF_indirect_t *par_iblock, unsigned par_entry, - hbool_t must_protect, unsigned flags, hbool_t *did_protect); -H5_DLL herr_t H5HF__man_iblock_unprotect(H5HF_indirect_t *iblock, unsigned cache_flags, - hbool_t did_protect); -H5_DLL herr_t H5HF__man_iblock_attach(H5HF_indirect_t *iblock, unsigned entry, - haddr_t dblock_addr); +H5_DLL herr_t H5HF__man_iblock_root_create(H5HF_hdr_t *hdr, size_t min_dblock_size); +H5_DLL herr_t H5HF__man_iblock_root_double(H5HF_hdr_t *hdr, size_t min_dblock_size); +H5_DLL herr_t H5HF__man_iblock_alloc_row(H5HF_hdr_t *hdr, H5HF_free_section_t **sec_node); +H5_DLL herr_t H5HF__man_iblock_create(H5HF_hdr_t *hdr, H5HF_indirect_t *par_iblock, unsigned par_entry, + unsigned nrows, unsigned max_rows, haddr_t *addr_p); +H5_DLL H5HF_indirect_t *H5HF__man_iblock_protect(H5HF_hdr_t *hdr, haddr_t iblock_addr, unsigned iblock_nrows, + H5HF_indirect_t *par_iblock, unsigned par_entry, + hbool_t must_protect, unsigned flags, hbool_t *did_protect); +H5_DLL herr_t H5HF__man_iblock_unprotect(H5HF_indirect_t *iblock, unsigned cache_flags, hbool_t did_protect); +H5_DLL herr_t H5HF__man_iblock_attach(H5HF_indirect_t *iblock, unsigned entry, haddr_t dblock_addr); H5_DLL herr_t H5HF__man_iblock_detach(H5HF_indirect_t *iblock, unsigned entry); -H5_DLL herr_t H5HF__man_iblock_entry_addr(H5HF_indirect_t *iblock, unsigned entry, - haddr_t *child_addr); -H5_DLL herr_t H5HF__man_iblock_delete(H5HF_hdr_t *hdr, haddr_t iblock_addr, - unsigned iblock_nrows, H5HF_indirect_t *par_iblock, unsigned par_entry); -H5_DLL herr_t H5HF__man_iblock_size(H5F_t *f, H5HF_hdr_t *hdr, - haddr_t iblock_addr, unsigned nrows, H5HF_indirect_t *par_iblock, unsigned par_entry, hsize_t *heap_size/*out*/); -H5_DLL herr_t H5HF__man_iblock_parent_info(const H5HF_hdr_t *hdr, - hsize_t block_off, hsize_t *ret_par_block_off, unsigned *ret_entry); +H5_DLL herr_t H5HF__man_iblock_entry_addr(H5HF_indirect_t *iblock, unsigned entry, haddr_t *child_addr); +H5_DLL herr_t H5HF__man_iblock_delete(H5HF_hdr_t *hdr, haddr_t iblock_addr, unsigned iblock_nrows, + H5HF_indirect_t *par_iblock, unsigned par_entry); +H5_DLL herr_t H5HF__man_iblock_size(H5F_t *f, H5HF_hdr_t *hdr, haddr_t iblock_addr, unsigned nrows, + H5HF_indirect_t *par_iblock, unsigned par_entry, + hsize_t *heap_size /*out*/); +H5_DLL herr_t H5HF__man_iblock_parent_info(const H5HF_hdr_t *hdr, hsize_t block_off, + hsize_t *ret_par_block_off, unsigned *ret_entry); H5_DLL herr_t H5HF__man_iblock_dest(H5HF_indirect_t *iblock); /* Direct block routines */ -H5_DLL herr_t H5HF__man_dblock_new(H5HF_hdr_t *fh, size_t request, - H5HF_free_section_t **ret_sec_node); -H5_DLL herr_t H5HF__man_dblock_create(H5HF_hdr_t *hdr, - H5HF_indirect_t *par_iblock, unsigned par_entry, haddr_t *addr_p, - H5HF_free_section_t **ret_sec_node); -H5_DLL herr_t H5HF__man_dblock_destroy(H5HF_hdr_t *hdr, H5HF_direct_t *dblock, - haddr_t dblock_addr, hbool_t *parent_removed); -H5_DLL H5HF_direct_t *H5HF__man_dblock_protect(H5HF_hdr_t *hdr, haddr_t dblock_addr, - size_t dblock_size, H5HF_indirect_t *par_iblock, unsigned par_entry, - unsigned flags); -H5_DLL herr_t H5HF__man_dblock_locate(H5HF_hdr_t *hdr, hsize_t obj_off, - H5HF_indirect_t **par_iblock, unsigned *par_entry, hbool_t *par_did_protect, - unsigned flags); -H5_DLL herr_t H5HF__man_dblock_delete(H5F_t *f, haddr_t dblock_addr, - hsize_t dblock_size); -H5_DLL herr_t H5HF__man_dblock_dest(H5HF_direct_t *dblock); +H5_DLL herr_t H5HF__man_dblock_new(H5HF_hdr_t *fh, size_t request, H5HF_free_section_t **ret_sec_node); +H5_DLL herr_t H5HF__man_dblock_create(H5HF_hdr_t *hdr, H5HF_indirect_t *par_iblock, unsigned par_entry, + haddr_t *addr_p, H5HF_free_section_t **ret_sec_node); +H5_DLL herr_t H5HF__man_dblock_destroy(H5HF_hdr_t *hdr, H5HF_direct_t *dblock, haddr_t dblock_addr, + hbool_t *parent_removed); +H5_DLL H5HF_direct_t *H5HF__man_dblock_protect(H5HF_hdr_t *hdr, haddr_t dblock_addr, size_t dblock_size, + H5HF_indirect_t *par_iblock, unsigned par_entry, + unsigned flags); +H5_DLL herr_t H5HF__man_dblock_locate(H5HF_hdr_t *hdr, hsize_t obj_off, H5HF_indirect_t **par_iblock, + unsigned *par_entry, hbool_t *par_did_protect, unsigned flags); +H5_DLL herr_t H5HF__man_dblock_delete(H5F_t *f, haddr_t dblock_addr, hsize_t dblock_size); +H5_DLL herr_t H5HF__man_dblock_dest(H5HF_direct_t *dblock); /* Managed object routines */ -H5_DLL herr_t H5HF__man_insert(H5HF_hdr_t *fh, size_t obj_size, - const void *obj, void *id); -H5_DLL herr_t H5HF__man_get_obj_len(H5HF_hdr_t *hdr, const uint8_t *id, - size_t *obj_len_p); -H5_DLL void H5HF__man_get_obj_off(const H5HF_hdr_t *hdr, const uint8_t *id, - hsize_t *obj_off_p); +H5_DLL herr_t H5HF__man_insert(H5HF_hdr_t *fh, size_t obj_size, const void *obj, void *id); +H5_DLL herr_t H5HF__man_get_obj_len(H5HF_hdr_t *hdr, const uint8_t *id, size_t *obj_len_p); +H5_DLL void H5HF__man_get_obj_off(const H5HF_hdr_t *hdr, const uint8_t *id, hsize_t *obj_off_p); H5_DLL herr_t H5HF__man_read(H5HF_hdr_t *fh, const uint8_t *id, void *obj); H5_DLL herr_t H5HF__man_write(H5HF_hdr_t *hdr, const uint8_t *id, const void *obj); -H5_DLL herr_t H5HF__man_op(H5HF_hdr_t *hdr, const uint8_t *id, H5HF_operator_t op, - void *op_data); +H5_DLL herr_t H5HF__man_op(H5HF_hdr_t *hdr, const uint8_t *id, H5HF_operator_t op, void *op_data); H5_DLL herr_t H5HF__man_remove(H5HF_hdr_t *hdr, const uint8_t *id); /* 'Huge' object routines */ H5_DLL herr_t H5HF__huge_init(H5HF_hdr_t *hdr); -H5_DLL herr_t H5HF__huge_insert(H5HF_hdr_t *hdr, size_t obj_size, - void *obj, void *id); -H5_DLL herr_t H5HF__huge_get_obj_len(H5HF_hdr_t *hdr, const uint8_t *id, - size_t *obj_len_p); -H5_DLL herr_t H5HF__huge_get_obj_off(H5HF_hdr_t *hdr, const uint8_t *id, - hsize_t *obj_off_p); -H5_DLL herr_t H5HF__huge_read(H5HF_hdr_t *fh, const uint8_t *id, - void *obj); -H5_DLL herr_t H5HF__huge_write(H5HF_hdr_t *hdr, const uint8_t *id, - const void *obj); -H5_DLL herr_t H5HF__huge_op(H5HF_hdr_t *hdr, const uint8_t *id, - H5HF_operator_t op, void *op_data); +H5_DLL herr_t H5HF__huge_insert(H5HF_hdr_t *hdr, size_t obj_size, void *obj, void *id); +H5_DLL herr_t H5HF__huge_get_obj_len(H5HF_hdr_t *hdr, const uint8_t *id, size_t *obj_len_p); +H5_DLL herr_t H5HF__huge_get_obj_off(H5HF_hdr_t *hdr, const uint8_t *id, hsize_t *obj_off_p); +H5_DLL herr_t H5HF__huge_read(H5HF_hdr_t *fh, const uint8_t *id, void *obj); +H5_DLL herr_t H5HF__huge_write(H5HF_hdr_t *hdr, const uint8_t *id, const void *obj); +H5_DLL herr_t H5HF__huge_op(H5HF_hdr_t *hdr, const uint8_t *id, H5HF_operator_t op, void *op_data); H5_DLL herr_t H5HF__huge_remove(H5HF_hdr_t *fh, const uint8_t *id); H5_DLL herr_t H5HF__huge_term(H5HF_hdr_t *hdr); H5_DLL herr_t H5HF__huge_delete(H5HF_hdr_t *hdr); @@ -728,62 +712,50 @@ H5_DLL herr_t H5HF__huge_bt2_filt_dir_remove(const void *nrecord, void *op_data) /* 'Tiny' object routines */ H5_DLL herr_t H5HF__tiny_init(H5HF_hdr_t *hdr); -H5_DLL herr_t H5HF__tiny_insert(H5HF_hdr_t *hdr, size_t obj_size, const void *obj, - void *id); -H5_DLL herr_t H5HF__tiny_get_obj_len(H5HF_hdr_t *hdr, const uint8_t *id, - size_t *obj_len_p); +H5_DLL herr_t H5HF__tiny_insert(H5HF_hdr_t *hdr, size_t obj_size, const void *obj, void *id); +H5_DLL herr_t H5HF__tiny_get_obj_len(H5HF_hdr_t *hdr, const uint8_t *id, size_t *obj_len_p); H5_DLL herr_t H5HF__tiny_read(H5HF_hdr_t *fh, const uint8_t *id, void *obj); -H5_DLL herr_t H5HF__tiny_op(H5HF_hdr_t *hdr, const uint8_t *id, - H5HF_operator_t op, void *op_data); +H5_DLL herr_t H5HF__tiny_op(H5HF_hdr_t *hdr, const uint8_t *id, H5HF_operator_t op, void *op_data); H5_DLL herr_t H5HF__tiny_remove(H5HF_hdr_t *fh, const uint8_t *id); /* 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, 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_set_entry(const H5HF_hdr_t *hdr, - H5HF_block_iter_t *biter, unsigned 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_curr(H5HF_block_iter_t *biter, unsigned *row, unsigned *col, - unsigned *entry, H5HF_indirect_t **block); +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, 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_set_entry(const H5HF_hdr_t *hdr, H5HF_block_iter_t *biter, unsigned 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_curr(H5HF_block_iter_t *biter, unsigned *row, unsigned *col, unsigned *entry, + H5HF_indirect_t **block); H5_DLL hbool_t H5HF__man_iter_ready(H5HF_block_iter_t *biter); /* Free space manipulation routines */ H5_DLL herr_t H5HF__space_start(H5HF_hdr_t *hdr, hbool_t may_create); -H5_DLL herr_t H5HF__space_add(H5HF_hdr_t *hdr, H5HF_free_section_t *node, - unsigned flags); -H5_DLL htri_t H5HF__space_find(H5HF_hdr_t *hdr, hsize_t request, - H5HF_free_section_t **node); +H5_DLL herr_t H5HF__space_add(H5HF_hdr_t *hdr, H5HF_free_section_t *node, unsigned flags); +H5_DLL htri_t H5HF__space_find(H5HF_hdr_t *hdr, hsize_t request, H5HF_free_section_t **node); H5_DLL herr_t H5HF__space_revert_root(const H5HF_hdr_t *hdr); -H5_DLL herr_t H5HF__space_create_root(const H5HF_hdr_t *hdr, - H5HF_indirect_t *root_iblock); +H5_DLL herr_t H5HF__space_create_root(const H5HF_hdr_t *hdr, H5HF_indirect_t *root_iblock); H5_DLL herr_t H5HF__space_size(H5HF_hdr_t *hdr, hsize_t *fs_size); H5_DLL herr_t H5HF__space_remove(H5HF_hdr_t *hdr, H5HF_free_section_t *node); H5_DLL herr_t H5HF__space_close(H5HF_hdr_t *hdr); H5_DLL herr_t H5HF__space_delete(H5HF_hdr_t *hdr); -H5_DLL herr_t H5HF__space_sect_change_class(H5HF_hdr_t *hdr, - H5HF_free_section_t *sect, uint16_t new_class); +H5_DLL herr_t H5HF__space_sect_change_class(H5HF_hdr_t *hdr, H5HF_free_section_t *sect, uint16_t new_class); /* Free space section routines */ -H5_DLL H5HF_free_section_t *H5HF__sect_single_new(hsize_t sect_off, - size_t sect_size, H5HF_indirect_t *parent, unsigned par_entry); -H5_DLL herr_t H5HF__sect_single_revive(H5HF_hdr_t *hdr, H5HF_free_section_t *sect); -H5_DLL herr_t H5HF__sect_single_dblock_info(H5HF_hdr_t *hdr, - const H5HF_free_section_t *sect, haddr_t *dblock_addr, size_t *dblock_size); -H5_DLL herr_t H5HF__sect_single_reduce(H5HF_hdr_t *hdr, H5HF_free_section_t *sect, - size_t amt); -H5_DLL herr_t H5HF__sect_row_revive(H5HF_hdr_t *hdr, H5HF_free_section_t *sect); -H5_DLL herr_t H5HF__sect_row_reduce(H5HF_hdr_t *hdr, H5HF_free_section_t *sect, - unsigned *entry_p); +H5_DLL H5HF_free_section_t *H5HF__sect_single_new(hsize_t sect_off, size_t sect_size, H5HF_indirect_t *parent, + unsigned par_entry); +H5_DLL herr_t H5HF__sect_single_revive(H5HF_hdr_t *hdr, H5HF_free_section_t *sect); +H5_DLL herr_t H5HF__sect_single_dblock_info(H5HF_hdr_t *hdr, const H5HF_free_section_t *sect, + haddr_t *dblock_addr, size_t *dblock_size); +H5_DLL herr_t H5HF__sect_single_reduce(H5HF_hdr_t *hdr, H5HF_free_section_t *sect, size_t amt); +H5_DLL herr_t H5HF__sect_row_revive(H5HF_hdr_t *hdr, H5HF_free_section_t *sect); +H5_DLL herr_t H5HF__sect_row_reduce(H5HF_hdr_t *hdr, H5HF_free_section_t *sect, unsigned *entry_p); H5_DLL H5HF_indirect_t *H5HF__sect_row_get_iblock(H5HF_free_section_t *sect); -H5_DLL herr_t H5HF__sect_indirect_add(H5HF_hdr_t *hdr, H5HF_indirect_t *iblock, - unsigned start_entry, unsigned nentries); +H5_DLL herr_t H5HF__sect_indirect_add(H5HF_hdr_t *hdr, H5HF_indirect_t *iblock, unsigned start_entry, + unsigned nentries); H5_DLL herr_t H5HF__sect_single_free(H5FS_section_info_t *sect); /* Internal operator callbacks */ @@ -792,21 +764,18 @@ H5_DLL herr_t H5HF__op_write(const void *obj, size_t obj_len, void *op_data); /* Testing routines */ #ifdef H5HF_TESTING -H5_DLL herr_t H5HF_get_cparam_test(const H5HF_t *fh, H5HF_create_t *cparam); -H5_DLL int H5HF_cmp_cparam_test(const H5HF_create_t *cparam1, const H5HF_create_t *cparam2); +H5_DLL herr_t H5HF_get_cparam_test(const H5HF_t *fh, H5HF_create_t *cparam); +H5_DLL int H5HF_cmp_cparam_test(const H5HF_create_t *cparam1, const H5HF_create_t *cparam2); H5_DLL unsigned H5HF_get_max_root_rows(const H5HF_t *fh); H5_DLL unsigned H5HF_get_dtable_width_test(const H5HF_t *fh); H5_DLL unsigned H5HF_get_dtable_max_drows_test(const H5HF_t *fh); H5_DLL unsigned H5HF_get_iblock_max_drows_test(const H5HF_t *fh, unsigned pos); -H5_DLL hsize_t H5HF_get_dblock_size_test(const H5HF_t *fh, unsigned row); -H5_DLL hsize_t H5HF_get_dblock_free_test(const H5HF_t *fh, unsigned row); -H5_DLL herr_t H5HF_get_id_off_test(const H5HF_t *fh, const void *id, hsize_t *obj_off); -H5_DLL herr_t H5HF_get_id_type_test(const void *id, unsigned char *obj_type); -H5_DLL herr_t H5HF_get_tiny_info_test(const H5HF_t *fh, size_t *max_len, - hbool_t *len_extended); -H5_DLL herr_t H5HF_get_huge_info_test(const H5HF_t *fh, hsize_t *next_id, - hbool_t *ids_direct); +H5_DLL hsize_t H5HF_get_dblock_size_test(const H5HF_t *fh, unsigned row); +H5_DLL hsize_t H5HF_get_dblock_free_test(const H5HF_t *fh, unsigned row); +H5_DLL herr_t H5HF_get_id_off_test(const H5HF_t *fh, const void *id, hsize_t *obj_off); +H5_DLL herr_t H5HF_get_id_type_test(const void *id, unsigned char *obj_type); +H5_DLL herr_t H5HF_get_tiny_info_test(const H5HF_t *fh, size_t *max_len, hbool_t *len_extended); +H5_DLL herr_t H5HF_get_huge_info_test(const H5HF_t *fh, hsize_t *next_id, hbool_t *ids_direct); #endif /* H5HF_TESTING */ #endif /* _H5HFpkg_H */ - |