H5MFpkg.h

00001 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
00002  * Copyright by The HDF Group.                                               *
00003  * Copyright by the Board of Trustees of the University of Illinois.         *
00004  * All rights reserved.                                                      *
00005  *                                                                           *
00006  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
00007  * terms governing use, modification, and redistribution, is contained in    *
00008  * the files COPYING and Copyright.html.  COPYING can be found at the root   *
00009  * of the source code distribution tree; Copyright.html can be found at the  *
00010  * root level of an installed copy of the electronic HDF5 document set and   *
00011  * is linked from the top-level documents page.  It can also be found at     *
00012  * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
00013  * access to either file, you may request a copy from help@hdfgroup.org.     *
00014  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
00015 
00016 /*
00017  * Programmer:  Quincey Koziol <koziol@hdfgroup.org>
00018  *              Tuesday, January 8, 2008
00019  *
00020  * Purpose:     This file contains declarations which are visible only within
00021  *              the H5MF package.  Source files outside the H5MF package should
00022  *              include H5MFprivate.h instead.
00023  */
00024 #ifndef H5MF_PACKAGE
00025 #error "Do not include this file outside the H5MF package!"
00026 #endif
00027 
00028 #ifndef _H5MFpkg_H
00029 #define _H5MFpkg_H
00030 
00031 /* Get package's private header */
00032 #include "H5MFprivate.h"
00033 
00034 /* Other private headers needed by this file */
00035 #include "H5FSprivate.h"        /* File free space                      */
00036 
00037 
00038 /**************************/
00039 /* Package Private Macros */
00040 /**************************/
00041 
00042 /* Define this to display information about file allocations */
00043 /* #define H5MF_ALLOC_DEBUG */
00044 
00045 /* Define this to display more information about file allocations */
00046 /* #define H5MF_ALLOC_DEBUG_MORE */
00047 
00048 /* Define this to display more information about block aggregator actions */
00049 /* #define H5MF_AGGR_DEBUG */
00050 
00051 /* Define this to dump free space tracker contents after they've been modified */
00052 /* #define H5MF_ALLOC_DEBUG_DUMP */
00053 
00054 /* Free space section types for file */
00055 /* (values stored in free space data structures in file) */
00056 #define H5MF_FSPACE_SECT_SIMPLE         0       /* Section is a range of actual bytes in file */
00057 
00058 
00059 /****************************/
00060 /* Package Private Typedefs */
00061 /****************************/
00062 
00063 /* File free space section info */
00064 typedef struct H5MF_free_section_t {
00065     H5FS_section_info_t sect_info;              /* Free space section information (must be first in struct) */
00066 #ifdef NOT_YET
00067     union {
00068         struct {
00069             H5HF_indirect_t *parent;            /* Indirect block parent for free section's direct block */
00070             unsigned par_entry;                 /* Entry of free section's direct block in parent indirect block */
00071         } single;
00072         struct {
00073             struct H5HF_free_section_t *under;  /* Pointer to indirect block underlying row section */
00074             unsigned    row;                    /* Row for range of blocks */
00075             unsigned    col;                    /* Column for range of blocks */
00076             unsigned    num_entries;            /* Number of entries covered */
00077 
00078             /* Fields that aren't stored */
00079             hbool_t     checked_out;            /* Flag to indicate that a row section is temporarily out of the free space manager */
00080         } row;
00081         struct {
00082             /* Holds either a pointer to an indirect block (if its "live") or
00083              *  the block offset of it's indirect block (if its "serialized")
00084              *  (This allows the indirect block that the section is within to
00085              *          be compared with other sections, whether it's serialized
00086              *          or not)
00087              */
00088             union {
00089                 H5HF_indirect_t *iblock;        /* Indirect block for free section */
00090                 hsize_t iblock_off;             /* Indirect block offset in "heap space" */
00091             } u;
00092             unsigned    row;                    /* Row for range of blocks */
00093             unsigned    col;                    /* Column for range of blocks */
00094             unsigned    num_entries;            /* Number of entries covered */
00095 
00096             /* Fields that aren't stored */
00097             struct H5HF_free_section_t *parent; /* Pointer to "parent" indirect section */
00098             unsigned    par_entry;              /* Entry within parent indirect section */
00099             hsize_t     span_size;              /* Size of space tracked, in "heap space" */
00100             unsigned    iblock_entries;         /* Number of entries in indirect block where section is located */
00101             unsigned    rc;                     /* Reference count of outstanding row & child indirect sections */
00102             unsigned    dir_nrows;              /* Number of direct rows in section */
00103             struct H5HF_free_section_t **dir_rows;  /* Array of pointers to outstanding row sections */
00104             unsigned    indir_nents;            /* Number of indirect entries in section */
00105             struct H5HF_free_section_t **indir_ents; /* Array of pointers to outstanding child indirect sections */
00106         } indirect;
00107     } u;
00108 #endif /* NOT_YET */
00109 } H5MF_free_section_t;
00110 
00111 /* Type of "container shrink" operation to perform */
00112 typedef enum {
00113     H5MF_SHRINK_EOA,            /* Section should shrink the EOA value */
00114     H5MF_SHRINK_AGGR_ABSORB_SECT,    /* Section should merge into the aggregator block */
00115     H5MF_SHRINK_SECT_ABSORB_AGGR     /* Aggregator block should merge into the section */
00116 } H5MF_shrink_type_t;
00117 
00118 /* User data for free space manager section callbacks */
00119 typedef struct H5MF_sect_ud_t {
00120     /* Down */
00121     H5F_t *f;                   /* Pointer to file to operate on */
00122     hid_t dxpl_id;              /* DXPL for VFD operations */
00123     H5FD_mem_t alloc_type;      /* Type of memory being allocated */
00124     hbool_t allow_sect_absorb;  /* Whether sections are allowed to absorb a block aggregator */
00125 
00126     /* Up */
00127     H5MF_shrink_type_t shrink;  /* Type of shrink operation to perform */
00128     H5F_blk_aggr_t *aggr;       /* Aggregator block to operate on */
00129 } H5MF_sect_ud_t;
00130 
00131 
00132 /*****************************/
00133 /* Package Private Variables */
00134 /*****************************/
00135 
00136 /* H5MF single section inherits serializable properties from H5FS_section_class_t */
00137 H5_DLLVAR H5FS_section_class_t H5MF_FSPACE_SECT_CLS_SIMPLE[1];
00138 
00139 
00140 /******************************/
00141 /* Package Private Prototypes */
00142 /******************************/
00143 
00144 /* Allocator routines */
00145 H5_DLL herr_t H5MF_alloc_start(H5F_t *f, hid_t dxpl_id, H5FD_mem_t type,
00146     hbool_t may_create);
00147 H5_DLL herr_t H5MF_sects_dump(H5F_t *f, hid_t dxpl_id, FILE *stream);
00148 
00149 /* 'simple' section routines */
00150 H5_DLL H5MF_free_section_t *H5MF_sect_simple_new(haddr_t sect_off,
00151     hsize_t sect_size);
00152 H5_DLL htri_t H5MF_sect_simple_can_shrink(const H5FS_section_info_t *_sect,
00153     void *udata);
00154 H5_DLL herr_t H5MF_sect_simple_shrink(H5FS_section_info_t **_sect,
00155     void *udata);
00156 H5_DLL herr_t H5MF_sect_simple_free(H5FS_section_info_t *sect);
00157 
00158 /* Block aggregator routines */
00159 H5_DLL haddr_t H5MF_aggr_alloc(H5F_t *f, hid_t dxpl_id, H5F_blk_aggr_t *aggr,
00160     H5F_blk_aggr_t *other_aggr, H5FD_mem_t type, hsize_t size);
00161 H5_DLL htri_t H5MF_aggr_try_extend(const H5F_t *f, H5F_blk_aggr_t *aggr,
00162     H5FD_mem_t type, haddr_t abs_blk_end, hsize_t extra_requested);
00163 H5_DLL htri_t H5MF_aggr_can_absorb(const H5F_t *f, const H5F_blk_aggr_t *aggr,
00164     const H5MF_free_section_t *sect, H5MF_shrink_type_t *shrink);
00165 H5_DLL herr_t H5MF_aggr_absorb(const H5F_t *f, H5F_blk_aggr_t *aggr,
00166     H5MF_free_section_t *sect, hbool_t allow_sect_absorb);
00167 H5_DLL herr_t H5MF_aggr_query(const H5F_t *f, const H5F_blk_aggr_t *aggr,
00168     haddr_t *addr, hsize_t *size);
00169 
00170 /* Testing routines */
00171 #ifdef H5MF_TESTING
00172 #endif /* H5MF_TESTING */
00173 
00174 #endif /* _H5MFpkg_H */
00175