summaryrefslogtreecommitdiffstats
path: root/src/H5FSpkg.h
blob: 08c25298ed71a6c6e8478332571bd8de63f339d0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 * Copyright by The HDF Group.                                               *
 * Copyright by the Board of Trustees of the University of Illinois.         *
 * All rights reserved.                                                      *
 *                                                                           *
 * This file is part of HDF5.  The full HDF5 copyright notice, including     *
 * terms governing use, modification, and redistribution, is contained in    *
 * the files COPYING and Copyright.html.  COPYING can be found at the root   *
 * of the source code distribution tree; Copyright.html can be found at the  *
 * root level of an installed copy of the electronic HDF5 document set and   *
 * is linked from the top-level documents page.  It can also be found at     *
 * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
 * access to either file, you may request a copy from help@hdfgroup.org.     *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

/*
 * Programmer:  Quincey Koziol <koziol@hdfgroup.org>
 *              Tuesday, May  2, 2006
 *
 * Purpose:     This file contains declarations which are visible only within
 *              the H5FS package.  Source files outside the H5FS package should
 *              include H5FSprivate.h instead.
 */
#if !(defined H5FS_FRIEND || defined H5FS_MODULE)
#error "Do not include this file outside the H5FS package!"
#endif

#ifndef _H5FSpkg_H
#define _H5FSpkg_H

/* Uncomment this macro to enable debugging output for free space manager */
/* #define H5FS_DEBUG */

/* Uncomment this macro to enable debugging output for free space sections */
/* #define H5FS_SINFO_DEBUG */

/* Uncomment this macro to enable extra sanity checking */
/* #define H5FS_DEBUG_ASSERT */

/* Get package's private header */
#include "H5FSprivate.h"    /* File free space                      */

/* Other private headers needed by this file */
#include "H5ACprivate.h"    /* Metadata cache                       */
#include "H5SLprivate.h"    /* Skip lists                           */

/**************************/
/* Package Private Macros */
/**************************/

/* Size of checksum information (on disk) */
#define H5FS_SIZEOF_CHKSUM      4

/* "Standard" size of prefix information for free space metadata */
#define H5FS_METADATA_PREFIX_SIZE (                                           \
    H5_SIZEOF_MAGIC   /* Signature */                                         \
    + 1 /* Version */                                                         \
    + H5FS_SIZEOF_CHKSUM /* Metadata checksum */                              \
    )

/* Size of the fractal heap header on disk */
#define H5FS_HEADER_SIZE(f) (                                                 \
    /* General metadata fields */                                             \
    H5FS_METADATA_PREFIX_SIZE                                                 \
                                                                              \
    /* Free space header specific fields */                                   \
    + 1 /* Client ID */                                                       \
    + H5F_SIZEOF_SIZE(f) /* Total free space tracked */                       \
    + H5F_SIZEOF_SIZE(f) /* Total # of sections tracked */                    \
    + H5F_SIZEOF_SIZE(f) /* # of serializable sections tracked */             \
    + H5F_SIZEOF_SIZE(f) /* # of ghost sections tracked */                    \
    + 2 /* Number of section classes */                                       \
    + 2 /* Shrink percent */                                                  \
    + 2 /* Expand percent */                                                  \
    + 2 /* Size of address space for sections (log2 of value) */              \
    + H5F_SIZEOF_SIZE(f) /* Max. size of section to track */                  \
    + H5F_SIZEOF_ADDR(f) /* Address of serialized free space sections */      \
    + H5F_SIZEOF_SIZE(f) /* Size of serialized free space sections used */    \
    + H5F_SIZEOF_SIZE(f) /* Allocated size of serialized free space sections */ \
    )

/* Size of the free space serialized sections on disk */
#define H5FS_SINFO_PREFIX_SIZE(f) (                                           \
    /* General metadata fields */                                             \
    H5FS_METADATA_PREFIX_SIZE                                                 \
                                                                              \
    /* Free space serialized sections specific fields */                      \
    + H5F_SIZEOF_ADDR(f) /* Address of free space header for these sections */ \
    )


/****************************/
/* Package Private Typedefs */
/****************************/

/* Callback info for loading a free space header into the cache */
typedef struct H5FS_hdr_cache_ud_t {
    H5F_t *f;                  /* File that free space header is within */
    uint16_t nclasses;                            /* Number of section classes */
    const H5FS_section_class_t **classes;       /* Array of section class info */
    void *cls_init_udata;                       /* Pointer to class init user data */
    haddr_t addr;              /* Address of header */
} H5FS_hdr_cache_ud_t;

/* Callback info for loading free space section info into the cache */
typedef struct H5FS_sinfo_cache_ud_t {
    H5F_t *f;                  /* File that free space section info is within */
    H5FS_t *fspace;            /* free space manager */
    hid_t dxpl_id;
} H5FS_sinfo_cache_ud_t;

/* Free space section bin info */
typedef struct H5FS_bin_t {
    size_t tot_sect_count;      /* Total # of sections in this bin */
    size_t serial_sect_count;   /* # of serializable sections in this bin */
    size_t ghost_sect_count;    /* # of un-serializable sections in this bin */
    H5SL_t *bin_list;           /* Skip list of differently sized sections */
} H5FS_bin_t;

/* Free space node for free space sections of the same size */
typedef struct H5FS_node_t {
    hsize_t sect_size;          /* Size of all sections on list */
    size_t serial_count;        /* # of serializable sections on list */
    size_t ghost_count;         /* # of un-serializable sections on list */
    H5SL_t *sect_list;          /* Skip list to hold pointers to actual free list section node */
} H5FS_node_t;

/* Free space section info */
typedef struct H5FS_sinfo_t {
    /* Information for H5AC cache functions, _must_ be first field in structure */
    H5AC_info_t cache_info;

/* Stored information */
    H5FS_bin_t *bins;           /* Array of lists of lists of free sections   */

/* Computed/cached values */
    hbool_t dirty;              /* Whether this info in memory is out of sync w/info in file */
    unsigned nbins;             /* Number of bins                             */
    size_t serial_size;         /* Total size of all serializable sections    */
    size_t tot_size_count;      /* Total number of differently sized sections */
    size_t serial_size_count;   /* Total number of differently sized serializable sections */
    size_t ghost_size_count;    /* Total number of differently sized un-serializable sections */
    unsigned sect_prefix_size;  /* Size of the section serialization prefix (in bytes) */
    unsigned sect_off_size;     /* Size of a section offset (in bytes)        */
    unsigned sect_len_size;     /* Size of a section length (in bytes)        */
    H5FS_t *fspace;             /* Pointer to free space manager that owns sections */

/* Memory data structures (not stored directly) */
    H5SL_t *merge_list;         /* Skip list to hold sections for detecting merges */
} H5FS_sinfo_t;

/* Free space header info */
struct H5FS_t {
    /* Information for H5AC cache functions, _must_ be first field in structure */
    H5AC_info_t cache_info;

/* Stored information */
    /* Statistics about sections managed */
    hsize_t tot_space;          /* Total amount of space tracked              */
    hsize_t tot_sect_count;     /* Total # of sections tracked                */
    hsize_t serial_sect_count;  /* # of serializable sections tracked         */
    hsize_t ghost_sect_count;   /* # of un-serializable sections tracked      */

    /* Creation parameters */
    H5FS_client_t client;       /* Type of user of this free space manager    */
    uint16_t nclasses;         /* Number of section classes handled          */
    unsigned shrink_percent;    /* Percent of "normal" serialized size to shrink serialized space at */
    unsigned expand_percent;    /* Percent of "normal" serialized size to expand serialized space at */
    unsigned max_sect_addr;     /* Size of address space free sections are within (log2 of actual value) */
    hsize_t max_sect_size;      /* Maximum size of section to track */

    /* Serialized section information */
    haddr_t sect_addr;          /* Address of the section info in the file    */
    hsize_t sect_size;          /* Size of the section info in the file       */
    hsize_t alloc_sect_size;    /* Allocated size of the section info in the file */

/* Computed/cached values */
    unsigned rc;                /* Count of outstanding references to struct  */
    haddr_t addr;               /* Address of free space header on disk       */
    size_t hdr_size;            /* Size of free space header on disk          */
    H5FS_sinfo_t *sinfo;        /* Section information                        */
    unsigned sinfo_lock_count;  /* # of times the section info has been locked */
    hbool_t sinfo_protected;    /* Whether the section info was protected when locked */
    hbool_t sinfo_modified;     /* Whether the section info has been modified while locked */
    unsigned sinfo_accmode;     /* Access mode for protecting the section info */
                                /* must be either H5C__NO_FLAGS_SET (i.e r/w)  */
				/* or H5AC__READ_ONLY_FLAG (i.e. r/o).         */
    size_t max_cls_serial_size; /* Max. additional size of serialized form of section */
    hsize_t    threshold;      	/* Threshold for alignment              */
    hsize_t    alignment;      	/* Alignment                            */


/* Memory data structures (not stored directly) */
    H5FS_section_class_t *sect_cls; /* Array of section classes for this free list */
};


/*****************************/
/* Package Private Variables */
/*****************************/

/* H5FS header inherits cache-like properties from H5AC */
H5_DLLVAR const H5AC_class_t H5AC_FSPACE_HDR[1];

/* H5FS section info inherits cache-like properties from H5AC */
H5_DLLVAR const H5AC_class_t H5AC_FSPACE_SINFO[1];

/* Declare a free list to manage the H5FS_node_t struct */
H5FL_EXTERN(H5FS_node_t);

/* Declare a free list to manage the H5FS_bin_t sequence information */
H5FL_SEQ_EXTERN(H5FS_bin_t);

/* Declare a free list to manage the H5FS_sinfo_t struct */
H5FL_EXTERN(H5FS_sinfo_t);

/* Declare a free list to manage the H5FS_t struct */
H5FL_EXTERN(H5FS_t);


/******************************/
/* Package Private Prototypes */
/******************************/

/* Free space manager header routines */
H5_DLL H5FS_t *H5FS__new(const H5F_t *f, uint16_t nclasses,
    const H5FS_section_class_t *classes[], void *cls_init_udata);
H5_DLL herr_t H5FS_incr(H5FS_t *fspace);
H5_DLL herr_t H5FS_decr(H5FS_t *fspace);
H5_DLL herr_t H5FS_dirty(H5FS_t *fspace);

/* Free space section routines */
H5_DLL H5FS_sinfo_t *H5FS_sinfo_new(H5F_t *f, H5FS_t *fspace);

/* Routines for destroying structures */
H5_DLL herr_t H5FS__hdr_dest(H5FS_t *hdr);
H5_DLL herr_t H5FS_sinfo_dest(H5FS_sinfo_t *sinfo);

/* Sanity check routines */
#ifdef H5FS_DEBUG
H5_DLL herr_t H5FS_assert(const H5FS_t *fspace);
H5_DLL herr_t H5FS_sect_assert(const H5FS_t *fspace);
#endif /* H5FS_DEBUG */

/* Testing routines */
#ifdef H5FS_TESTING
H5_DLL herr_t H5FS_get_cparam_test(const H5FS_t *fh, H5FS_create_t *cparam);
H5_DLL int H5FS_cmp_cparam_test(const H5FS_create_t *cparam1, const H5FS_create_t *cparam2);
#endif /* H5FS_TESTING */

#endif /* _H5FSpkg_H */