PageRenderTime 28ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 1ms

/ExternalLibs/HDF5_1.8.6_x64/include/H5HFpkg.h

#
C++ Header | 786 lines | 517 code | 97 blank | 172 comment | 0 complexity | 21d8ff8b4dc8e8c417d5ad27f2fa5ca1 MD5 | raw file
  1. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  2. * Copyright by The HDF Group. *
  3. * Copyright by the Board of Trustees of the University of Illinois. *
  4. * All rights reserved. *
  5. * *
  6. * This file is part of HDF5. The full HDF5 copyright notice, including *
  7. * terms governing use, modification, and redistribution, is contained in *
  8. * the files COPYING and Copyright.html. COPYING can be found at the root *
  9. * of the source code distribution tree; Copyright.html can be found at the *
  10. * root level of an installed copy of the electronic HDF5 document set and *
  11. * is linked from the top-level documents page. It can also be found at *
  12. * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have *
  13. * access to either file, you may request a copy from help@hdfgroup.org. *
  14. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  15. /*
  16. * Programmer: Quincey Koziol <koziol@ncsa.uiuc.edu>
  17. * Friday, February 24, 2006
  18. *
  19. * Purpose: This file contains declarations which are visible only within
  20. * the H5HF package. Source files outside the H5HF package should
  21. * include H5HFprivate.h instead.
  22. */
  23. #ifndef H5HF_PACKAGE
  24. #error "Do not include this file outside the H5HF package!"
  25. #endif
  26. #ifndef _H5HFpkg_H
  27. #define _H5HFpkg_H
  28. /* Get package's private header */
  29. #include "H5HFprivate.h"
  30. /* Other private headers needed by this file */
  31. #include "H5ACprivate.h" /* Metadata cache */
  32. #include "H5B2private.h" /* v2 B-trees */
  33. #include "H5FLprivate.h" /* Free Lists */
  34. #include "H5FSprivate.h" /* Free space manager */
  35. #include "H5SLprivate.h" /* Skip lists */
  36. /**************************/
  37. /* Package Private Macros */
  38. /**************************/
  39. /* Size of checksum information (on disk) */
  40. #define H5HF_SIZEOF_CHKSUM 4
  41. /* "Standard" size of prefix information for fractal heap metadata */
  42. #define H5HF_METADATA_PREFIX_SIZE(c) ( \
  43. H5_SIZEOF_MAGIC /* Signature */ \
  44. + 1 /* Version */ \
  45. + ((c) ? H5HF_SIZEOF_CHKSUM : 0) /* Metadata checksum */ \
  46. )
  47. /* Size of doubling-table information */
  48. #define H5HF_DTABLE_INFO_SIZE(h) ( \
  49. 2 /* Width of table (i.e. # of columns) */ \
  50. + (h)->sizeof_size /* Starting block size */ \
  51. + (h)->sizeof_size /* Maximum direct block size */ \
  52. + 2 /* Max. size of heap (log2 of actual value - i.e. the # of bits) */ \
  53. + 2 /* Starting # of rows in root indirect block */ \
  54. + (h)->sizeof_addr /* File address of table managed */ \
  55. + 2 /* Current # of rows in root indirect block */ \
  56. )
  57. /* Flags for status byte */
  58. #define H5HF_HDR_FLAGS_HUGE_ID_WRAPPED 0x01 /* "huge" object IDs have wrapped */
  59. #define H5HF_HDR_FLAGS_CHECKSUM_DBLOCKS 0x02 /* checksum direct blocks */
  60. /* Size of the fractal heap header on disk */
  61. /* (this is the fixed-len portion, the variable-len I/O filter information
  62. * follows this information, if there are I/O filters for the heap)
  63. */
  64. #define H5HF_HEADER_SIZE(h) ( \
  65. /* General metadata fields */ \
  66. H5HF_METADATA_PREFIX_SIZE(TRUE) \
  67. \
  68. /* Fractal Heap Header specific fields */ \
  69. \
  70. /* General heap information */ \
  71. + 2 /* Heap ID len */ \
  72. + 2 /* I/O filters' encoded len */ \
  73. + 1 /* Status flags */ \
  74. \
  75. /* "Huge" object fields */ \
  76. + 4 /* Max. size of "managed" object */ \
  77. + (h)->sizeof_size /* Next ID for "huge" object */ \
  78. + (h)->sizeof_addr /* File address of "huge" object tracker B-tree */ \
  79. \
  80. /* "Managed" object free space fields */ \
  81. + (h)->sizeof_size /* Total man. free space */ \
  82. + (h)->sizeof_addr /* File address of free section header */ \
  83. \
  84. /* Statistics fields */ \
  85. + (h)->sizeof_size /* Size of man. space in heap */ \
  86. + (h)->sizeof_size /* Size of man. space iterator offset in heap */ \
  87. + (h)->sizeof_size /* Size of alloacted man. space in heap */ \
  88. + (h)->sizeof_size /* Number of man. objects in heap */ \
  89. + (h)->sizeof_size /* Size of huge space in heap */ \
  90. + (h)->sizeof_size /* Number of huge objects in heap */ \
  91. + (h)->sizeof_size /* Size of tiny space in heap */ \
  92. + (h)->sizeof_size /* Number of tiny objects in heap */ \
  93. \
  94. /* "Managed" object doubling table info */ \
  95. + H5HF_DTABLE_INFO_SIZE(h) /* Size of managed obj. doubling-table info */ \
  96. )
  97. /* Size of overhead for a direct block */
  98. #define H5HF_MAN_ABS_DIRECT_OVERHEAD(h) ( \
  99. /* General metadata fields */ \
  100. H5HF_METADATA_PREFIX_SIZE(h->checksum_dblocks) \
  101. \
  102. /* Fractal heap managed, absolutely mapped direct block specific fields */ \
  103. + (h)->sizeof_addr /* File address of heap owning the block */ \
  104. + (h)->heap_off_size /* Offset of the block in the heap */ \
  105. )
  106. /* Size of managed indirect block entry for a child direct block */
  107. #define H5HF_MAN_INDIRECT_CHILD_DIR_ENTRY_SIZE(h) ( \
  108. ((h)->filter_len > 0 ? \
  109. ((h)->sizeof_addr + (h)->sizeof_size + 4) : /* Size of entries for filtered direct blocks */ \
  110. (h)->sizeof_addr) /* Size of entries for un-filtered direct blocks */ \
  111. )
  112. /* Size of managed indirect block */
  113. #define H5HF_MAN_INDIRECT_SIZE(h, r) ( \
  114. /* General metadata fields */ \
  115. H5HF_METADATA_PREFIX_SIZE(TRUE) \
  116. \
  117. /* Fractal heap managed, absolutely mapped indirect block specific fields */ \
  118. + (h)->sizeof_addr /* File address of heap owning the block */ \
  119. + (h)->heap_off_size /* Offset of the block in the heap */ \
  120. + (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 */ \
  121. + (((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 */ \
  122. )
  123. /* Compute the # of bytes required to store an offset into a given buffer size */
  124. #define H5HF_SIZEOF_OFFSET_BITS(b) (((b) + 7) / 8)
  125. #define H5HF_SIZEOF_OFFSET_LEN(l) H5HF_SIZEOF_OFFSET_BITS(H5V_log2_of2((unsigned)(l)))
  126. /* Heap ID bit flags */
  127. /* Heap ID version (2 bits: 6-7) */
  128. #define H5HF_ID_VERS_CURR 0x00 /* Current version of ID format */
  129. #define H5HF_ID_VERS_MASK 0xC0 /* Mask for getting the ID version from flags */
  130. /* Heap ID type (2 bits: 4-5) */
  131. #define H5HF_ID_TYPE_MAN 0x00 /* "Managed" object - stored in fractal heap blocks */
  132. #define H5HF_ID_TYPE_HUGE 0x10 /* "Huge" object - stored in file directly */
  133. #define H5HF_ID_TYPE_TINY 0x20 /* "Tiny" object - stored in heap ID directly */
  134. #define H5HF_ID_TYPE_RESERVED 0x30 /* "?" object - reserved for future use */
  135. #define H5HF_ID_TYPE_MASK 0x30 /* Mask for getting the ID type from flags */
  136. /* Heap ID bits 0-3 reserved for future use */
  137. /* Encode a "managed" heap ID */
  138. #define H5HF_MAN_ID_ENCODE(i, h, o, l) \
  139. *(i) = H5HF_ID_VERS_CURR | H5HF_ID_TYPE_MAN; \
  140. (i)++; \
  141. UINT64ENCODE_VAR((i), (o), (h)->heap_off_size); \
  142. UINT64ENCODE_VAR((i), (l), (h)->heap_len_size)
  143. /* Decode a "managed" heap ID */
  144. #define H5HF_MAN_ID_DECODE(i, h, f, o, l) \
  145. f = *(uint8_t *)i++; \
  146. UINT64DECODE_VAR((i), (o), (h)->heap_off_size); \
  147. UINT64DECODE_VAR((i), (l), (h)->heap_len_size)
  148. /* Free space section types for fractal heap */
  149. /* (values stored in free space data structures in file) */
  150. #define H5HF_FSPACE_SECT_SINGLE 0 /* Section is a range of actual bytes in a direct block */
  151. #define H5HF_FSPACE_SECT_FIRST_ROW 1 /* Section is first range of blocks in an indirect block row */
  152. #define H5HF_FSPACE_SECT_NORMAL_ROW 2 /* Section is a range of blocks in an indirect block row */
  153. #define H5HF_FSPACE_SECT_INDIRECT 3 /* Section is a span of blocks in an indirect block */
  154. /* Flags for 'op' operations */
  155. #define H5HF_OP_MODIFY 0x0001 /* Operation will modify object */
  156. #define H5HF_OP_FLAGS (H5HF_OP_MODIFY) /* Bit-wise OR of all op flags */
  157. /****************************/
  158. /* Package Private Typedefs */
  159. /****************************/
  160. /* Doubling-table info */
  161. typedef struct H5HF_dtable_t {
  162. /* Immutable, pre-set information for table */
  163. H5HF_dtable_cparam_t cparam; /* Creation parameters for table */
  164. /* Derived information (stored, varies during lifetime of table) */
  165. haddr_t table_addr; /* Address of first block for table */
  166. /* Undefined if no space allocated for table */
  167. unsigned curr_root_rows; /* Current number of rows in the root indirect block */
  168. /* 0 indicates that the TABLE_ADDR field points
  169. * to direct block (of START_BLOCK_SIZE) instead
  170. * of indirect root block.
  171. */
  172. /* Computed information (not stored) */
  173. unsigned max_root_rows; /* Maximum # of rows in root indirect block */
  174. unsigned max_direct_rows; /* Maximum # of direct rows in any indirect block */
  175. unsigned start_bits; /* # of bits for starting block size (i.e. log2(start_block_size)) */
  176. unsigned max_direct_bits; /* # of bits for max. direct block size (i.e. log2(max_direct_size)) */
  177. unsigned max_dir_blk_off_size; /* Max. size of offsets in direct blocks */
  178. unsigned first_row_bits; /* # of bits in address of first row */
  179. hsize_t num_id_first_row; /* Number of IDs in first row of table */
  180. hsize_t *row_block_size; /* Block size per row of indirect block */
  181. hsize_t *row_block_off; /* Cumulative offset per row of indirect block */
  182. hsize_t *row_tot_dblock_free; /* Total free space in dblocks for this row */
  183. /* (For indirect block rows, it's the total
  184. * free space in all direct blocks referenced
  185. * from the indirect block)
  186. */
  187. size_t *row_max_dblock_free; /* Max. free space in dblocks for this row */
  188. /* (For indirect block rows, it's the maximum
  189. * free space in a direct block referenced
  190. * from the indirect block)
  191. */
  192. } H5HF_dtable_t;
  193. /* Fractal heap free list info (forward decl - defined in H5HFflist.c) */
  194. typedef struct H5HF_freelist_t H5HF_freelist_t;
  195. /* Forward decl indirect block info */
  196. typedef struct H5HF_indirect_t H5HF_indirect_t;
  197. /* Fractal heap block location */
  198. typedef struct H5HF_block_loc_t {
  199. /* Necessary table fields */
  200. unsigned row; /* Row of block in doubling table */
  201. unsigned col; /* Column of block in doubling table */
  202. /* Derived/computed/cached table fields */
  203. unsigned entry; /* Entry of block in doubling table */
  204. /* Infrastructure */
  205. H5HF_indirect_t *context; /* Pointer to the indirect block containing the block */
  206. struct H5HF_block_loc_t *up; /* Pointer to next level up in the stack of levels */
  207. } H5HF_block_loc_t;
  208. /* Fractal heap block iterator info */
  209. typedef struct H5HF_block_iter_t {
  210. hbool_t ready; /* Set if iterator is finished initializing */
  211. H5HF_block_loc_t *curr; /* Pointer to the current level information for iterator */
  212. } H5HF_block_iter_t;
  213. /* Fractal heap free space section info */
  214. typedef struct H5HF_free_section_t {
  215. H5FS_section_info_t sect_info; /* Free space section information (must be first in struct) */
  216. union {
  217. struct {
  218. H5HF_indirect_t *parent; /* Indirect block parent for free section's direct block */
  219. unsigned par_entry; /* Entry of free section's direct block in parent indirect block */
  220. } single;
  221. struct {
  222. struct H5HF_free_section_t *under; /* Pointer to indirect block underlying row section */
  223. unsigned row; /* Row for range of blocks */
  224. unsigned col; /* Column for range of blocks */
  225. unsigned num_entries; /* Number of entries covered */
  226. /* Fields that aren't stored */
  227. hbool_t checked_out; /* Flag to indicate that a row section is temporarily out of the free space manager */
  228. } row;
  229. struct {
  230. /* Holds either a pointer to an indirect block (if its "live") or
  231. * the block offset of it's indirect block (if its "serialized")
  232. * (This allows the indirect block that the section is within to
  233. * be compared with other sections, whether it's serialized
  234. * or not)
  235. */
  236. union {
  237. H5HF_indirect_t *iblock; /* Indirect block for free section */
  238. hsize_t iblock_off; /* Indirect block offset in "heap space" */
  239. } u;
  240. unsigned row; /* Row for range of blocks */
  241. unsigned col; /* Column for range of blocks */
  242. unsigned num_entries; /* Number of entries covered */
  243. /* Fields that aren't stored */
  244. struct H5HF_free_section_t *parent; /* Pointer to "parent" indirect section */
  245. unsigned par_entry; /* Entry within parent indirect section */
  246. hsize_t span_size; /* Size of space tracked, in "heap space" */
  247. unsigned iblock_entries; /* Number of entries in indirect block where section is located */
  248. unsigned rc; /* Reference count of outstanding row & child indirect sections */
  249. unsigned dir_nrows; /* Number of direct rows in section */
  250. struct H5HF_free_section_t **dir_rows; /* Array of pointers to outstanding row sections */
  251. unsigned indir_nents; /* Number of indirect entries in section */
  252. struct H5HF_free_section_t **indir_ents; /* Array of pointers to outstanding child indirect sections */
  253. } indirect;
  254. } u;
  255. } H5HF_free_section_t;
  256. /* The fractal heap header information */
  257. /* (Each fractal heap header has certain information that is shared across all
  258. * the instances of blocks in that fractal heap)
  259. */
  260. typedef struct H5HF_hdr_t {
  261. /* Information for H5AC cache functions, _must_ be first field in structure */
  262. H5AC_info_t cache_info;
  263. /* General header information (stored in header) */
  264. unsigned id_len; /* Size of heap IDs (in bytes) */
  265. unsigned filter_len; /* Size of I/O filter information (in bytes) */
  266. /* Flags for heap settings (stored in status byte in header) */
  267. hbool_t debug_objs; /* Is the heap storing objects in 'debug' format */
  268. hbool_t write_once; /* Is heap being written in "write once" mode? */
  269. hbool_t huge_ids_wrapped; /* Have "huge" object IDs wrapped around? */
  270. hbool_t checksum_dblocks; /* Should the direct blocks in the heap be checksummed? */
  271. /* Doubling table information (partially stored in header) */
  272. /* (Partially set by user, partially derived/updated internally) */
  273. H5HF_dtable_t man_dtable; /* Doubling-table info for managed objects */
  274. /* Free space information for managed objects (stored in header) */
  275. hsize_t total_man_free; /* Total amount of free space in managed blocks */
  276. haddr_t fs_addr; /* Address of free space header on disk */
  277. /* "Huge" object support (stored in header) */
  278. uint32_t max_man_size; /* Max. size of object to manage in doubling table */
  279. hsize_t huge_next_id; /* Next ID to use for indirectly tracked 'huge' object */
  280. haddr_t huge_bt2_addr; /* Address of v2 B-tree for tracking "huge" object info */
  281. /* I/O filter support (stored in header, if any are used) */
  282. H5O_pline_t pline; /* I/O filter pipeline for heap objects */
  283. size_t pline_root_direct_size; /* Size of filtered root direct block */
  284. unsigned pline_root_direct_filter_mask; /* I/O filter mask for filtered root direct block */
  285. /* Statistics for heap (stored in header) */
  286. hsize_t man_size; /* Total amount of 'managed' space in heap */
  287. hsize_t man_alloc_size; /* Total amount of allocated 'managed' space in heap */
  288. hsize_t man_iter_off; /* Offset of iterator in 'managed' heap space */
  289. hsize_t man_nobjs; /* Number of 'managed' objects in heap */
  290. hsize_t huge_size; /* Total size of 'huge' objects in heap */
  291. hsize_t huge_nobjs; /* Number of 'huge' objects in heap */
  292. hsize_t tiny_size; /* Total size of 'tiny' objects in heap */
  293. hsize_t tiny_nobjs; /* Number of 'tiny' objects in heap */
  294. /* Cached/computed values (not stored in header) */
  295. size_t rc; /* Reference count of heap's components using heap header */
  296. haddr_t heap_addr; /* Address of heap header in the file */
  297. size_t heap_size; /* Size of heap header in the file */
  298. H5AC_protect_t mode; /* Access mode for heap */
  299. H5F_t *f; /* Pointer to file for heap */
  300. size_t file_rc; /* Reference count of files using heap header */
  301. hbool_t pending_delete; /* Heap is pending deletion */
  302. uint8_t sizeof_size; /* Size of file sizes */
  303. uint8_t sizeof_addr; /* Size of file addresses */
  304. struct H5HF_indirect_t *root_iblock; /* Pointer to pinned root indirect block */
  305. H5FS_t *fspace; /* Free space list for objects in heap */
  306. H5HF_block_iter_t next_block; /* Block iterator for searching for next block with space */
  307. H5B2_t *huge_bt2; /* v2 B-tree handle for huge objects */
  308. hsize_t huge_max_id; /* Max. 'huge' heap ID before rolling 'huge' heap IDs over */
  309. uint8_t huge_id_size; /* Size of 'huge' heap IDs (in bytes) */
  310. hbool_t huge_ids_direct; /* Flag to indicate that 'huge' object's offset & length are stored directly in heap ID */
  311. size_t tiny_max_len; /* Max. size of tiny objects for this heap */
  312. hbool_t tiny_len_extended; /* Flag to indicate that 'tiny' object's length is stored in extended form (i.e. w/extra byte) */
  313. uint8_t heap_off_size; /* Size of heap offsets (in bytes) */
  314. uint8_t heap_len_size; /* Size of heap ID lengths (in bytes) */
  315. hbool_t checked_filters; /* TRUE if pipeline passes can_apply checks */
  316. } H5HF_hdr_t;
  317. /* Common indirect block doubling table entry */
  318. /* (common between entries pointing to direct & indirect child blocks) */
  319. typedef struct H5HF_indirect_ent_t {
  320. haddr_t addr; /* Direct block's address */
  321. } H5HF_indirect_ent_t;
  322. /* Extern indirect block doubling table entry for compressed direct blocks */
  323. /* (only exists for indirect blocks in heaps that have I/O filters) */
  324. typedef struct H5HF_indirect_filt_ent_t {
  325. size_t size; /* Size of child direct block, after passing though I/O filters */
  326. unsigned filter_mask; /* Excluded filters for child direct block */
  327. } H5HF_indirect_filt_ent_t;
  328. /* Fractal heap indirect block */
  329. struct H5HF_indirect_t {
  330. /* Information for H5AC cache functions, _must_ be first field in structure */
  331. H5AC_info_t cache_info;
  332. /* Internal heap information (not stored) */
  333. size_t rc; /* Reference count of objects using this block */
  334. H5HF_hdr_t *hdr; /* Shared heap header info */
  335. struct H5HF_indirect_t *parent; /* Shared parent indirect block info */
  336. unsigned par_entry; /* Entry in parent's table */
  337. haddr_t addr; /* Address of this indirect block on disk */
  338. size_t size; /* Size of indirect block on disk */
  339. unsigned nrows; /* Total # of rows in indirect block */
  340. unsigned max_rows; /* Max. # of rows in indirect block */
  341. unsigned nchildren; /* Number of child blocks */
  342. unsigned max_child; /* Max. offset used in child entries */
  343. struct H5HF_indirect_t **child_iblocks; /* Array of pointers to pinned child indirect blocks */
  344. /* Stored values */
  345. hsize_t block_off; /* Offset of the block within the heap's address space */
  346. H5HF_indirect_ent_t *ents; /* Pointer to block entry table */
  347. H5HF_indirect_filt_ent_t *filt_ents; /* Pointer to filtered information for direct blocks */
  348. };
  349. /* A fractal heap direct block */
  350. typedef struct H5HF_direct_t {
  351. /* Information for H5AC cache functions, _must_ be first field in structure */
  352. H5AC_info_t cache_info;
  353. /* Internal heap information */
  354. H5HF_hdr_t *hdr; /* Shared heap header info */
  355. H5HF_indirect_t *parent; /* Shared parent indirect block info */
  356. unsigned par_entry; /* Entry in parent's table */
  357. size_t size; /* Size of direct block */
  358. hsize_t file_size; /* Size of direct block in file (only valid when block's space is being freed) */
  359. unsigned blk_off_size; /* Size of offsets in the block */
  360. uint8_t *blk; /* Pointer to buffer containing block data */
  361. /* Stored values */
  362. hsize_t block_off; /* Offset of the block within the heap's address space */
  363. } H5HF_direct_t;
  364. /* Fractal heap */
  365. struct H5HF_t {
  366. H5HF_hdr_t *hdr; /* Pointer to internal fractal heap header info */
  367. H5F_t *f; /* Pointer to file for heap */
  368. };
  369. /* Fractal heap "parent info" (for loading a block) */
  370. typedef struct H5HF_parent_t {
  371. H5HF_hdr_t *hdr; /* Pointer to heap header info */
  372. H5HF_indirect_t *iblock; /* Pointer to parent indirect block */
  373. unsigned entry; /* Location of block in parent's entry table */
  374. } H5HF_parent_t;
  375. /* Typedef for indirectly accessed 'huge' object's records in the v2 B-tree */
  376. typedef struct H5HF_huge_bt2_indir_rec_t {
  377. haddr_t addr; /* Address of the object in the file */
  378. hsize_t len; /* Length of the object in the file */
  379. hsize_t id; /* ID used for object (not used for 'huge' objects directly accessed) */
  380. } H5HF_huge_bt2_indir_rec_t;
  381. /* Typedef for indirectly accessed, filtered 'huge' object's records in the v2 B-tree */
  382. typedef struct H5HF_huge_bt2_filt_indir_rec_t {
  383. haddr_t addr; /* Address of the filtered object in the file */
  384. hsize_t len; /* Length of the filtered object in the file */
  385. unsigned filter_mask; /* I/O pipeline filter mask for filtered object in the file */
  386. hsize_t obj_size; /* Size of the de-filtered object in memory */
  387. hsize_t id; /* ID used for object (not used for 'huge' objects directly accessed) */
  388. } H5HF_huge_bt2_filt_indir_rec_t;
  389. /* Typedef for directly accessed 'huge' object's records in the v2 B-tree */
  390. typedef struct H5HF_huge_bt2_dir_rec_t {
  391. haddr_t addr; /* Address of the object in the file */
  392. hsize_t len; /* Length of the object in the file */
  393. } H5HF_huge_bt2_dir_rec_t;
  394. /* Typedef for directly accessed, filtered 'huge' object's records in the v2 B-tree */
  395. typedef struct H5HF_huge_bt2_filt_dir_rec_t {
  396. haddr_t addr; /* Address of the filtered object in the file */
  397. hsize_t len; /* Length of the filtered object in the file */
  398. unsigned filter_mask; /* I/O pipeline filter mask for filtered object in the file */
  399. hsize_t obj_size; /* Size of the de-filtered object in memory */
  400. } H5HF_huge_bt2_filt_dir_rec_t;
  401. /* User data for free space section 'add' callback */
  402. typedef struct {
  403. H5HF_hdr_t *hdr; /* Fractal heap header */
  404. hid_t dxpl_id; /* DXPL ID for operation */
  405. } H5HF_sect_add_ud1_t;
  406. /* User data for v2 B-tree 'remove' callback on 'huge' objects */
  407. typedef struct {
  408. H5HF_hdr_t *hdr; /* Fractal heap header (in) */
  409. hid_t dxpl_id; /* DXPL ID for operation (in) */
  410. hsize_t obj_len; /* Length of object removed (out) */
  411. } H5HF_huge_remove_ud1_t;
  412. /* User data for fractal heap header cache client callback */
  413. typedef struct H5HF_hdr_cache_ud_t {
  414. H5F_t *f; /* File pointer */
  415. hid_t dxpl_id; /* DXPL ID for operation (in) */
  416. } H5HF_hdr_cache_ud_t;
  417. /* User data for fractal heap indirect block cache client callbacks */
  418. typedef struct H5HF_iblock_cache_ud_t {
  419. H5HF_parent_t * par_info; /* Parent info */
  420. H5F_t * f; /* File pointer */
  421. const unsigned *nrows; /* Number of rows */
  422. } H5HF_iblock_cache_ud_t;
  423. /* User data for fractal heap direct block cache client callbacks */
  424. typedef struct H5HF_dblock_cache_ud_t {
  425. H5HF_parent_t par_info; /* Parent info */
  426. H5F_t * f; /* File pointer */
  427. size_t odi_size; /* On disk image size of the direct block.
  428. * Note that there is no necessary relation
  429. * between this value, and the actual
  430. * direct block size, as conpression may
  431. * reduce the size of the on disk image,
  432. * and check sums may increase it.
  433. */
  434. size_t dblock_size; /* size of the direct block, which bears
  435. * no necessary relation to the block
  436. * odi_size -- the size of the on disk
  437. * image of the block. Note that the
  438. * metadata cache is only interested
  439. * in the odi_size, and thus it is this
  440. * value that is passed to the cache in
  441. * calls to it.
  442. */
  443. unsigned filter_mask; /* Excluded filters for direct block */
  444. } H5HF_dblock_cache_ud_t;
  445. /*****************************/
  446. /* Package Private Variables */
  447. /*****************************/
  448. /* H5HF header inherits cache-like properties from H5AC */
  449. H5_DLLVAR const H5AC_class_t H5AC_FHEAP_HDR[1];
  450. /* H5HF indirect block inherits cache-like properties from H5AC */
  451. H5_DLLVAR const H5AC_class_t H5AC_FHEAP_IBLOCK[1];
  452. /* H5HF direct block inherits cache-like properties from H5AC */
  453. H5_DLLVAR const H5AC_class_t H5AC_FHEAP_DBLOCK[1];
  454. /* The v2 B-tree class for tracking indirectly accessed 'huge' objects */
  455. H5_DLLVAR const H5B2_class_t H5HF_HUGE_BT2_INDIR[1];
  456. /* The v2 B-tree class for tracking indirectly accessed filtered 'huge' objects */
  457. H5_DLLVAR const H5B2_class_t H5HF_HUGE_BT2_FILT_INDIR[1];
  458. /* The v2 B-tree class for tracking directly accessed 'huge' objects */
  459. H5_DLLVAR const H5B2_class_t H5HF_HUGE_BT2_DIR[1];
  460. /* The v2 B-tree class for tracking directly accessed filtered 'huge' objects */
  461. H5_DLLVAR const H5B2_class_t H5HF_HUGE_BT2_FILT_DIR[1];
  462. /* H5HF single section inherits serializable properties from H5FS_section_class_t */
  463. H5_DLLVAR H5FS_section_class_t H5HF_FSPACE_SECT_CLS_SINGLE[1];
  464. /* H5HF 'first' row section inherits serializable properties from H5FS_section_class_t */
  465. H5_DLLVAR H5FS_section_class_t H5HF_FSPACE_SECT_CLS_FIRST_ROW[1];
  466. /* H5HF 'normal' row section inherits serializable properties from H5FS_section_class_t */
  467. H5_DLLVAR H5FS_section_class_t H5HF_FSPACE_SECT_CLS_NORMAL_ROW[1];
  468. /* H5HF indirect section inherits serializable properties from H5FS_section_class_t */
  469. H5_DLLVAR H5FS_section_class_t H5HF_FSPACE_SECT_CLS_INDIRECT[1];
  470. /* Declare a free list to manage the H5HF_indirect_t struct */
  471. H5FL_EXTERN(H5HF_indirect_t);
  472. /* Declare a free list to manage the H5HF_indirect_ent_t sequence information */
  473. H5FL_SEQ_EXTERN(H5HF_indirect_ent_t);
  474. /* Declare a free list to manage the H5HF_indirect_filt_ent_t sequence information */
  475. H5FL_SEQ_EXTERN(H5HF_indirect_filt_ent_t);
  476. /* Declare a free list to manage the H5HF_indirect_t * sequence information */
  477. typedef H5HF_indirect_t *H5HF_indirect_ptr_t;
  478. H5FL_SEQ_EXTERN(H5HF_indirect_ptr_t);
  479. /* Declare a free list to manage the H5HF_direct_t struct */
  480. H5FL_EXTERN(H5HF_direct_t);
  481. /* Declare a free list to manage heap direct block data to/from disk */
  482. H5FL_BLK_EXTERN(direct_block);
  483. /******************************/
  484. /* Package Private Prototypes */
  485. /******************************/
  486. /* Doubling table routines */
  487. H5_DLL herr_t H5HF_dtable_init(H5HF_dtable_t *dtable);
  488. H5_DLL herr_t H5HF_dtable_dest(H5HF_dtable_t *dtable);
  489. H5_DLL herr_t H5HF_dtable_lookup(const H5HF_dtable_t *dtable, hsize_t off,
  490. unsigned *row, unsigned *col);
  491. H5_DLL unsigned H5HF_dtable_size_to_row(const H5HF_dtable_t *dtable, size_t block_size);
  492. H5_DLL unsigned H5HF_dtable_size_to_rows(const H5HF_dtable_t *dtable, hsize_t size);
  493. H5_DLL hsize_t H5HF_dtable_span_size(const H5HF_dtable_t *dtable, unsigned start_row,
  494. unsigned start_col, unsigned num_entries);
  495. /* Heap header routines */
  496. H5_DLL H5HF_hdr_t * H5HF_hdr_alloc(H5F_t *f);
  497. H5_DLL haddr_t H5HF_hdr_create(H5F_t *f, hid_t dxpl_id, const H5HF_create_t *cparam);
  498. H5_DLL H5HF_hdr_t *H5HF_hdr_protect(H5F_t *f, hid_t dxpl_id, haddr_t addr,
  499. H5AC_protect_t rw);
  500. H5_DLL herr_t H5HF_hdr_finish_init_phase1(H5HF_hdr_t *hdr);
  501. H5_DLL herr_t H5HF_hdr_finish_init_phase2(H5HF_hdr_t *hdr);
  502. H5_DLL herr_t H5HF_hdr_finish_init(H5HF_hdr_t *hdr);
  503. H5_DLL herr_t H5HF_hdr_incr(H5HF_hdr_t *hdr);
  504. H5_DLL herr_t H5HF_hdr_decr(H5HF_hdr_t *hdr);
  505. H5_DLL herr_t H5HF_hdr_fuse_incr(H5HF_hdr_t *hdr);
  506. H5_DLL size_t H5HF_hdr_fuse_decr(H5HF_hdr_t *hdr);
  507. H5_DLL herr_t H5HF_hdr_dirty(H5HF_hdr_t *hdr);
  508. H5_DLL herr_t H5HF_hdr_adj_free(H5HF_hdr_t *hdr, ssize_t amt);
  509. H5_DLL herr_t H5HF_hdr_adjust_heap(H5HF_hdr_t *hdr, hsize_t new_size, hssize_t extra_free);
  510. H5_DLL herr_t H5HF_hdr_inc_alloc(H5HF_hdr_t *hdr, size_t alloc_size);
  511. H5_DLL herr_t H5HF_hdr_start_iter(H5HF_hdr_t *hdr, H5HF_indirect_t *iblock, hsize_t curr_off, unsigned curr_entry);
  512. H5_DLL herr_t H5HF_hdr_skip_blocks(H5HF_hdr_t *hdr, hid_t dxpl_id,
  513. H5HF_indirect_t *iblock, unsigned start_entry, unsigned nentries);
  514. H5_DLL herr_t H5HF_hdr_update_iter(H5HF_hdr_t *hdr, hid_t dxpl_id, size_t min_dblock_size);
  515. H5_DLL herr_t H5HF_hdr_inc_iter(H5HF_hdr_t *hdr, hsize_t adv_size, unsigned nentries);
  516. H5_DLL herr_t H5HF_hdr_reverse_iter(H5HF_hdr_t *hdr, hid_t dxpl_id,
  517. haddr_t dblock_addr);
  518. H5_DLL herr_t H5HF_hdr_reset_iter(H5HF_hdr_t *hdr, hsize_t curr_off);
  519. H5_DLL herr_t H5HF_hdr_empty(H5HF_hdr_t *hdr);
  520. H5_DLL herr_t H5HF_hdr_free(H5HF_hdr_t *hdr);
  521. H5_DLL herr_t H5HF_hdr_delete(H5HF_hdr_t *hdr, hid_t dxpl_id);
  522. H5_DLL herr_t H5HF_hdr_dest(H5HF_hdr_t *hdr);
  523. /* Indirect block routines */
  524. H5_DLL herr_t H5HF_iblock_incr(H5HF_indirect_t *iblock);
  525. H5_DLL herr_t H5HF_iblock_decr(H5HF_indirect_t *iblock);
  526. H5_DLL herr_t H5HF_iblock_dirty(H5HF_indirect_t *iblock);
  527. H5_DLL herr_t H5HF_man_iblock_root_create(H5HF_hdr_t *hdr, hid_t dxpl_id,
  528. size_t min_dblock_size);
  529. H5_DLL herr_t H5HF_man_iblock_root_double(H5HF_hdr_t *hdr, hid_t dxpl_id,
  530. size_t min_dblock_size);
  531. H5_DLL herr_t H5HF_man_iblock_alloc_row(H5HF_hdr_t *hdr, hid_t dxpl_id,
  532. H5HF_free_section_t **sec_node);
  533. H5_DLL herr_t H5HF_man_iblock_create(H5HF_hdr_t *hdr, hid_t dxpl_id,
  534. H5HF_indirect_t *par_iblock, unsigned par_entry, unsigned nrows,
  535. unsigned max_rows, haddr_t *addr_p);
  536. H5_DLL H5HF_indirect_t *H5HF_man_iblock_protect(H5HF_hdr_t *hdr, hid_t dxpl_id,
  537. haddr_t iblock_addr, unsigned iblock_nrows,
  538. H5HF_indirect_t *par_iblock, unsigned par_entry, hbool_t must_protect,
  539. H5AC_protect_t rw, hbool_t *did_protect);
  540. H5_DLL herr_t H5HF_man_iblock_unprotect(H5HF_indirect_t *iblock, hid_t dxpl_id,
  541. unsigned cache_flags, hbool_t did_protect);
  542. H5_DLL herr_t H5HF_man_iblock_attach(H5HF_indirect_t *iblock, unsigned entry,
  543. haddr_t dblock_addr);
  544. H5_DLL herr_t H5HF_man_iblock_detach(H5HF_indirect_t *iblock, hid_t dxpl_id, unsigned entry);
  545. H5_DLL herr_t H5HF_man_iblock_entry_addr(H5HF_indirect_t *iblock, unsigned entry,
  546. haddr_t *child_addr);
  547. H5_DLL herr_t H5HF_man_iblock_delete(H5HF_hdr_t *hdr, hid_t dxpl_id,
  548. haddr_t iblock_addr, unsigned iblock_nrows, H5HF_indirect_t *par_iblock,
  549. unsigned par_entry);
  550. H5_DLL herr_t H5HF_man_iblock_size(H5F_t *f, hid_t dxpl_id, H5HF_hdr_t *hdr,
  551. haddr_t iblock_addr, unsigned nrows, H5HF_indirect_t *par_iblock, unsigned par_entry, hsize_t *heap_size/*out*/);
  552. H5_DLL herr_t H5HF_man_iblock_dest(H5HF_indirect_t *iblock);
  553. /* Direct block routines */
  554. H5_DLL herr_t H5HF_man_dblock_new(H5HF_hdr_t *fh, hid_t dxpl_id, size_t request,
  555. H5HF_free_section_t **ret_sec_node);
  556. H5_DLL herr_t H5HF_man_dblock_create(hid_t dxpl_id, H5HF_hdr_t *hdr,
  557. H5HF_indirect_t *par_iblock, unsigned par_entry, haddr_t *addr_p,
  558. H5HF_free_section_t **ret_sec_node);
  559. H5_DLL herr_t H5HF_man_dblock_destroy(H5HF_hdr_t *hdr, hid_t dxpl_id,
  560. H5HF_direct_t *dblock, haddr_t dblock_addr);
  561. H5_DLL H5HF_direct_t *H5HF_man_dblock_protect(H5HF_hdr_t *hdr, hid_t dxpl_id,
  562. haddr_t dblock_addr, size_t dblock_size,
  563. H5HF_indirect_t *par_iblock, unsigned par_entry,
  564. H5AC_protect_t rw);
  565. H5_DLL herr_t H5HF_man_dblock_locate(H5HF_hdr_t *hdr, hid_t dxpl_id,
  566. hsize_t obj_off, H5HF_indirect_t **par_iblock,
  567. unsigned *par_entry, hbool_t *par_did_protect, H5AC_protect_t rw);
  568. H5_DLL herr_t H5HF_man_dblock_delete(H5F_t *f, hid_t dxpl_id, haddr_t dblock_addr,
  569. hsize_t dblock_size);
  570. H5_DLL herr_t H5HF_man_dblock_dest(H5HF_direct_t *dblock);
  571. /* Managed object routines */
  572. H5_DLL herr_t H5HF_man_insert(H5HF_hdr_t *fh, hid_t dxpl_id, size_t obj_size,
  573. const void *obj, void *id);
  574. H5_DLL herr_t H5HF_man_read(H5HF_hdr_t *fh, hid_t dxpl_id, const uint8_t *id,
  575. void *obj);
  576. H5_DLL herr_t H5HF_man_write(H5HF_hdr_t *hdr, hid_t dxpl_id, const uint8_t *id,
  577. const void *obj);
  578. H5_DLL herr_t H5HF_man_op(H5HF_hdr_t *hdr, hid_t dxpl_id, const uint8_t *id,
  579. H5HF_operator_t op, void *op_data);
  580. H5_DLL herr_t H5HF_man_remove(H5HF_hdr_t *hdr, hid_t dxpl_id, const uint8_t *id);
  581. /* 'Huge' object routines */
  582. H5_DLL herr_t H5HF_huge_init(H5HF_hdr_t *hdr);
  583. H5_DLL herr_t H5HF_huge_insert(H5HF_hdr_t *hdr, hid_t dxpl_id, size_t obj_size,
  584. void *obj, void *id);
  585. H5_DLL herr_t H5HF_huge_get_obj_len(H5HF_hdr_t *hdr, hid_t dxpl_id,
  586. const uint8_t *id, size_t *obj_len_p);
  587. H5_DLL herr_t H5HF_huge_read(H5HF_hdr_t *fh, hid_t dxpl_id, const uint8_t *id,
  588. void *obj);
  589. H5_DLL herr_t H5HF_huge_write(H5HF_hdr_t *hdr, hid_t dxpl_id, const uint8_t *id,
  590. const void *obj);
  591. H5_DLL herr_t H5HF_huge_op(H5HF_hdr_t *hdr, hid_t dxpl_id, const uint8_t *id,
  592. H5HF_operator_t op, void *op_data);
  593. H5_DLL herr_t H5HF_huge_remove(H5HF_hdr_t *fh, hid_t dxpl_id, const uint8_t *id);
  594. H5_DLL herr_t H5HF_huge_term(H5HF_hdr_t *hdr, hid_t dxpl_id);
  595. H5_DLL herr_t H5HF_huge_delete(H5HF_hdr_t *hdr, hid_t dxpl_id);
  596. /* 'Huge' object v2 B-tree function callbacks */
  597. H5_DLL herr_t H5HF_huge_bt2_indir_found(const void *nrecord, void *op_data);
  598. H5_DLL herr_t H5HF_huge_bt2_indir_remove(const void *nrecord, void *op_data);
  599. H5_DLL herr_t H5HF_huge_bt2_filt_indir_found(const void *nrecord, void *op_data);
  600. H5_DLL herr_t H5HF_huge_bt2_filt_indir_remove(const void *nrecord, void *op_data);
  601. H5_DLL herr_t H5HF_huge_bt2_dir_remove(const void *nrecord, void *op_data);
  602. H5_DLL herr_t H5HF_huge_bt2_filt_dir_found(const void *nrecord, void *op_data);
  603. H5_DLL herr_t H5HF_huge_bt2_filt_dir_remove(const void *nrecord, void *op_data);
  604. /* 'Tiny' object routines */
  605. H5_DLL herr_t H5HF_tiny_init(H5HF_hdr_t *hdr);
  606. H5_DLL herr_t H5HF_tiny_insert(H5HF_hdr_t *hdr, size_t obj_size, const void *obj,
  607. void *id);
  608. H5_DLL herr_t H5HF_tiny_get_obj_len(H5HF_hdr_t *hdr, const uint8_t *id,
  609. size_t *obj_len_p);
  610. H5_DLL herr_t H5HF_tiny_read(H5HF_hdr_t *fh, const uint8_t *id, void *obj);
  611. H5_DLL herr_t H5HF_tiny_op(H5HF_hdr_t *hdr, const uint8_t *id,
  612. H5HF_operator_t op, void *op_data);
  613. H5_DLL herr_t H5HF_tiny_remove(H5HF_hdr_t *fh, const uint8_t *id);
  614. /* Debugging routines for dumping file structures */
  615. H5_DLL herr_t H5HF_hdr_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr,
  616. FILE *stream, int indent, int fwidth);
  617. H5_DLL herr_t H5HF_dblock_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr,
  618. FILE *stream, int indent, int fwidth, haddr_t hdr_addr, size_t nrec);
  619. H5_DLL herr_t H5HF_iblock_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr,
  620. FILE *stream, int indent, int fwidth, haddr_t hdr_addr, unsigned nrows);
  621. /* Block iteration routines */
  622. H5_DLL herr_t H5HF_man_iter_init(H5HF_block_iter_t *biter);
  623. H5_DLL herr_t H5HF_man_iter_start_offset(H5HF_hdr_t *hdr, hid_t dxpl_id,
  624. H5HF_block_iter_t *biter, hsize_t offset);
  625. H5_DLL herr_t H5HF_man_iter_start_entry(H5HF_hdr_t *hdr, H5HF_block_iter_t *biter,
  626. H5HF_indirect_t *iblock, unsigned start_entry);
  627. H5_DLL herr_t H5HF_man_iter_set_entry(const H5HF_hdr_t *hdr,
  628. H5HF_block_iter_t *biter, unsigned entry);
  629. H5_DLL herr_t H5HF_man_iter_next(H5HF_hdr_t *hdr, H5HF_block_iter_t *biter,
  630. unsigned nentries);
  631. H5_DLL herr_t H5HF_man_iter_up(H5HF_block_iter_t *biter);
  632. H5_DLL herr_t H5HF_man_iter_down(H5HF_block_iter_t *biter, H5HF_indirect_t *iblock);
  633. H5_DLL herr_t H5HF_man_iter_reset(H5HF_block_iter_t *biter);
  634. H5_DLL herr_t H5HF_man_iter_curr(H5HF_block_iter_t *biter, unsigned *row, unsigned *col,
  635. unsigned *entry, H5HF_indirect_t **block);
  636. H5_DLL herr_t H5HF_man_iter_offset(H5HF_hdr_t *hdr, H5HF_block_iter_t *biter,
  637. hsize_t *offset);
  638. H5_DLL hbool_t H5HF_man_iter_ready(H5HF_block_iter_t *biter);
  639. /* Free space manipulation routines */
  640. H5_DLL herr_t H5HF_space_start(H5HF_hdr_t *hdr, hid_t dxpl_id, hbool_t may_create);
  641. H5_DLL herr_t H5HF_space_add(H5HF_hdr_t *hdr, hid_t dxpl_id,
  642. H5HF_free_section_t *node, unsigned flags);
  643. H5_DLL htri_t H5HF_space_find(H5HF_hdr_t *hdr, hid_t dxpl_id, hsize_t request,
  644. H5HF_free_section_t **node);
  645. H5_DLL herr_t H5HF_space_size(H5HF_hdr_t *hdr, hid_t dxpl_id, hsize_t *fs_size);
  646. H5_DLL herr_t H5HF_space_remove(H5HF_hdr_t *hdr, hid_t dxpl_id,
  647. H5HF_free_section_t *node);
  648. H5_DLL herr_t H5HF_space_close(H5HF_hdr_t *hdr, hid_t dxpl_id);
  649. H5_DLL herr_t H5HF_space_delete(H5HF_hdr_t *hdr, hid_t dxpl_id);
  650. H5_DLL herr_t H5HF_space_sect_change_class(H5HF_hdr_t *hdr, hid_t dxpl_id,
  651. H5HF_free_section_t *sect, unsigned new_class);
  652. /* Free space section routines */
  653. H5_DLL H5HF_free_section_t *H5HF_sect_single_new(hsize_t sect_off,
  654. size_t sect_size, H5HF_indirect_t *parent, unsigned par_entry);
  655. H5_DLL herr_t H5HF_sect_single_revive(H5HF_hdr_t *hdr, hid_t dxpl_id,
  656. H5HF_free_section_t *sect);
  657. H5_DLL herr_t H5HF_sect_single_dblock_info(H5HF_hdr_t *hdr, hid_t dxpl_id,
  658. H5HF_free_section_t *sect, haddr_t *dblock_addr, size_t *dblock_size);
  659. H5_DLL herr_t H5HF_sect_single_reduce(H5HF_hdr_t *hdr, hid_t dxpl_id,
  660. H5HF_free_section_t *sect, size_t amt);
  661. H5_DLL herr_t H5HF_sect_row_revive(H5HF_hdr_t *hdr, hid_t dxpl_id,
  662. H5HF_free_section_t *sect);
  663. H5_DLL herr_t H5HF_sect_row_reduce(H5HF_hdr_t *hdr, hid_t dxpl_id,
  664. H5HF_free_section_t *sect, unsigned *entry_p);
  665. H5_DLL H5HF_indirect_t *H5HF_sect_row_get_iblock(H5HF_free_section_t *sect);
  666. H5_DLL herr_t H5HF_sect_indirect_add(H5HF_hdr_t *hdr, hid_t dxpl_id,
  667. H5HF_indirect_t *iblock, unsigned start_entry, unsigned nentries);
  668. H5_DLL herr_t H5HF_sect_single_free(H5FS_section_info_t *sect);
  669. /* Internal operator callbacks */
  670. H5_DLL herr_t H5HF_op_read(const void *obj, size_t obj_len, void *op_data);
  671. H5_DLL herr_t H5HF_op_write(const void *obj, size_t obj_len, void *op_data);
  672. /* Testing routines */
  673. #ifdef H5HF_TESTING
  674. H5_DLL herr_t H5HF_get_cparam_test(const H5HF_t *fh, H5HF_create_t *cparam);
  675. H5_DLL int H5HF_cmp_cparam_test(const H5HF_create_t *cparam1, const H5HF_create_t *cparam2);
  676. H5_DLL unsigned H5HF_get_max_root_rows(const H5HF_t *fh);
  677. H5_DLL unsigned H5HF_get_dtable_width_test(const H5HF_t *fh);
  678. H5_DLL unsigned H5HF_get_dtable_max_drows_test(const H5HF_t *fh);
  679. H5_DLL unsigned H5HF_get_iblock_max_drows_test(const H5HF_t *fh, unsigned pos);
  680. H5_DLL hsize_t H5HF_get_dblock_size_test(const H5HF_t *fh, unsigned row);
  681. H5_DLL hsize_t H5HF_get_dblock_free_test(const H5HF_t *fh, unsigned row);
  682. H5_DLL herr_t H5HF_get_id_off_test(const H5HF_t *fh, const void *id, hsize_t *obj_off);
  683. H5_DLL herr_t H5HF_get_id_type_test(const void *id, unsigned char *obj_type);
  684. H5_DLL herr_t H5HF_get_tiny_info_test(const H5HF_t *fh, size_t *max_len,
  685. hbool_t *len_extended);
  686. H5_DLL herr_t H5HF_get_huge_info_test(const H5HF_t *fh, hsize_t *next_id,
  687. hbool_t *ids_direct);
  688. #endif /* H5HF_TESTING */
  689. #endif /* _H5HFpkg_H */