typedef struct H5C_class_t {
    int         id;
    H5C_load_func_t load;
    H5C_flush_func_t    flush;
    H5C_dest_func_t dest;
    H5C_clear_func_t    clear;
    H5C_size_func_t size;
} H5C_class_t;
/* Type defintions of call back functions used by the cache as a whole */
/* Type definitions of call back functions used by the cache as a whole */
typedef herr_t (*H5C_write_permitted_func_t)(const H5F_t *f,
                                             hid_t dxpl_id,
                                             hbool_t * write_permitted_ptr);
typedef herr_t (*H5C_log_flush_func_t)(H5C_t * cache_ptr,
                                       haddr_t addr,
                                       hbool_t was_dirty,
                                       unsigned flags,
                                       int type_id);
 * size of the hash table (H5C__HASH_TABLE_LEN in H5Cpkg.h).  The current
 * upper bound on cache size is rather large for the current hash table
 * size.
 */
#define H5C__MAX_MAX_CACHE_SIZE     ((size_t)(128 * 1024 * 1024))
#define H5C__MIN_MAX_CACHE_SIZE     ((size_t)(1024))
/* Default max cache size and min clean size are give here to make
 * them generally accessable.
 * them generally accessible.
 */
#define H5C__DEFAULT_MAX_CACHE_SIZE     ((size_t)(4 * 1024 * 1024))
#define H5C__DEFAULT_MIN_CLEAN_SIZE     ((size_t)(2 * 1024 * 1024))
/****************************************************************************
 *
 * structure H5C_cache_entry_t
 *
 *
 *      This flag is used in the case that such an advisory is
 *      received when the entry is protected.  If it is set when an
 *      entry is unprotected, and the dirtied flag is not set in
 *      the unprotect, the entry's is_dirty flag is reset by flushing
 *      it with the H5C__FLUSH_CLEAR_ONLY_FLAG.
 *
 * flush_immediately:  Boolean flag used only in Phdf5 -- and then only 
 *      for H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED.
 *
 *      When a destributed metadata write is triggered at a 
 *      When a distributed metadata write is triggered at a 
 *      sync point, this field is used to mark entries that 
 *      must be flushed before leaving the sync point.  At all
 *      other times, this field should be set to FALSE.
 *
 * flush_in_progress:  Boolean flag that is set to true iff the entry
 *      is in the process of being flushed.  This allows the cache
 *      to detect when a call is the result of a flush callback.
 *
 * destroy_in_progress:  Boolean flag that is set to true iff the entry
 *      is in the process of being flushed and destroyed.
 *
 * apply_max_increment:  Boolean flag indicating whether the max_increment
 *  field should be used to limit the maximum cache size increment.
 *
 * max_increment: If enabled by the apply_max_increment field described
 *  above, this field contains the maximum number of bytes by which the
 *  cache size can be increased in a single re-size.
 *
 * flash_incr_mode:  Instance of the H5C_cache_flash_incr_mode enumerated
 *      type whose value indicates whether and by what algorithm we should
 *      make flash increases in the size of the cache to accomodate insertion
 *      make flash increases in the size of the cache to accommodate insertion
 *      of large entries and large increases in the size of a single entry.
 *
 *      The addition of the flash increment mode was occasioned by performance
 *      problems that appear when a local heap is increased to a size in excess
 *      of the current cache size.  While the existing re-size code dealt with
 *      this eventually, performance was very bad for the remainder of the
 *      epoch.
 *
 *      At present, there are two possible values for the flash_incr_mode:
 *