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 COPYING file, which can be found at the root of the source code       *
9  * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
10  * If you do not have access to either file, you may request a copy from     *
11  * help@hdfgroup.org.                                                        *
12  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
13 
14 /*
15  * Programmer:      Quincey Koziol <koziol@hdfgroup.org>
16  *                  Tuesday, June 17, 2008
17  *
18  * Purpose:         This file contains declarations which are visible only
19  *                  within the H5EA package.  Source files outside the H5EA
20  *                  package should include H5EAprivate.h instead.
21  */
22 #if !(defined(H5EA_FRIEND) | defined(H5EA_MODULE))
23 #error "Do not include this file outside the H5EA package!"
24 #endif
25 
26 #ifndef _H5EApkg_H
27 #define _H5EApkg_H
28 
29 /* Get package's private header */
30 #include "H5EAprivate.h"
31 
32 /* Other private headers needed by this file */
33 #include "H5FLprivate.h"    /* Free Lists                           */
34 
35 
36 /**************************/
37 /* Package Private Macros */
38 /**************************/
39 
40 /* Fill value for extensible array test class */
41 #ifdef H5EA_TESTING
42 #define H5EA_TEST_FILL          ((uint64_t)ULLONG_MAX)
43 #endif /* H5EA_TESTING */
44 
45 /* Size of checksum information (on disk) */
46 #define H5EA_SIZEOF_CHKSUM      4
47 
48 /* "Standard" size of prefix information for extensible array metadata */
49 #define H5EA_METADATA_PREFIX_SIZE(c) (                                        \
50     H5_SIZEOF_MAGIC   /* Signature */                                         \
51     + 1 /* Version */                                                         \
52     + 1 /* Array type */                                                      \
53     + ((c) ? H5EA_SIZEOF_CHKSUM : 0) /* Metadata checksum */                  \
54     )
55 
56 /* Size of the extensible array header on disk */
57 #define H5EA_HEADER_SIZE(sizeof_addr, sizeof_size) (                          \
58     /* General metadata fields */                                             \
59     H5EA_METADATA_PREFIX_SIZE(TRUE)                                           \
60                                                                               \
61     /* General array information */                                           \
62     + 1 /* Element Size */                                                    \
63     + 1 /* Max. # of elements bits */                                         \
64     + 1 /* # of elements to store in index block */                           \
65     + 1 /* Min. # elements per data block */                                  \
66     + 1 /* Min. # of data block pointers for a super block */                 \
67     + 1 /* Log2(Max. # of elements in data block page) - i.e. # of bits needed to store max. # of elements in data block page */ \
68                                                                               \
69     /* Extensible Array statistics fields */                                  \
70     + (sizeof_size) /* Number of super blocks created */		      \
71     + (sizeof_size) /* Size of super blocks created */	        	      \
72     + (sizeof_size) /* Number of data blocks created */	        	      \
73     + (sizeof_size) /* Size of data blocks created */   		      \
74     + (sizeof_size) /* Max. index set */	       			      \
75     + (sizeof_size) /* Number of elements 'realized' */	        	      \
76                                                                               \
77     /* Extensible Array Header specific fields */                             \
78     + (sizeof_addr) /* File address of index block */   		      \
79     )
80 
81 /* Size of the extensible array header on disk (via file pointer) */
82 #define H5EA_HEADER_SIZE_FILE(f)   (                                          \
83     H5EA_HEADER_SIZE(H5F_SIZEOF_ADDR(f), H5F_SIZEOF_SIZE(f))                  \
84     )
85 
86 /* Size of the extensible array header on disk (via extensible array header) */
87 #define H5EA_HEADER_SIZE_HDR(h)   (                                           \
88     H5EA_HEADER_SIZE((h)->sizeof_addr, (h)->sizeof_size)                      \
89     )
90 
91 /* Size of the extensible array index block on disk */
92 #define H5EA_IBLOCK_SIZE(i)     (                                             \
93     /* General metadata fields */                                             \
94     H5EA_METADATA_PREFIX_SIZE(TRUE)                                           \
95                                                                               \
96     /* Sanity-checking fields */                                              \
97     + (i)->hdr->sizeof_addr          /* File address of array owning the block */ \
98                                                                               \
99     /* Extensible Array Index Block specific fields */                        \
100     + ((size_t)(i)->hdr->cparam.idx_blk_elmts * (size_t)(i)->hdr->cparam.raw_elmt_size) /* Elements in index block  */ \
101     + ((i)->ndblk_addrs * (i)->hdr->sizeof_addr) /* Data block addresses in index block  */ \
102     + ((i)->nsblk_addrs * (i)->hdr->sizeof_addr) /* Super block addresses in index block  */ \
103     )
104 
105 /* Size of the extensible array super block on disk */
106 #define H5EA_SBLOCK_SIZE(s)     (                                             \
107     /* General metadata fields */                                             \
108     H5EA_METADATA_PREFIX_SIZE(TRUE)                                           \
109                                                                               \
110     /* Sanity-checking fields */                                              \
111     + (s)->hdr->sizeof_addr          /* File address of array owning the block */ \
112     + (s)->hdr->arr_off_size         /* Offset of the block in the array */   \
113                                                                               \
114     /* Extensible Array Super Block specific fields */                        \
115     + ((s)->ndblks * (s)->dblk_page_init_size) /* Data block 'page init' bitmasks in super block (can be 0 if no pages) */ \
116     + ((s)->ndblks * (s)->hdr->sizeof_addr) /* Data block addresses in super block  */ \
117     )
118 
119 /* Size of the extensible array data block prefix on disk */
120 #define H5EA_DBLOCK_PREFIX_SIZE(d)  (                                         \
121     /* General metadata fields */                                             \
122     H5EA_METADATA_PREFIX_SIZE(TRUE)                                           \
123                                                                               \
124     /* Sanity-checking fields */                                              \
125     + (d)->hdr->sizeof_addr          /* File address of array owning the block */ \
126     + (d)->hdr->arr_off_size         /* Offset of the block in the array */   \
127     )
128 
129 /* Size of the extensible array data block on disk */
130 #define H5EA_DBLOCK_SIZE(d)     (                                             \
131     /* Data block prefix size  */                                             \
132     H5EA_DBLOCK_PREFIX_SIZE(d)                                                \
133                                                                               \
134     /* Extensible Array Data Block specific fields */                         \
135     + ((d)->nelmts * (size_t)(d)->hdr->cparam.raw_elmt_size) /* Elements in data block  */  \
136     + ((d)->npages * H5EA_SIZEOF_CHKSUM)        /* Checksum for each page */  \
137     )
138 
139 /* Size of the extensible array data block page on disk */
140 #define H5EA_DBLK_PAGE_SIZE(h)     (					      \
141     + ((h)->dblk_page_nelmts * (size_t)(h)->cparam.raw_elmt_size) /* Elements in data block page */  \
142     + H5EA_SIZEOF_CHKSUM                        /* Checksum for each page */  \
143     )
144 
145 /* Compute the # of bytes required to store an offset into a given buffer size */
146 #define H5EA_SIZEOF_OFFSET_BITS(b)      (((b) + 7) / 8)
147 
148 /* Compute the first super block index that will hold a certain # of data block pointers */
149 #define H5EA_SBLK_FIRST_IDX(m)          (2 * H5VM_log2_of2((uint32_t)m))
150 
151 /****************************/
152 /* Package Private Typedefs */
153 /****************************/
154 
155 /* Information for each super block in extensible array */
156 typedef struct H5EA_sblk_info_t {
157     size_t ndblks;              /* Number of data blocks for a super block */
158     size_t dblk_nelmts;         /* Number of elements in each data block for super block */
159     hsize_t start_idx;          /* Index of first element in super block */
160     hsize_t start_dblk;         /* Index of first data block in super block */
161 } H5EA_sblk_info_t;
162 
163 /* The extensible array header information */
164 /* (Each extensible array header has certain information that is shared across
165  * all the blocks in that extensible array)
166  */
167 typedef struct H5EA_hdr_t {
168     /* Information for H5AC cache functions, _must_ be first field in structure */
169     H5AC_info_t cache_info;
170 
171     /* Extensible array configuration/creation parameters (stored in header) */
172     H5EA_create_t cparam;               /* Creation parameters for extensible array */
173 
174     /* Index block information (stored in header) */
175     haddr_t idx_blk_addr;               /* Address of index block in header */
176 
177     /* Statistics for array (stored in index block, actually) */
178     /* (header and index number/size fields not stored) */
179     H5EA_stat_t stats;                  /* Statistics for extensible array */
180 
181     /* Data block element buffer factory info (not stored in header) */
182     struct {
183         size_t nalloc;                  /* Number of factories allocated */
184         H5FL_fac_head_t **fac;          /* Array of factories for data block element buffers */
185     } elmt_fac;
186 
187     /* Computed/cached values (not stored in header) */
188     size_t rc;                          /* Reference count of heap's components using heap header */
189     haddr_t addr;                       /* Address of header in file */
190     size_t size;                        /* Size of header in file */
191     H5F_t *f;                           /* Pointer to file for extensible array */
192     size_t file_rc;                     /* Reference count of files using array header */
193     hbool_t pending_delete;             /* Array is pending deletion */
194     size_t sizeof_addr;                 /* Size of file addresses */
195     size_t sizeof_size;                 /* Size of file sizes */
196     unsigned char arr_off_size;         /* Size of array offsets (in bytes) */
197 
198     /* Super block information (not stored) */
199     size_t nsblks;                      /* Number of superblocks needed for array */
200     H5EA_sblk_info_t *sblk_info;        /* Array of information for each super block */
201 
202     /* Data block information (not stored) */
203     size_t dblk_page_nelmts;            /* # of elements per data block page */
204 
205     /* Client information (not stored) */
206     void *cb_ctx;                       /* Callback context */
207 
208     /* SWMR / Flush dependency information (not stored) */
209     hbool_t swmr_write;                 /* Flag indicating the file is opened with SWMR-write access */
210     H5AC_proxy_entry_t *top_proxy;      /* 'Top' proxy cache entry for all array entries */
211     void *parent;		        /* Pointer to 'top' proxy flush dependency
212                                          * parent, if it exists, otherwise NULL.
213                                          * If the extensible array is being used
214                                          * to index a chunked dataset and the
215                                          * dataset metadata is modified by a
216                                          * SWMR writer, this field will be set
217                                          * equal to the object header proxy
218                                          * that is the flush dependency parent
219                                          * of the extensible array header.
220  					 *
221  					 * The field is used to avoid duplicate
222 					 * setups of the flush dependency
223 					 * relationship, and to allow the
224 					 * extensible array header to destroy
225 					 * the flush dependency on receipt of
226 					 * an eviction notification from the
227 					 * metadata cache.
228 					 */
229 } H5EA_hdr_t;
230 
231 /* The extensible array index block information */
232 typedef struct H5EA_iblock_t {
233     /* Information for H5AC cache functions, _must_ be first field in structure */
234     H5AC_info_t cache_info;
235 
236     /* Extensible array information (stored) */
237     void        *elmts;         /* Buffer for elements stored in index block  */
238     haddr_t     *dblk_addrs;    /* Buffer for addresses of data blocks in index block */
239     haddr_t     *sblk_addrs;    /* Buffer for addresses of super blocks in index block */
240 
241     /* Internal array information (not stored) */
242     H5EA_hdr_t	*hdr;	        /* Shared array header info                     */
243     haddr_t     addr;           /* Address of this index block on disk          */
244     size_t      size;           /* Size of index block on disk                  */
245 
246     /* SWMR / Flush dependency information (not stored) */
247     H5AC_proxy_entry_t *top_proxy;      /* "Top" proxy cache entry for all array entries */
248 
249     /* Computed/cached values (not stored) */
250     size_t      nsblks;         /* # of super blocks whose data block addresses are in index block */
251     size_t      ndblk_addrs;    /* Number of pointers to data blocks in index block */
252     size_t      nsblk_addrs;    /* Number of pointers to super blocks in index block */
253 } H5EA_iblock_t;
254 
255 /* The extensible array super block information */
256 typedef struct H5EA_sblock_t {
257     /* Information for H5AC cache functions, _must_ be first field in structure */
258     H5AC_info_t cache_info;
259 
260     /* Extensible array information (stored) */
261     hsize_t     block_off;      /* Offset of the block within the array's address space */
262     haddr_t     *dblk_addrs;    /* Addresses of data blocks in super block */
263     uint8_t     *page_init;     /* Bitmap of whether a data block page is initialized */
264 
265     /* Internal array information (not stored) */
266     H5EA_hdr_t  *hdr;           /* Shared array header info                     */
267     haddr_t     addr;           /* Address of this index block on disk          */
268     size_t      size;           /* Size of index block on disk                  */
269 
270     /* SWMR / Flush dependency information (not stored) */
271     hbool_t     has_hdr_depend; /* Whether this object has a flush dependency on the header */
272     H5AC_proxy_entry_t *top_proxy;      /* "Top" proxy cache entry for all array entries */
273     H5EA_iblock_t *parent;      /* Parent object for super block (index block)  */
274 
275     /* Computed/cached values (not stored) */
276     unsigned    idx;            /* Super block index within the extensible array */
277     size_t      ndblks;         /* # of data block addresses that are in super block */
278     size_t      dblk_nelmts;    /* # of elements for data blocks reachable through this super block */
279     size_t      dblk_npages;    /* # of pages in each data block */
280     size_t      dblk_page_init_size;    /* Size of 'page init' bitmask for each data block */
281     size_t      dblk_page_size; /* Size of a data block page */
282 } H5EA_sblock_t;
283 
284 /* The extensible array data block information */
285 typedef struct H5EA_dblock_t {
286     /* Information for H5AC cache functions, _must_ be first field in structure */
287     H5AC_info_t cache_info;
288 
289     /* Extensible array information (stored) */
290     hsize_t     block_off;      /* Offset of the block within the array's address space */
291     void        *elmts;         /* Buffer for elements stored in data block  */
292 
293     /* Internal array information (not stored) */
294     H5EA_hdr_t  *hdr;           /* Shared array header info                             */
295     haddr_t     addr;           /* Address of this data block on disk                   */
296     size_t      size;           /* Size of data block on disk                           */
297 
298     /* SWMR / Flush dependency information (not stored) */
299     hbool_t     has_hdr_depend; /* Whether this object has a flush dependency on the header */
300     H5AC_proxy_entry_t *top_proxy;      /* 'Top' proxy cache entry for all array entries */
301     void        *parent;        /* Parent object for data block (index or super block)  */
302 
303     /* Computed/cached values (not stored) */
304     size_t      nelmts;         /* Number of elements in block                */
305     size_t      npages;         /* Nummber of pages in a block (zero if not paged) */
306 } H5EA_dblock_t;
307 
308 /* The extensible array data block page information */
309 typedef struct H5EA_dbk_page_t {
310     /* Information for H5AC cache functions, _must_ be first field in structure */
311     H5AC_info_t cache_info;
312 
313     /* Extensible array information (stored) */
314     void        *elmts;         /* Buffer for elements stored in data block page */
315 
316     /* Internal array information (not stored) */
317     H5EA_hdr_t  *hdr;           /* Shared array header info                         */
318     haddr_t     addr;           /* Address of this data block page on disk          */
319     size_t      size;           /* Size of data block page on disk                  */
320 
321     /* SWMR / Flush dependency information (not stored) */
322     hbool_t     has_hdr_depend; /* Whether this object has a flush dependency on the header */
323     H5AC_proxy_entry_t *top_proxy;      /* "Top" proxy cache entry for all array entries */
324     H5EA_sblock_t *parent;      /* Parent object for data block page (super block)  */
325 
326     /* Computed/cached values (not stored) */
327     /* <none> */
328 } H5EA_dblk_page_t;
329 
330 /* Extensible array */
331 struct H5EA_t {
332     H5EA_hdr_t  *hdr;           /* Pointer to internal extensible array header info */
333     H5F_t      *f;              /* Pointer to file for extensible array */
334 };
335 
336 /* Metadata cache callback user data types */
337 
338 /* Info needed for loading header */
339 typedef struct H5EA_hdr_cache_ud_t {
340     H5F_t      *f;              /* Pointer to file for extensible array */
341     haddr_t    addr;            /* Address of header on disk */
342     void       *ctx_udata;      /* User context for class */
343 } H5EA_hdr_cache_ud_t;
344 
345 /* Info needed for loading super block */
346 typedef struct H5EA_sblock_cache_ud_t {
347     H5EA_hdr_t    *hdr;         /* Shared extensible array information */
348     H5EA_iblock_t *parent;      /* Pointer to parent object for super block (index block) */
349     unsigned sblk_idx;          /* Index of super block */
350     haddr_t sblk_addr;          /* Address of super block */
351 } H5EA_sblock_cache_ud_t;
352 
353 /* Info needed for loading data block */
354 typedef struct H5EA_dblock_cache_ud_t {
355     H5EA_hdr_t    *hdr;         /* Shared extensible array information */
356     void *parent;               /* Pointer to parent object for data block (index or super block) */
357     size_t nelmts;              /* Number of elements in data block */
358     haddr_t dblk_addr;          /* Address of data block */
359 } H5EA_dblock_cache_ud_t;
360 
361 /* Info needed for loading data block page */
362 typedef struct H5EA_dblk_page_cache_ud_t {
363     H5EA_hdr_t    *hdr;         /* Shared extensible array information */
364     H5EA_sblock_t *parent;      /* Pointer to parent object for data block page (super block) */
365     haddr_t dblk_page_addr;     /* Address of data block page */
366 } H5EA_dblk_page_cache_ud_t;
367 
368 #ifdef H5EA_TESTING
369 typedef struct H5EA__ctx_cb_t {
370     herr_t (*encode)(const void *elmt, size_t nelmts, void *udata);   /* Perform action during encode step */
371     void *udata;                /* User data for encode action */
372 } H5EA__ctx_cb_t;
373 #endif /* H5EA_TESTING */
374 
375 /*****************************/
376 /* Package Private Variables */
377 /*****************************/
378 
379 /* Internal extensible array testing class */
380 H5_DLLVAR const H5EA_class_t H5EA_CLS_TEST[1];
381 
382 /* Array of extensible array client ID -> client class mappings */
383 H5_DLLVAR const H5EA_class_t *const H5EA_client_class_g[H5EA_NUM_CLS_ID];
384 
385 
386 /******************************/
387 /* Package Private Prototypes */
388 /******************************/
389 
390 /* Generic routines */
391 H5_DLL herr_t H5EA__create_flush_depend(H5AC_info_t *parent_entry,
392     H5AC_info_t *child_entry);
393 H5_DLL herr_t H5EA__destroy_flush_depend(H5AC_info_t *parent_entry,
394     H5AC_info_t *child_entry);
395 
396 /* Header routines */
397 H5_DLL H5EA_hdr_t *H5EA__hdr_alloc(H5F_t *f);
398 H5_DLL herr_t H5EA__hdr_init(H5EA_hdr_t *hdr, void *ctx_udata);
399 H5_DLL haddr_t H5EA__hdr_create(H5F_t *f, const H5EA_create_t *cparam,
400     void *ctx_udata);
401 H5_DLL void *H5EA__hdr_alloc_elmts(H5EA_hdr_t *hdr, size_t nelmts);
402 H5_DLL herr_t H5EA__hdr_free_elmts(H5EA_hdr_t *hdr, size_t nelmts, void *elmts);
403 H5_DLL herr_t H5EA__hdr_incr(H5EA_hdr_t *hdr);
404 H5_DLL herr_t H5EA__hdr_decr(H5EA_hdr_t *hdr);
405 H5_DLL herr_t H5EA__hdr_fuse_incr(H5EA_hdr_t *hdr);
406 H5_DLL size_t H5EA__hdr_fuse_decr(H5EA_hdr_t *hdr);
407 H5_DLL herr_t H5EA__hdr_modified(H5EA_hdr_t *hdr);
408 H5_DLL H5EA_hdr_t *H5EA__hdr_protect(H5F_t *f, haddr_t ea_addr,
409     void *ctx_udata, unsigned flags);
410 H5_DLL herr_t H5EA__hdr_unprotect(H5EA_hdr_t *hdr, unsigned cache_flags);
411 H5_DLL herr_t H5EA__hdr_delete(H5EA_hdr_t *hdr);
412 H5_DLL herr_t H5EA__hdr_dest(H5EA_hdr_t *hdr);
413 
414 /* Index block routines */
415 H5_DLL H5EA_iblock_t *H5EA__iblock_alloc(H5EA_hdr_t *hdr);
416 H5_DLL haddr_t H5EA__iblock_create(H5EA_hdr_t *hdr, hbool_t *stats_changed);
417 H5_DLL H5EA_iblock_t *H5EA__iblock_protect(H5EA_hdr_t *hdr, unsigned flags);
418 H5_DLL herr_t H5EA__iblock_unprotect(H5EA_iblock_t *iblock, unsigned cache_flags);
419 H5_DLL herr_t H5EA__iblock_delete(H5EA_hdr_t *hdr);
420 H5_DLL herr_t H5EA__iblock_dest(H5EA_iblock_t *iblock);
421 
422 /* Super block routines */
423 H5_DLL H5EA_sblock_t *H5EA__sblock_alloc(H5EA_hdr_t *hdr, H5EA_iblock_t *parent,
424     unsigned sblk_idx);
425 H5_DLL haddr_t H5EA__sblock_create(H5EA_hdr_t *hdr, H5EA_iblock_t *parent,
426     hbool_t *stats_changed, unsigned sblk_idx);
427 H5_DLL H5EA_sblock_t *H5EA__sblock_protect(H5EA_hdr_t *hdr, H5EA_iblock_t *parent,
428     haddr_t sblk_addr, unsigned sblk_idx, unsigned flags);
429 H5_DLL herr_t H5EA__sblock_unprotect(H5EA_sblock_t *sblock, unsigned cache_flags);
430 H5_DLL herr_t H5EA__sblock_delete(H5EA_hdr_t *hdr, H5EA_iblock_t *parent,
431     haddr_t sblk_addr, unsigned sblk_idx);
432 H5_DLL herr_t H5EA__sblock_dest(H5EA_sblock_t *sblock);
433 
434 /* Data block routines */
435 H5_DLL H5EA_dblock_t *H5EA__dblock_alloc(H5EA_hdr_t *hdr, void *parent,
436     size_t nelmts);
437 H5_DLL haddr_t H5EA__dblock_create(H5EA_hdr_t *hdr, void *parent,
438     hbool_t *stats_changed, hsize_t dblk_off, size_t nelmts);
439 H5_DLL unsigned H5EA__dblock_sblk_idx(const H5EA_hdr_t *hdr, hsize_t idx);
440 H5_DLL H5EA_dblock_t *H5EA__dblock_protect(H5EA_hdr_t *hdr, void *parent,
441     haddr_t dblk_addr, size_t dblk_nelmts, unsigned flags);
442 H5_DLL herr_t H5EA__dblock_unprotect(H5EA_dblock_t *dblock, unsigned cache_flags);
443 H5_DLL herr_t H5EA__dblock_delete(H5EA_hdr_t *hdr, void *parent,
444     haddr_t dblk_addr, size_t dblk_nelmts);
445 H5_DLL herr_t H5EA__dblock_dest(H5EA_dblock_t *dblock);
446 
447 /* Data block page routines */
448 H5_DLL H5EA_dblk_page_t *H5EA__dblk_page_alloc(H5EA_hdr_t *hdr, H5EA_sblock_t *parent);
449 H5_DLL herr_t H5EA__dblk_page_create(H5EA_hdr_t *hdr, H5EA_sblock_t *parent,
450     haddr_t addr);
451 H5_DLL H5EA_dblk_page_t *H5EA__dblk_page_protect(H5EA_hdr_t *hdr,
452     H5EA_sblock_t *parent, haddr_t dblk_page_addr, unsigned flags);
453 H5_DLL herr_t H5EA__dblk_page_unprotect(H5EA_dblk_page_t *dblk_page,
454     unsigned cache_flags);
455 H5_DLL herr_t H5EA__dblk_page_dest(H5EA_dblk_page_t *dblk_page);
456 
457 /* Debugging routines for dumping file structures */
458 H5_DLL herr_t H5EA__hdr_debug(H5F_t *f, haddr_t addr,
459     FILE *stream, int indent, int fwidth, const H5EA_class_t *cls, haddr_t obj_addr);
460 H5_DLL herr_t H5EA__iblock_debug(H5F_t *f, haddr_t addr,
461     FILE *stream, int indent, int fwidth, const H5EA_class_t *cls,
462     haddr_t hdr_addr, haddr_t obj_addr);
463 H5_DLL herr_t H5EA__sblock_debug(H5F_t *f, haddr_t addr,
464     FILE *stream, int indent, int fwidth, const H5EA_class_t *cls,
465     haddr_t hdr_addr, unsigned sblk_idx, haddr_t obj_addr);
466 H5_DLL herr_t H5EA__dblock_debug(H5F_t *f, haddr_t addr,
467     FILE *stream, int indent, int fwidth, const H5EA_class_t *cls,
468     haddr_t hdr_addr, size_t dblk_nelmts, haddr_t obj_addr);
469 
470 /* Testing routines */
471 #ifdef H5EA_TESTING
472 H5_DLL herr_t H5EA_get_cparam_test(const H5EA_t *ea, H5EA_create_t *cparam);
473 H5_DLL int H5EA_cmp_cparam_test(const H5EA_create_t *cparam1, const H5EA_create_t *cparam2);
474 #endif /* H5EA_TESTING */
475 
476 #endif /* _H5EApkg_H */
477 
478