summaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authorJohn Mainzer <mainzer@hdfgroup.org>2004-12-18 01:30:34 (GMT)
committerJohn Mainzer <mainzer@hdfgroup.org>2004-12-18 01:30:34 (GMT)
commit5c415042a3e1d5480ff5309ddce29b4f6be753d7 (patch)
treee43b7c6185050281863b369d2e91580b98851755 /test
parentc8645048e2e4e346118e79c876f2b86608330af9 (diff)
downloadhdf5-5c415042a3e1d5480ff5309ddce29b4f6be753d7.zip
hdf5-5c415042a3e1d5480ff5309ddce29b4f6be753d7.tar.gz
hdf5-5c415042a3e1d5480ff5309ddce29b4f6be753d7.tar.bz2
[svn-r9687] Purpose:
Modify the cache code (H5C) to support automatic cache resizing to adapt to the work load at run time. Description: Different applications require different sized caches to maintain an acceptable hit rate. This set of changes attempts to provide the ability to adjust to circumstances automatically. Solution: Added highly configurable code to allow the user to either set a fixed cache size, or allow the cache to grow and shrink according to conditions. If enabled, cache size increases are triggered when the hit rate drops below a user specified threshold in a user specified interval. Cache size reductions (if enabled) are triggered when either the hit rate exceeds some user specified threshold over a user specified interval, when the cache contains "enough" entries that haven't been accessed for a user specified interval, or some mix of the above. See the header comments on the H5C_auto_size_ctl_t structure in H5Cprivate.h for further details. At present, the cache resize configuration options are not accessible via the user API. Must add this. Platforms tested: h5committested, heping (serial), and copper (parallel) Misc. update:
Diffstat (limited to 'test')
-rw-r--r--test/cache.c10381
1 files changed, 10282 insertions, 99 deletions
diff --git a/test/cache.c b/test/cache.c
index bdd27d1..9b01c2e 100644
--- a/test/cache.c
+++ b/test/cache.c
@@ -26,8 +26,10 @@ const char *FILENAME[] = {
NULL
};
+#define H5C_PACKAGE /*suppress error about including H5Cpkg */
+
#include "H5TBprivate.h"
-#include "H5Cprivate.h"
+#include "H5Cpkg.h"
/* with apologies for the abuse of terminology... */
@@ -151,7 +153,6 @@ typedef struct test_entry_t
* updated as necessary.
*/
-#define H5C__HASH_TABLE_LEN (32 * 1024) /* must be a power of 2 */
#define H5C__HASH_MASK ((size_t)(H5C__HASH_TABLE_LEN - 1) << 3)
#define H5C__HASH_FCN(x) (int)(((x) & H5C__HASH_MASK) >> 3)
@@ -216,100 +217,6 @@ if ( ( (cache_ptr) == NULL ) || \
} \
}
-
-/* The following is a local copy of the H5C_t structure -- any changes in
- * that structure must be reproduced here. The typedef is used to allow
- * local access to the cache's private data.
- */
-
-#define H5C__H5C_T_MAGIC 0x005CAC0E
-#define H5C__MAX_NUM_TYPE_IDS 9
-
-typedef struct local_H5C_t
-{
- uint32_t magic;
-
- int32_t max_type_id;
- const char * (* type_name_table_ptr);
-
- size_t max_cache_size;
- size_t min_clean_size;
-
- H5C_write_permitted_func_t check_write_permitted;
-
- int32_t index_len;
- size_t index_size;
- H5C_cache_entry_t * (index[H5C__HASH_TABLE_LEN]);
-
-
- int32_t tree_len;
- size_t tree_size;
- H5TB_TREE * tree_ptr;
-
- int32_t pl_len;
- size_t pl_size;
- H5C_cache_entry_t * pl_head_ptr;
- H5C_cache_entry_t * pl_tail_ptr;
-
- int32_t LRU_list_len;
- size_t LRU_list_size;
- H5C_cache_entry_t * LRU_head_ptr;
- H5C_cache_entry_t * LRU_tail_ptr;
-
- int32_t cLRU_list_len;
- size_t cLRU_list_size;
- H5C_cache_entry_t * cLRU_head_ptr;
- H5C_cache_entry_t * cLRU_tail_ptr;
-
- int32_t dLRU_list_len;
- size_t dLRU_list_size;
- H5C_cache_entry_t * dLRU_head_ptr;
- H5C_cache_entry_t * dLRU_tail_ptr;
-
-#if H5C_COLLECT_CACHE_STATS
-
- /* stats fields */
- int64_t hits[H5C__MAX_NUM_TYPE_IDS];
- int64_t misses[H5C__MAX_NUM_TYPE_IDS];
- int64_t insertions[H5C__MAX_NUM_TYPE_IDS];
- int64_t clears[H5C__MAX_NUM_TYPE_IDS];
- int64_t flushes[H5C__MAX_NUM_TYPE_IDS];
- int64_t evictions[H5C__MAX_NUM_TYPE_IDS];
- int64_t renames[H5C__MAX_NUM_TYPE_IDS];
-
- int64_t total_ht_insertions;
- int64_t total_ht_deletions;
- int64_t successful_ht_searches;
- int64_t total_successful_ht_search_depth;
- int64_t failed_ht_searches;
- int64_t total_failed_ht_search_depth;
-
- int32_t max_index_len;
- size_t max_index_size;
-
- int32_t max_tree_len;
- size_t max_tree_size;
-
- int32_t max_pl_len;
- size_t max_pl_size;
-
-#if H5C_COLLECT_CACHE_ENTRY_STATS
-
- int32_t max_accesses[H5C__MAX_NUM_TYPE_IDS];
- int32_t min_accesses[H5C__MAX_NUM_TYPE_IDS];
- int32_t max_clears[H5C__MAX_NUM_TYPE_IDS];
- int32_t max_flushes[H5C__MAX_NUM_TYPE_IDS];
- size_t max_size[H5C__MAX_NUM_TYPE_IDS];
-
-#endif /* H5C_COLLECT_CACHE_ENTRY_STATS */
-
-#endif /* H5C_COLLECT_CACHE_STATS */
-
- hbool_t skip_file_checks;
- hbool_t skip_dxpl_id_checks;
-
-} local_H5C_t;
-
/* global variable declarations: */
@@ -623,6 +530,14 @@ static void row_major_scan_forward(H5C_t * cache_ptr,
int dirty_destroys,
int dirty_unprotects);
+static void hl_row_major_scan_forward(H5C_t * cache_ptr,
+ hbool_t verbose,
+ hbool_t reset_stats,
+ hbool_t display_stats,
+ hbool_t display_detailed_stats,
+ hbool_t do_inserts,
+ hbool_t dirty_inserts);
+
static void row_major_scan_backward(H5C_t * cache_ptr,
int32_t lag,
hbool_t verbose,
@@ -637,6 +552,14 @@ static void row_major_scan_backward(H5C_t * cache_ptr,
int dirty_destroys,
int dirty_unprotects);
+static void hl_row_major_scan_backward(H5C_t * cache_ptr,
+ hbool_t verbose,
+ hbool_t reset_stats,
+ hbool_t display_stats,
+ hbool_t display_detailed_stats,
+ hbool_t do_inserts,
+ hbool_t dirty_inserts);
+
static void col_major_scan_forward(H5C_t * cache_ptr,
int32_t lag,
hbool_t verbose,
@@ -647,6 +570,15 @@ static void col_major_scan_forward(H5C_t * cache_ptr,
hbool_t dirty_inserts,
int dirty_unprotects);
+static void hl_col_major_scan_forward(H5C_t * cache_ptr,
+ hbool_t verbose,
+ hbool_t reset_stats,
+ hbool_t display_stats,
+ hbool_t display_detailed_stats,
+ hbool_t do_inserts,
+ hbool_t dirty_inserts,
+ int dirty_unprotects);
+
static void col_major_scan_backward(H5C_t * cache_ptr,
int32_t lag,
hbool_t verbose,
@@ -657,10 +589,23 @@ static void col_major_scan_backward(H5C_t * cache_ptr,
hbool_t dirty_inserts,
int dirty_unprotects);
+static void hl_col_major_scan_backward(H5C_t * cache_ptr,
+ hbool_t verbose,
+ hbool_t reset_stats,
+ hbool_t display_stats,
+ hbool_t display_detailed_stats,
+ hbool_t do_inserts,
+ hbool_t dirty_inserts,
+ int dirty_unprotects);
+
static void smoke_check_1(void);
static void smoke_check_2(void);
static void smoke_check_3(void);
static void smoke_check_4(void);
+static void smoke_check_5(void);
+static void smoke_check_6(void);
+static void smoke_check_7(void);
+static void smoke_check_8(void);
static void write_permitted_check(void);
static void check_flush_protected_err(void);
static void check_destroy_protected_err(void);
@@ -668,6 +613,11 @@ static void check_duplicate_insert_err(void);
static void check_rename_err(void);
static void check_double_protect_err(void);
static void check_double_unprotect_err(void);
+static void check_auto_cache_resize(void);
+static void check_auto_cache_resize_disable(void);
+static void check_auto_cache_resize_epoch_markers(void);
+static void check_auto_cache_resize_input_errs(void);
+static void check_auto_cache_resize_aux_fcns(void);
static void takedown_cache(H5C_t * cache_ptr,
hbool_t dump_stats,
@@ -1449,6 +1399,10 @@ monster_size(H5F_t * f, void * thing, size_t * size_ptr)
*
* Modifications:
*
+ * JRM - 10/12/04
+ * Removed references to local_H5C_t, as we now get direct
+ * access to the definition of H5C_t via H5Cpkg.h.
+ *
*-------------------------------------------------------------------------
*/
@@ -1473,7 +1427,7 @@ entry_in_cache(H5C_t * cache_ptr,
HDassert( entry_ptr->type == type );
HDassert( entry_ptr == entry_ptr->self );
- H5C__SEARCH_INDEX(((local_H5C_t *)cache_ptr), entry_ptr->addr, test_ptr)
+ H5C__SEARCH_INDEX(cache_ptr, entry_ptr->addr, test_ptr)
if ( test_ptr != NULL ) {
@@ -1885,6 +1839,22 @@ insert_entry(H5C_t * cache_ptr,
pass = FALSE;
failure_mssg = "error in H5C_insert().";
+
+#if 0
+ /* This is useful debugging code. Lets keep it around. */
+
+ HDfprintf(stdout, "result = %d\n", (int)result);
+ HDfprintf(stdout, "entry_ptr->header.is_protected = %d\n",
+ (int)(entry_ptr->header.is_protected));
+ HDfprintf(stdout, "entry_ptr->header.type != &(types[type]) = %d\n",
+ (int)(entry_ptr->header.type != &(types[type])));
+ HDfprintf(stdout,
+ "entry_ptr->size != entry_ptr->header.size = %d\n",
+ (int)(entry_ptr->size != entry_ptr->header.size));
+ HDfprintf(stdout,
+ "entry_ptr->addr != entry_ptr->header.addr = %d\n",
+ (int)(entry_ptr->addr != entry_ptr->header.addr));
+#endif
}
HDassert( ((entry_ptr->header).type)->id == type );
@@ -2036,6 +2006,28 @@ protect_entry(H5C_t * cache_ptr,
( entry_ptr->size != entry_ptr->header.size ) ||
( entry_ptr->addr != entry_ptr->header.addr ) ) {
+#if 0
+ /* I've written the following debugging code several times
+ * now. Lets keep it around so I don't have to write it
+ * again.
+ * - JRM
+ */
+ HDfprintf(stdout, "( cache_entry_ptr != (void *)entry_ptr ) = %d\n",
+ (int)( cache_entry_ptr != (void *)entry_ptr ));
+ HDfprintf(stdout, "cache_entry_ptr = 0x%lx, entry_ptr = 0x%lx\n",
+ (long)cache_entry_ptr, (long)entry_ptr);
+ HDfprintf(stdout, "entry_ptr->header.is_protected = %d\n",
+ (int)(entry_ptr->header.is_protected));
+ HDfprintf(stdout,
+ "( entry_ptr->header.type != &(types[type]) ) = %d\n",
+ (int)( entry_ptr->header.type != &(types[type]) ));
+ HDfprintf(stdout,
+ "entry_ptr->size = %d, entry_ptr->header.size = %d\n",
+ (int)(entry_ptr->size), (int)(entry_ptr->header.size));
+ HDfprintf(stdout,
+ "entry_ptr->addr = %d, entry_ptr->header.addr = %d\n",
+ (int)(entry_ptr->addr), (int)(entry_ptr->header.addr));
+#endif
pass = FALSE;
failure_mssg = "error in H5C_protect().";
@@ -2356,6 +2348,104 @@ row_major_scan_forward(H5C_t * cache_ptr,
/*-------------------------------------------------------------------------
+ * Function: hl_row_major_scan_forward()
+ *
+ * Purpose: Do a high locality sequence of inserts, protects, and
+ * unprotects while scanning through the set of entries.
+ * If pass is false on entry, do nothing.
+ *
+ * Return: void
+ *
+ * Programmer: John Mainzer
+ * 10/21/04
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static void
+hl_row_major_scan_forward(H5C_t * cache_ptr,
+ hbool_t verbose,
+ hbool_t reset_stats,
+ hbool_t display_stats,
+ hbool_t display_detailed_stats,
+ hbool_t do_inserts,
+ hbool_t dirty_inserts)
+{
+ const char * fcn_name = "hl_row_major_scan_forward";
+ int32_t type;
+ int32_t idx;
+ int32_t i;
+ int32_t lag = 100;
+
+ if ( verbose )
+ HDfprintf(stdout, "%s(): entering.\n", fcn_name);
+
+ HDassert( lag > 5 );
+
+ type = 0;
+
+ if ( ( pass ) && ( reset_stats ) ) {
+
+ H5C_stats__reset(cache_ptr);
+ }
+
+ while ( ( pass ) && ( type < NUMBER_OF_ENTRY_TYPES ) )
+ {
+ idx = -lag;
+
+ while ( ( pass ) && ( idx <= (max_indices[type] + lag) ) )
+ {
+ if ( ( pass ) && ( do_inserts ) && ( (idx + lag) >= 0 ) &&
+ ( (idx + lag) <= max_indices[type] ) &&
+ ( ((idx + lag) % 2) == 0 ) &&
+ ( ! entry_in_cache(cache_ptr, type, (idx + lag)) ) ) {
+
+ if ( verbose )
+ HDfprintf(stdout, "(i, %d, %d) ", type, (idx + lag));
+
+ insert_entry(cache_ptr, type, (idx + lag), dirty_inserts);
+ }
+
+ i = idx;
+
+ while ( ( pass ) && ( i >= idx - lag ) && ( i >= 0 ) )
+ {
+ if ( ( pass ) && ( i >= 0 ) && ( i <= max_indices[type] ) ) {
+
+ if ( verbose )
+ HDfprintf(stdout, "(p, %d, %d) ", type, i);
+
+ protect_entry(cache_ptr, type, i);
+
+ if ( verbose )
+ HDfprintf(stdout, "(u, %d, %d) ", type, i);
+
+ unprotect_entry(cache_ptr, type, i, NO_CHANGE, FALSE);
+ }
+ i--;
+ }
+
+ if ( verbose )
+ HDfprintf(stdout, "\n");
+
+ idx++;
+ }
+ type++;
+ }
+
+ if ( ( pass ) && ( display_stats ) ) {
+
+ H5C_stats(cache_ptr, "test cache", display_detailed_stats);
+ }
+
+ return;
+
+} /* hl_row_major_scan_forward() */
+
+
+/*-------------------------------------------------------------------------
* Function: row_major_scan_backward()
*
* Purpose: Do a sequence of inserts, protects, unprotects, renames,
@@ -2579,6 +2669,104 @@ row_major_scan_backward(H5C_t * cache_ptr,
/*-------------------------------------------------------------------------
+ * Function: hl_row_major_scan_backward()
+ *
+ * Purpose: Do a high locality sequence of inserts, protects, and
+ * unprotects while scanning through the set of entries.
+ * If pass is false on entry, do nothing.
+ *
+ * Return: void
+ *
+ * Programmer: John Mainzer
+ * 10/21/04
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static void
+hl_row_major_scan_backward(H5C_t * cache_ptr,
+ hbool_t verbose,
+ hbool_t reset_stats,
+ hbool_t display_stats,
+ hbool_t display_detailed_stats,
+ hbool_t do_inserts,
+ hbool_t dirty_inserts)
+{
+ const char * fcn_name = "hl_row_major_scan_backward";
+ int32_t type;
+ int32_t idx;
+ int32_t i;
+ int32_t lag = 100;
+
+ if ( verbose )
+ HDfprintf(stdout, "%s(): entering.\n", fcn_name);
+
+ HDassert( lag > 5 );
+
+ type = NUMBER_OF_ENTRY_TYPES - 1;
+
+ if ( ( pass ) && ( reset_stats ) ) {
+
+ H5C_stats__reset(cache_ptr);
+ }
+
+ while ( ( pass ) && ( type >= 0 ) )
+ {
+ idx = max_indices[type] + lag;
+
+ while ( ( pass ) && ( idx >= -lag ) )
+ {
+ if ( ( pass ) && ( do_inserts ) && ( (idx + lag) >= 0 ) &&
+ ( (idx + lag) <= max_indices[type] ) &&
+ ( ((idx + lag) % 2) == 0 ) &&
+ ( ! entry_in_cache(cache_ptr, type, (idx + lag)) ) ) {
+
+ if ( verbose )
+ HDfprintf(stdout, "(i, %d, %d) ", type, (idx + lag));
+
+ insert_entry(cache_ptr, type, (idx + lag), dirty_inserts);
+ }
+
+ i = idx;
+
+ while ( ( pass ) && ( i >= idx - lag ) && ( i >= 0 ) )
+ {
+ if ( ( pass ) && ( i >= 0 ) && ( i <= max_indices[type] ) ) {
+
+ if ( verbose )
+ HDfprintf(stdout, "(p, %d, %d) ", type, i);
+
+ protect_entry(cache_ptr, type, i);
+
+ if ( verbose )
+ HDfprintf(stdout, "(u, %d, %d) ", type, i);
+
+ unprotect_entry(cache_ptr, type, i, NO_CHANGE, FALSE);
+ }
+ i--;
+ }
+
+ if ( verbose )
+ HDfprintf(stdout, "\n");
+
+ idx--;
+ }
+ type--;
+ }
+
+ if ( ( pass ) && ( display_stats ) ) {
+
+ H5C_stats(cache_ptr, "test cache", display_detailed_stats);
+ }
+
+ return;
+
+} /* hl_row_major_scan_backward() */
+
+
+/*-------------------------------------------------------------------------
* Function: col_major_scan_forward()
*
* Purpose: Do a sequence of inserts, protects, and unprotects
@@ -2679,6 +2867,115 @@ col_major_scan_forward(H5C_t * cache_ptr,
/*-------------------------------------------------------------------------
+ * Function: hl_col_major_scan_forward()
+ *
+ * Purpose: Do a high locality sequence of inserts, protects, and
+ * unprotects while scanning through the set of entries. If
+ * pass is false on entry, do nothing.
+ *
+ * Return: void
+ *
+ * Programmer: John Mainzer
+ * 19/25/04
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static void
+hl_col_major_scan_forward(H5C_t * cache_ptr,
+ hbool_t verbose,
+ hbool_t reset_stats,
+ hbool_t display_stats,
+ hbool_t display_detailed_stats,
+ hbool_t do_inserts,
+ hbool_t dirty_inserts,
+ int dirty_unprotects)
+{
+ const char * fcn_name = "hl_col_major_scan_forward()";
+ int32_t type;
+ int32_t idx;
+ int32_t lag = 200;
+ int32_t i;
+
+ if ( verbose )
+ HDfprintf(stdout, "%s: entering.\n", fcn_name);
+
+ HDassert( lag > 5 );
+
+ type = 0;
+
+ if ( ( pass ) && ( reset_stats ) ) {
+
+ H5C_stats__reset(cache_ptr);
+ }
+
+ idx = 0;
+
+ while ( ( pass ) && ( idx <= MAX_ENTRIES ) )
+ {
+
+ i = idx;
+
+ while ( ( pass ) && ( i >= 0 ) && ( i >= (idx - lag) ) ) {
+
+ type = 0;
+
+ while ( ( pass ) && ( type < NUMBER_OF_ENTRY_TYPES ) )
+ {
+ if ( ( pass ) && ( do_inserts ) && ( i == idx ) &&
+ ( i <= max_indices[type] ) &&
+ ( (i % 3) == 0 ) &&
+ ( ! entry_in_cache(cache_ptr, type, i) ) ) {
+
+ if ( verbose )
+ HDfprintf(stdout, "(i, %d, %d) ", type, i);
+
+ insert_entry(cache_ptr, type, i, dirty_inserts);
+ }
+
+ if ( ( pass ) && ( i >= 0 ) && ( i <= max_indices[type] ) ) {
+
+ if ( verbose )
+ HDfprintf(stdout, "(p, %d, %d) ", type, i);
+
+ protect_entry(cache_ptr, type, i);
+ }
+
+ if ( ( pass ) && ( i >= 0 ) &&
+ ( i <= max_indices[type] ) ) {
+
+ if ( verbose )
+ HDfprintf(stdout, "(u, %d, %d) ", type, i);
+
+ unprotect_entry(cache_ptr, type, i,
+ dirty_unprotects, FALSE);
+ }
+
+ if ( verbose )
+ HDfprintf(stdout, "\n");
+
+ type++;
+ }
+
+ i--;
+ }
+
+ idx++;
+ }
+
+ if ( ( pass ) && ( display_stats ) ) {
+
+ H5C_stats(cache_ptr, "test cache", display_detailed_stats);
+ }
+
+ return;
+
+} /* hl_col_major_scan_forward() */
+
+
+/*-------------------------------------------------------------------------
* Function: col_major_scan_backward()
*
* Purpose: Do a sequence of inserts, protects, and unprotects
@@ -2787,6 +3084,112 @@ col_major_scan_backward(H5C_t * cache_ptr,
} /* col_major_scan_backward() */
+/*-------------------------------------------------------------------------
+ * Function: hl_col_major_scan_backward()
+ *
+ * Purpose: Do a high locality sequence of inserts, protects, and
+ * unprotects while scanning backwards through the set of
+ * entries. If pass is false on entry, do nothing.
+ *
+ * Return: void
+ *
+ * Programmer: John Mainzer
+ * 10/25/04
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static void
+hl_col_major_scan_backward(H5C_t * cache_ptr,
+ hbool_t verbose,
+ hbool_t reset_stats,
+ hbool_t display_stats,
+ hbool_t display_detailed_stats,
+ hbool_t do_inserts,
+ hbool_t dirty_inserts,
+ int dirty_unprotects)
+{
+ const char * fcn_name = "hl_col_major_scan_backward()";
+ int32_t type;
+ int32_t idx;
+ int32_t lag = 50;
+ int32_t i;
+
+ if ( verbose )
+ HDfprintf(stdout, "%s: entering.\n", fcn_name);
+
+ type = 0;
+
+ if ( ( pass ) && ( reset_stats ) ) {
+
+ H5C_stats__reset(cache_ptr);
+ }
+
+ idx = MAX_ENTRIES;
+
+ while ( ( pass ) && ( idx >= 0 ) )
+ {
+
+ i = idx;
+
+ while ( ( pass ) && ( i <= MAX_ENTRIES ) && ( i <= (idx + lag) ) ) {
+
+ type = 0;
+
+ while ( ( pass ) && ( type < NUMBER_OF_ENTRY_TYPES ) )
+ {
+ if ( ( pass ) && ( do_inserts ) && ( i == idx ) &&
+ ( i <= max_indices[type] ) &&
+ ( ! entry_in_cache(cache_ptr, type, i) ) ) {
+
+ if ( verbose )
+ HDfprintf(stdout, "(i, %d, %d) ", type, i);
+
+ insert_entry(cache_ptr, type, i, dirty_inserts);
+ }
+
+ if ( ( pass ) && ( i >= 0 ) && ( i <= max_indices[type] ) ) {
+
+ if ( verbose )
+ HDfprintf(stdout, "(p, %d, %d) ", type, i);
+
+ protect_entry(cache_ptr, type, i);
+ }
+
+ if ( ( pass ) && ( i >= 0 ) &&
+ ( i <= max_indices[type] ) ) {
+
+ if ( verbose )
+ HDfprintf(stdout, "(u, %d, %d) ", type, i);
+
+ unprotect_entry(cache_ptr, type, i,
+ dirty_unprotects, FALSE);
+ }
+
+ if ( verbose )
+ HDfprintf(stdout, "\n");
+
+ type++;
+ }
+
+ i++;
+ }
+
+ idx--;
+ }
+
+ if ( ( pass ) && ( display_stats ) ) {
+
+ H5C_stats(cache_ptr, "test cache", display_detailed_stats);
+ }
+
+ return;
+
+} /* hl_col_major_scan_backward() */
+
+
/**************************************************************************/
/**************************************************************************/
/********************************* tests: *********************************/
@@ -3488,6 +3891,836 @@ smoke_check_4(void)
/*-------------------------------------------------------------------------
+ * Function: smoke_check_5()
+ *
+ * Purpose: A basic functional test on a cache with automatic cache
+ * resizing enabled, with inserts in the mix, along with
+ * repeated protects and unprotects. All entries are marked
+ * as clean.
+ *
+ * Return: void
+ *
+ * Programmer: John Mainzer
+ * 10/14/04
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static void
+smoke_check_5(void)
+{
+ const char * fcn_name = "smoke_check_5";
+ herr_t result;
+ hbool_t show_progress = FALSE;
+ hbool_t dirty_inserts = FALSE;
+ int dirty_unprotects = FALSE;
+ hbool_t display_stats = FALSE;
+ int mile_stone = 1;
+ H5C_t * cache_ptr = NULL;
+ H5C_auto_size_ctl_t auto_size_ctl =
+ {
+ /* int32_t version = */ H5C__CURR_AUTO_SIZE_CTL_VER,
+#if 1
+ /* H5C_auto_resize_report_fcn rpt_fcn = */ NULL,
+#else
+ /* H5C_auto_resize_report_fcn rpt_fcn = */ H5C_def_auto_resize_rpt_fcn,
+#endif
+ /* hbool_t set_initial_size = */ TRUE,
+ /* size_t initial_size = */ (2 * 1024 * 1024),
+
+ /* double min_clean_fraction = */ 0.1,
+
+ /* size_t max_size = */ (32 * 1024 * 1025),
+ /* size_t min_size = */ (512 * 1024),
+
+ /* int64_t epoch_length = */ 50000,
+
+
+ /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold,
+
+ /* double lower_hr_threshold = */ 0.75,
+
+ /* double increment = */ 2.0,
+
+ /* hbool_t apply_max_increment = */ TRUE,
+ /* size_t max_increment = */ (4 * 1024 * 1024),
+
+
+ /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__threshold,
+
+ /* double upper_hr_threshold = */ 0.995,
+
+ /* double decrement = */ 0.9,
+
+ /* hbool_t apply_max_decrement = */ TRUE,
+ /* size_t max_decrement = */ (1 * 1024 * 1024),
+
+ /* int32_t epochs_before_eviction = */ 3,
+
+ /* hbool_t apply_empty_reserve = */ TRUE,
+ /* double empty_reserve = */ 0.5
+ };
+
+ TESTING("smoke check #5 -- all clean, ins, prot, unprot, AR cache 1");
+
+ pass = TRUE;
+
+ if ( show_progress ) /* 1 */
+ HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
+ fcn_name, mile_stone++, (int)pass);
+
+ reset_entries();
+
+ if ( show_progress ) /* 2 */
+ HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
+ fcn_name, mile_stone++, (int)pass);
+
+ cache_ptr = setup_cache((size_t)(2 * 1024),
+ (size_t)(1 * 1024));
+
+ if ( pass ) {
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_set_cache_auto_resize_config failed 1.\n";
+ }
+ }
+
+ if ( show_progress ) /* 3 */
+ HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
+ fcn_name, mile_stone++, (int)pass);
+
+ hl_row_major_scan_forward(/* cache_ptr */ cache_ptr,
+ /* verbose */ FALSE,
+ /* reset_stats */ TRUE,
+ /* display_stats */ display_stats,
+ /* display_detailed_stats */ FALSE,
+ /* do_inserts */ FALSE,
+ /* dirty_inserts */ dirty_inserts);
+
+ if ( show_progress ) /* 4 */
+ HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
+ fcn_name, mile_stone++, (int)pass);
+
+ hl_row_major_scan_backward(/* cache_ptr */ cache_ptr,
+ /* verbose */ FALSE,
+ /* reset_stats */ TRUE,
+ /* display_stats */ display_stats,
+ /* display_detailed_stats */ FALSE,
+ /* do_inserts */ FALSE,
+ /* dirty_inserts */ dirty_inserts);
+
+ if ( show_progress ) /* 5 */
+ HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
+ fcn_name, mile_stone++, (int)pass);
+
+ hl_row_major_scan_forward(/* cache_ptr */ cache_ptr,
+ /* verbose */ FALSE,
+ /* reset_stats */ TRUE,
+ /* display_stats */ display_stats,
+ /* display_detailed_stats */ FALSE,
+ /* do_inserts */ TRUE,
+ /* dirty_inserts */ dirty_inserts);
+
+ if ( show_progress ) /* 6 */
+ HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
+ fcn_name, mile_stone++, (int)pass);
+
+ /* flush and destroy all entries in the cache: */
+
+ flush_cache(/* cache_ptr */ cache_ptr,
+ /* destroy_entries */ TRUE,
+ /* dump_stats */ FALSE,
+ /* dump_detailed_stats */ FALSE);
+
+ if ( show_progress ) /* 7 */
+ HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
+ fcn_name, mile_stone++, (int)pass);
+
+ hl_col_major_scan_forward(/* cache_ptr */ cache_ptr,
+ /* verbose */ FALSE,
+ /* reset_stats */ TRUE,
+ /* display_stats */ display_stats,
+ /* display_detailed_stats */ FALSE,
+ /* do_inserts */ TRUE,
+ /* dirty_inserts */ dirty_inserts,
+ /* dirty_unprotects */ dirty_unprotects);
+
+ if ( show_progress ) /* 8 */
+ HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
+ fcn_name, mile_stone++, (int)pass);
+
+ /* flush all entries in the cache: */
+
+ flush_cache(/* cache_ptr */ cache_ptr,
+ /* destroy_entries */ FALSE,
+ /* dump_stats */ FALSE,
+ /* dump_detailed_stats */ FALSE);
+
+ if ( show_progress ) /* 9 */
+ HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
+ fcn_name, mile_stone++, (int)pass);
+
+ hl_col_major_scan_backward(/* cache_ptr */ cache_ptr,
+ /* verbose */ FALSE,
+ /* reset_stats */ TRUE,
+ /* display_stats */ display_stats,
+ /* display_detailed_stats */ FALSE,
+ /* do_inserts */ TRUE,
+ /* dirty_inserts */ dirty_inserts,
+ /* dirty_unprotects */ dirty_unprotects);
+
+ if ( show_progress ) /* 10 */
+ HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
+ fcn_name, mile_stone++, (int)pass);
+
+ takedown_cache(cache_ptr, display_stats, TRUE);
+
+ if ( show_progress ) /* 11 */
+ HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
+ fcn_name, mile_stone++, (int)pass);
+
+ verify_clean();
+ verify_unprotected();
+
+ if ( pass ) { PASSED(); } else { H5_FAILED(); }
+
+ if ( ! pass )
+ HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n",
+ fcn_name, failure_mssg);
+
+} /* smoke_check_5() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: smoke_check_6()
+ *
+ * Purpose: A basic functional test on a cache with automatic cache
+ * resizing enabled, with inserts in the mix, along with
+ * repeated protects and unprotects. About one half of all
+ * entries are marked as dirty.
+ *
+ * Return: void
+ *
+ * Programmer: John Mainzer
+ * 10/25/04
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static void
+smoke_check_6(void)
+{
+ const char * fcn_name = "smoke_check_6";
+ herr_t result;
+ hbool_t show_progress = FALSE;
+ hbool_t dirty_inserts = TRUE;
+ int dirty_unprotects = FALSE;
+ hbool_t display_stats = FALSE;
+ int mile_stone = 1;
+ H5C_t * cache_ptr = NULL;
+ H5C_auto_size_ctl_t auto_size_ctl =
+ {
+ /* int32_t version = */ H5C__CURR_AUTO_SIZE_CTL_VER,
+#if 1
+ /* H5C_auto_resize_report_fcn rpt_fcn = */ NULL,
+#else
+ /* H5C_auto_resize_report_fcn rpt_fcn = */ H5C_def_auto_resize_rpt_fcn,
+#endif
+ /* hbool_t set_initial_size = */ TRUE,
+ /* size_t initial_size = */ (2 * 1024 * 1024),
+
+ /* double min_clean_fraction = */ 0.1,
+
+ /* size_t max_size = */ (32 * 1024 * 1025),
+ /* size_t min_size = */ (512 * 1024),
+
+ /* int64_t epoch_length = */ 50000,
+
+
+ /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold,
+
+ /* double lower_hr_threshold = */ 0.75,
+
+ /* double increment = */ 2.0,
+
+ /* hbool_t apply_max_increment = */ TRUE,
+ /* size_t max_increment = */ (4 * 1024 * 1024),
+
+
+ /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__threshold,
+
+ /* double upper_hr_threshold = */ 0.995,
+
+ /* double decrement = */ 0.9,
+
+ /* hbool_t apply_max_decrement = */ TRUE,
+ /* size_t max_decrement = */ (1 * 1024 * 1024),
+
+ /* int32_t epochs_before_eviction = */ 3,
+
+ /* hbool_t apply_empty_reserve = */ TRUE,
+ /* double empty_reserve = */ 0.05
+ };
+
+ TESTING("smoke check #6 -- ~1/2 dirty, ins, prot, unprot, AR cache 1");
+
+ pass = TRUE;
+
+ if ( show_progress ) /* 1 */
+ HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
+ fcn_name, mile_stone++, (int)pass);
+
+ reset_entries();
+
+ if ( show_progress ) /* 2 */
+ HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
+ fcn_name, mile_stone++, (int)pass);
+
+ cache_ptr = setup_cache((size_t)(2 * 1024),
+ (size_t)(1 * 1024));
+
+ if ( pass ) {
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_set_cache_auto_resize_config failed 1.\n";
+ }
+ }
+
+ if ( show_progress ) /* 3 */
+ HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
+ fcn_name, mile_stone++, (int)pass);
+
+ hl_row_major_scan_forward(/* cache_ptr */ cache_ptr,
+ /* verbose */ FALSE,
+ /* reset_stats */ TRUE,
+ /* display_stats */ display_stats,
+ /* display_detailed_stats */ FALSE,
+ /* do_inserts */ FALSE,
+ /* dirty_inserts */ dirty_inserts);
+
+ if ( show_progress ) /* 4 */
+ HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
+ fcn_name, mile_stone++, (int)pass);
+
+ hl_row_major_scan_backward(/* cache_ptr */ cache_ptr,
+ /* verbose */ FALSE,
+ /* reset_stats */ TRUE,
+ /* display_stats */ display_stats,
+ /* display_detailed_stats */ FALSE,
+ /* do_inserts */ FALSE,
+ /* dirty_inserts */ dirty_inserts);
+
+ if ( show_progress ) /* 5 */
+ HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
+ fcn_name, mile_stone++, (int)pass);
+
+ hl_row_major_scan_forward(/* cache_ptr */ cache_ptr,
+ /* verbose */ FALSE,
+ /* reset_stats */ TRUE,
+ /* display_stats */ display_stats,
+ /* display_detailed_stats */ FALSE,
+ /* do_inserts */ TRUE,
+ /* dirty_inserts */ dirty_inserts);
+
+ if ( show_progress ) /* 6 */
+ HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
+ fcn_name, mile_stone++, (int)pass);
+
+ /* flush and destroy all entries in the cache: */
+
+ flush_cache(/* cache_ptr */ cache_ptr,
+ /* destroy_entries */ TRUE,
+ /* dump_stats */ FALSE,
+ /* dump_detailed_stats */ FALSE);
+
+ if ( show_progress ) /* 7 */
+ HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
+ fcn_name, mile_stone++, (int)pass);
+
+ hl_col_major_scan_forward(/* cache_ptr */ cache_ptr,
+ /* verbose */ FALSE,
+ /* reset_stats */ TRUE,
+ /* display_stats */ display_stats,
+ /* display_detailed_stats */ FALSE,
+ /* do_inserts */ TRUE,
+ /* dirty_inserts */ dirty_inserts,
+ /* dirty_unprotects */ dirty_unprotects);
+
+ if ( show_progress ) /* 8 */
+ HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
+ fcn_name, mile_stone++, (int)pass);
+
+ /* flush all entries in the cache: */
+
+ flush_cache(/* cache_ptr */ cache_ptr,
+ /* destroy_entries */ FALSE,
+ /* dump_stats */ FALSE,
+ /* dump_detailed_stats */ FALSE);
+
+ if ( show_progress ) /* 9 */
+ HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
+ fcn_name, mile_stone++, (int)pass);
+
+ hl_col_major_scan_backward(/* cache_ptr */ cache_ptr,
+ /* verbose */ FALSE,
+ /* reset_stats */ TRUE,
+ /* display_stats */ display_stats,
+ /* display_detailed_stats */ FALSE,
+ /* do_inserts */ TRUE,
+ /* dirty_inserts */ dirty_inserts,
+ /* dirty_unprotects */ dirty_unprotects);
+
+ if ( show_progress ) /* 10 */
+ HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
+ fcn_name, mile_stone++, (int)pass);
+
+ takedown_cache(cache_ptr, display_stats, TRUE);
+
+ if ( show_progress ) /* 11 */
+ HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
+ fcn_name, mile_stone++, (int)pass);
+
+ verify_clean();
+ verify_unprotected();
+
+ if ( pass ) { PASSED(); } else { H5_FAILED(); }
+
+ if ( ! pass )
+ HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n",
+ fcn_name, failure_mssg);
+
+} /* smoke_check_6() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: smoke_check_7()
+ *
+ * Purpose: A basic functional test on a cache with automatic cache
+ * resizing enabled, with inserts in the mix, along with
+ * repeated protects and unprotects. All entries are marked
+ * as clean.
+ *
+ * Return: void
+ *
+ * Programmer: John Mainzer
+ * 12/2/04
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static void
+smoke_check_7(void)
+{
+ const char * fcn_name = "smoke_check_7";
+ herr_t result;
+ hbool_t show_progress = FALSE;
+ hbool_t dirty_inserts = FALSE;
+ int dirty_unprotects = FALSE;
+ hbool_t display_stats = FALSE;
+ int mile_stone = 1;
+ H5C_t * cache_ptr = NULL;
+ H5C_auto_size_ctl_t auto_size_ctl =
+ {
+ /* int32_t version = */ H5C__CURR_AUTO_SIZE_CTL_VER,
+#if 1
+ /* H5C_auto_resize_report_fcn rpt_fcn = */ NULL,
+#else
+ /* H5C_auto_resize_report_fcn rpt_fcn = */ H5C_def_auto_resize_rpt_fcn,
+#endif
+ /* hbool_t set_initial_size = */ TRUE,
+ /* size_t initial_size = */ (2 * 1024 * 1024),
+
+ /* double min_clean_fraction = */ 0.1,
+
+ /* size_t max_size = */ (32 * 1024 * 1025),
+ /* size_t min_size = */ (512 * 1024),
+
+ /* int64_t epoch_length = */ 100000,
+
+
+ /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold,
+
+ /* double lower_hr_threshold = */ 0.75,
+
+ /* double increment = */ 2.0,
+
+ /* hbool_t apply_max_increment = */ TRUE,
+ /* size_t max_increment = */ (8 * 1024 * 1024),
+
+
+ /* enum H5C_cache_decr_mode decr_mode = */
+ H5C_decr__age_out_with_threshold,
+
+ /* double upper_hr_threshold = */ 0.995,
+
+ /* double decrement = */ 0.9,
+
+ /* hbool_t apply_max_decrement = */ TRUE,
+ /* size_t max_decrement = */ (1 * 1024 * 1024),
+
+ /* int32_t epochs_before_eviction = */ 3,
+
+ /* hbool_t apply_empty_reserve = */ TRUE,
+ /* double empty_reserve = */ 0.1
+ };
+
+ TESTING("smoke check #7 -- all clean, ins, prot, unprot, AR cache 2");
+
+ pass = TRUE;
+
+ if ( show_progress ) /* 1 */
+ HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
+ fcn_name, mile_stone++, (int)pass);
+
+ reset_entries();
+
+ if ( show_progress ) /* 2 */
+ HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
+ fcn_name, mile_stone++, (int)pass);
+
+ cache_ptr = setup_cache((size_t)(2 * 1024),
+ (size_t)(1 * 1024));
+
+ if ( pass ) {
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_set_cache_auto_resize_config failed 1.\n";
+ }
+ }
+
+ if ( show_progress ) /* 3 */
+ HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
+ fcn_name, mile_stone++, (int)pass);
+
+ hl_row_major_scan_forward(/* cache_ptr */ cache_ptr,
+ /* verbose */ FALSE,
+ /* reset_stats */ TRUE,
+ /* display_stats */ display_stats,
+ /* display_detailed_stats */ FALSE,
+ /* do_inserts */ FALSE,
+ /* dirty_inserts */ dirty_inserts);
+
+ if ( show_progress ) /* 4 */
+ HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
+ fcn_name, mile_stone++, (int)pass);
+
+ hl_row_major_scan_backward(/* cache_ptr */ cache_ptr,
+ /* verbose */ FALSE,
+ /* reset_stats */ TRUE,
+ /* display_stats */ display_stats,
+ /* display_detailed_stats */ FALSE,
+ /* do_inserts */ FALSE,
+ /* dirty_inserts */ dirty_inserts);
+
+ if ( show_progress ) /* 5 */
+ HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
+ fcn_name, mile_stone++, (int)pass);
+
+ hl_row_major_scan_forward(/* cache_ptr */ cache_ptr,
+ /* verbose */ FALSE,
+ /* reset_stats */ TRUE,
+ /* display_stats */ display_stats,
+ /* display_detailed_stats */ FALSE,
+ /* do_inserts */ TRUE,
+ /* dirty_inserts */ dirty_inserts);
+
+ if ( show_progress ) /* 6 */
+ HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
+ fcn_name, mile_stone++, (int)pass);
+
+ /* flush and destroy all entries in the cache: */
+
+ flush_cache(/* cache_ptr */ cache_ptr,
+ /* destroy_entries */ TRUE,
+ /* dump_stats */ FALSE,
+ /* dump_detailed_stats */ FALSE);
+
+ if ( show_progress ) /* 7 */
+ HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
+ fcn_name, mile_stone++, (int)pass);
+
+ hl_col_major_scan_forward(/* cache_ptr */ cache_ptr,
+ /* verbose */ FALSE,
+ /* reset_stats */ TRUE,
+ /* display_stats */ display_stats,
+ /* display_detailed_stats */ FALSE,
+ /* do_inserts */ TRUE,
+ /* dirty_inserts */ dirty_inserts,
+ /* dirty_unprotects */ dirty_unprotects);
+
+ if ( show_progress ) /* 8 */
+ HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
+ fcn_name, mile_stone++, (int)pass);
+
+ /* flush all entries in the cache: */
+
+ flush_cache(/* cache_ptr */ cache_ptr,
+ /* destroy_entries */ FALSE,
+ /* dump_stats */ FALSE,
+ /* dump_detailed_stats */ FALSE);
+
+ if ( show_progress ) /* 9 */
+ HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
+ fcn_name, mile_stone++, (int)pass);
+
+ hl_col_major_scan_backward(/* cache_ptr */ cache_ptr,
+ /* verbose */ FALSE,
+ /* reset_stats */ TRUE,
+ /* display_stats */ display_stats,
+ /* display_detailed_stats */ FALSE,
+ /* do_inserts */ TRUE,
+ /* dirty_inserts */ dirty_inserts,
+ /* dirty_unprotects */ dirty_unprotects);
+
+ if ( show_progress ) /* 10 */
+ HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
+ fcn_name, mile_stone++, (int)pass);
+
+ takedown_cache(cache_ptr, display_stats, TRUE);
+
+ if ( show_progress ) /* 11 */
+ HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
+ fcn_name, mile_stone++, (int)pass);
+
+ verify_clean();
+ verify_unprotected();
+
+ if ( pass ) { PASSED(); } else { H5_FAILED(); }
+
+ if ( ! pass )
+ HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n",
+ fcn_name, failure_mssg);
+
+} /* smoke_check_7() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: smoke_check_8()
+ *
+ * Purpose: A basic functional test on a cache with automatic cache
+ * resizing enabled, with inserts in the mix, along with
+ * repeated protects and unprotects. About one half of all
+ * entries are marked as dirty.
+ *
+ * Return: void
+ *
+ * Programmer: John Mainzer
+ * 10/25/04
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static void
+smoke_check_8(void)
+{
+ const char * fcn_name = "smoke_check_8";
+ herr_t result;
+ hbool_t show_progress = FALSE;
+ hbool_t dirty_inserts = TRUE;
+ int dirty_unprotects = FALSE;
+ hbool_t display_stats = FALSE;
+ int mile_stone = 1;
+ H5C_t * cache_ptr = NULL;
+ H5C_auto_size_ctl_t auto_size_ctl =
+ {
+ /* int32_t version = */ H5C__CURR_AUTO_SIZE_CTL_VER,
+#if 1
+ /* H5C_auto_resize_report_fcn rpt_fcn = */ NULL,
+#else
+ /* H5C_auto_resize_report_fcn rpt_fcn = */ H5C_def_auto_resize_rpt_fcn,
+#endif
+ /* hbool_t set_initial_size = */ TRUE,
+ /* size_t initial_size = */ (2 * 1024 * 1024),
+
+ /* double min_clean_fraction = */ 0.1,
+
+ /* size_t max_size = */ (32 * 1024 * 1025),
+ /* size_t min_size = */ (512 * 1024),
+
+ /* int64_t epoch_length = */ 100000,
+
+
+ /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold,
+
+ /* double lower_hr_threshold = */ 0.75,
+
+ /* double increment = */ 2.0,
+
+ /* hbool_t apply_max_increment = */ TRUE,
+ /* size_t max_increment = */ (4 * 1024 * 1024),
+
+
+ /* enum H5C_cache_decr_mode decr_mode = */
+ H5C_decr__age_out_with_threshold,
+
+ /* double upper_hr_threshold = */ 0.995,
+
+ /* double decrement = */ 0.9,
+
+ /* hbool_t apply_max_decrement = */ TRUE,
+ /* size_t max_decrement = */ (1 * 1024 * 1024),
+
+ /* int32_t epochs_before_eviction = */ 3,
+
+ /* hbool_t apply_empty_reserve = */ TRUE,
+ /* double empty_reserve = */ 0.1
+ };
+
+ TESTING("smoke check #8 -- ~1/2 dirty, ins, prot, unprot, AR cache 2");
+
+ pass = TRUE;
+
+ if ( show_progress ) /* 1 */
+ HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
+ fcn_name, mile_stone++, (int)pass);
+
+ reset_entries();
+
+ if ( show_progress ) /* 2 */
+ HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
+ fcn_name, mile_stone++, (int)pass);
+
+ cache_ptr = setup_cache((size_t)(2 * 1024),
+ (size_t)(1 * 1024));
+
+ if ( pass ) {
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_set_cache_auto_resize_config failed 1.\n";
+ }
+ }
+
+ if ( show_progress ) /* 3 */
+ HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
+ fcn_name, mile_stone++, (int)pass);
+
+ hl_row_major_scan_forward(/* cache_ptr */ cache_ptr,
+ /* verbose */ FALSE,
+ /* reset_stats */ TRUE,
+ /* display_stats */ display_stats,
+ /* display_detailed_stats */ FALSE,
+ /* do_inserts */ FALSE,
+ /* dirty_inserts */ dirty_inserts);
+
+ if ( show_progress ) /* 4 */
+ HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
+ fcn_name, mile_stone++, (int)pass);
+
+ hl_row_major_scan_backward(/* cache_ptr */ cache_ptr,
+ /* verbose */ FALSE,
+ /* reset_stats */ TRUE,
+ /* display_stats */ display_stats,
+ /* display_detailed_stats */ FALSE,
+ /* do_inserts */ FALSE,
+ /* dirty_inserts */ dirty_inserts);
+
+ if ( show_progress ) /* 5 */
+ HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
+ fcn_name, mile_stone++, (int)pass);
+
+ hl_row_major_scan_forward(/* cache_ptr */ cache_ptr,
+ /* verbose */ FALSE,
+ /* reset_stats */ TRUE,
+ /* display_stats */ display_stats,
+ /* display_detailed_stats */ FALSE,
+ /* do_inserts */ TRUE,
+ /* dirty_inserts */ dirty_inserts);
+
+ if ( show_progress ) /* 6 */
+ HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
+ fcn_name, mile_stone++, (int)pass);
+
+ /* flush and destroy all entries in the cache: */
+
+ flush_cache(/* cache_ptr */ cache_ptr,
+ /* destroy_entries */ TRUE,
+ /* dump_stats */ FALSE,
+ /* dump_detailed_stats */ FALSE);
+
+ if ( show_progress ) /* 7 */
+ HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
+ fcn_name, mile_stone++, (int)pass);
+
+ hl_col_major_scan_forward(/* cache_ptr */ cache_ptr,
+ /* verbose */ FALSE,
+ /* reset_stats */ TRUE,
+ /* display_stats */ display_stats,
+ /* display_detailed_stats */ FALSE,
+ /* do_inserts */ TRUE,
+ /* dirty_inserts */ dirty_inserts,
+ /* dirty_unprotects */ dirty_unprotects);
+
+ if ( show_progress ) /* 8 */
+ HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
+ fcn_name, mile_stone++, (int)pass);
+
+ /* flush all entries in the cache: */
+
+ flush_cache(/* cache_ptr */ cache_ptr,
+ /* destroy_entries */ FALSE,
+ /* dump_stats */ FALSE,
+ /* dump_detailed_stats */ FALSE);
+
+ if ( show_progress ) /* 9 */
+ HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
+ fcn_name, mile_stone++, (int)pass);
+
+ hl_col_major_scan_backward(/* cache_ptr */ cache_ptr,
+ /* verbose */ FALSE,
+ /* reset_stats */ TRUE,
+ /* display_stats */ display_stats,
+ /* display_detailed_stats */ FALSE,
+ /* do_inserts */ TRUE,
+ /* dirty_inserts */ dirty_inserts,
+ /* dirty_unprotects */ dirty_unprotects);
+
+ if ( show_progress ) /* 10 */
+ HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
+ fcn_name, mile_stone++, (int)pass);
+
+ takedown_cache(cache_ptr, display_stats, TRUE);
+
+ if ( show_progress ) /* 11 */
+ HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
+ fcn_name, mile_stone++, (int)pass);
+
+ verify_clean();
+ verify_unprotected();
+
+ if ( pass ) { PASSED(); } else { H5_FAILED(); }
+
+ if ( ! pass )
+ HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n",
+ fcn_name, failure_mssg);
+
+} /* smoke_check_8() */
+
+
+/*-------------------------------------------------------------------------
* Function: write_permitted_check()
*
* Purpose: A basic test of the write permitted function. In essence,
@@ -4104,7 +5337,7 @@ check_double_unprotect_err(void)
pass = FALSE;
failure_mssg =
- "attempt to unprotect an unprotected entry succeeded.\n";
+ "attempt to unprotect an unprotected entry succeeded 1.\n";
}
}
@@ -4123,6 +5356,8946 @@ check_double_unprotect_err(void)
/*-------------------------------------------------------------------------
+ * Function: check_auto_cache_resize()
+ *
+ * Purpose: Exercise the automatic cache resizing functionality.
+ * The objective is to operate the auto-resize code in
+ * all possible modes. Unfortunately, there are quite
+ * a few of them.
+ *
+ * Return: void
+ *
+ * Programmer: John Mainzer
+ * 10/29/04
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+
+hbool_t rpt_fcn_called = FALSE;
+enum H5C_resize_status rpt_status;
+
+void test_rpt_fcn(UNUSED H5C_t * cache_ptr,
+ UNUSED int32_t version,
+ UNUSED double hit_rate,
+ UNUSED enum H5C_resize_status status,
+ UNUSED size_t old_max_cache_size,
+ UNUSED size_t new_max_cache_size,
+ UNUSED size_t old_min_clean_size,
+ UNUSED size_t new_min_clean_size);
+
+void test_rpt_fcn(UNUSED H5C_t * cache_ptr,
+ UNUSED int32_t version,
+ UNUSED double hit_rate,
+ UNUSED enum H5C_resize_status status,
+ UNUSED size_t old_max_cache_size,
+ UNUSED size_t new_max_cache_size,
+ UNUSED size_t old_min_clean_size,
+ UNUSED size_t new_min_clean_size)
+{
+ rpt_fcn_called = TRUE;
+ rpt_status = status;
+}
+
+static void
+check_auto_cache_resize(void)
+{
+ const char * fcn_name = "check_auto_cache_resize()";
+ hbool_t show_progress = FALSE;
+ herr_t result;
+ int32_t i;
+ int32_t checkpoint = 0;
+ H5C_t * cache_ptr = NULL;
+ H5C_auto_size_ctl_t auto_size_ctl =
+ {
+ /* int32_t version = */ H5C__CURR_AUTO_SIZE_CTL_VER,
+ /* H5C_auto_resize_report_fcn rpt_fcn = */ test_rpt_fcn,
+
+ /* hbool_t set_initial_size = */ TRUE,
+ /* size_t initial_size = */ (512 * 1024),
+
+ /* double min_clean_fraction = */ 0.5,
+
+ /* size_t max_size = */ (14 * 1024 * 1024),
+ /* size_t min_size = */ (512 * 1024),
+
+ /* int64_t epoch_length = */ 1000,
+
+
+ /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold,
+
+ /* double lower_hr_threshold = */ 0.75,
+
+ /* double increment = */ 2.0,
+
+ /* hbool_t apply_max_increment = */ TRUE,
+ /* size_t max_increment = */ (4 * 1024 * 1024),
+
+
+ /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__threshold,
+
+ /* double upper_hr_threshold = */ 0.995,
+
+ /* double decrement = */ 0.1,
+
+ /* hbool_t apply_max_decrement = */ TRUE,
+ /* size_t max_decrement = */ (1 * 1024 * 1024),
+
+ /* int32_t epochs_before_eviction = */ 3,
+
+ /* hbool_t apply_empty_reserve = */ TRUE,
+ /* double empty_reserve = */ 0.05
+ };
+
+ TESTING("automatic cache resizing");
+
+ pass = TRUE;
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* allocate a cache, enable automatic cache resizing, and then force
+ * the cache through all its operational modes. Verify that all
+ * performs as expected.
+ */
+
+ if ( pass ) {
+
+ reset_entries();
+
+ cache_ptr = setup_cache((size_t)(2 * 1024),
+ (size_t)(1 * 1024));
+ }
+
+ if ( pass ) {
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_set_cache_auto_resize_config failed 1.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ if ( ( cache_ptr->max_cache_size != (512 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (256 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "bad cache size after initialization.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* force low hit rate with cache not full -- should result in not
+ * full status.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, PICO_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, PICO_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != not_full ) ||
+ ( cache_ptr->max_cache_size != (512 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (256 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 1.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* force low hit rate with cache full -- should result in increase
+ * of cache size from .5 to 1 meg.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != increase ) ||
+ ( cache_ptr->max_cache_size != (1 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (512 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 2.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* force low hit rate with cache not full -- should result in not
+ * full status.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, PICO_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, PICO_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != not_full ) ||
+ ( cache_ptr->max_cache_size != (1 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (512 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 3.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* force low hit rate with cache full again -- should result in increase
+ * of cache size from 1 to 2 meg.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != increase ) ||
+ ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 4.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* force low hit rate with cache full again -- should result in increase
+ * of cache size from 2 to 4 meg.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != increase ) ||
+ ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 5.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* force low hit rate with cache full again -- should result in increase
+ * of cache size from 4 to 8 meg.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != increase ) ||
+ ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 6.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* force low hit rate with cache full again -- should result in increase
+ * of cache size from 8 to 12 meg. Note that max increase reduced the
+ * size of the increase.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != increase ) ||
+ ( cache_ptr->max_cache_size != (12 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (6 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 7.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* force low hit rate with cache full again -- should result in increase
+ * of cache size from 12 to 14 meg.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != increase ) ||
+ ( cache_ptr->max_cache_size != (14 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (7 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 8.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* force low hit rate with cache full and at maximum size -- should
+ * in no change in size and a result of at_max_size.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != at_max_size ) ||
+ ( cache_ptr->max_cache_size != (14 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (7 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 9.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* force high hit rate with cache full and at maximum size -- should
+ * result in a decrease from 14 to 13 Meg -- note that max decrease
+ * reduced the size of the reduction
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != decrease ) ||
+ ( cache_ptr->max_cache_size != (13 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (6 * 1024 * 1024 + 512 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 10.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* the current cache configuration is unconvenient for testing cache
+ * size reduction, so lets change it some something easier to work
+ * with.
+ */
+
+ if ( pass ) {
+
+ auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+ auto_size_ctl.rpt_fcn = test_rpt_fcn;
+
+ auto_size_ctl.set_initial_size = TRUE;
+ auto_size_ctl.initial_size = 4 * 1000 * 1000 + 10;
+
+ auto_size_ctl.min_clean_fraction = 0.1;
+
+ auto_size_ctl.max_size = 8 * 1000 * 1000;
+ auto_size_ctl.min_size = 500 * 1000;
+
+ auto_size_ctl.epoch_length = 1000;
+
+
+ auto_size_ctl.incr_mode = H5C_incr__threshold;
+
+ auto_size_ctl.lower_hr_threshold = 0.75;
+
+ auto_size_ctl.increment = 2.0;
+
+ auto_size_ctl.apply_max_increment = TRUE;
+ auto_size_ctl.max_increment = (4 * 1000 * 1000);
+
+
+ auto_size_ctl.decr_mode = H5C_decr__threshold;
+
+ auto_size_ctl.upper_hr_threshold = 0.995;
+
+ auto_size_ctl.decrement = 0.5;
+
+ auto_size_ctl.apply_max_decrement = TRUE;
+ auto_size_ctl.max_decrement = (1 * 1000 * 1000);
+
+ auto_size_ctl.epochs_before_eviction = 3;
+
+ auto_size_ctl.apply_empty_reserve = TRUE;
+ auto_size_ctl.empty_reserve = 0.05;
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_set_cache_auto_resize_config failed 2.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ if ( ( cache_ptr->max_cache_size != (4 * 1000 * 1000 + 10) ) ||
+ ( cache_ptr->min_clean_size != (400 * 1000 + 1) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "bad cache size after set resize re-config 1.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* force high hit rate -- should result in a decrease from ~4 to ~3
+ * M -- note that max decrease reduces the size of the reduction
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != decrease ) ||
+ ( cache_ptr->max_cache_size != (3 * 1000 * 1000 + 10) ) ||
+ ( cache_ptr->min_clean_size != (300 * 1000 + 1) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 11.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* force high hit rate again -- should result in a decrease from ~3
+ * to ~2 M -- again note that max decrease reduces the size of the
+ * reduction.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != decrease ) ||
+ ( cache_ptr->max_cache_size != (2 * 1000 * 1000 + 10) ) ||
+ ( cache_ptr->min_clean_size != (200 * 1000 + 1) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 12.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* force high hit rate again -- should result in a decrease from ~2
+ * to ~1 M -- again note that max decrease reduces the size of the
+ * reduction, but only by five bites.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != decrease ) ||
+ ( cache_ptr->max_cache_size != (1 * 1000 * 1000 + 10) ) ||
+ ( cache_ptr->min_clean_size != (100 * 1000 + 1) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 13.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* force high hit rate again -- should result in a decrease from ~1
+ * to ~0.5 M -- max decrease is no longer a factor. New size is five
+ * bytes above the minimum.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != decrease ) ||
+ ( cache_ptr->max_cache_size != (500 * 1000 + 5) ) ||
+ ( cache_ptr->min_clean_size != (50 * 1000) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 14.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* force high hit rate again -- should result in a decrease of five
+ * bytes to the minimum cache size.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != decrease ) ||
+ ( cache_ptr->max_cache_size != (500 * 1000) ) ||
+ ( cache_ptr->min_clean_size != (50 * 1000) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 15.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* force high hit rate again -- Already at minimum size so no change in
+ * cache size and result should be at_min_size.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != at_min_size ) ||
+ ( cache_ptr->max_cache_size != (500 * 1000) ) ||
+ ( cache_ptr->min_clean_size != (50 * 1000) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 16.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* force in range hit rate -- should be no change in cache size,
+ * and result should be in_spec.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 900 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i + 1000);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i + 1000,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != in_spec ) ||
+ ( cache_ptr->max_cache_size != (500 * 1000) ) ||
+ ( cache_ptr->min_clean_size != (50 * 1000) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 17.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* force low hit rate with cache full -- should
+ * increase cache size from .5 to 1 M.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != increase ) ||
+ ( cache_ptr->max_cache_size != (1 * 1000 * 1000) ) ||
+ ( cache_ptr->min_clean_size != (100 * 1000) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 18.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* force high hit rate -- should result in a decrease to the
+ * minimum cache size.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != decrease ) ||
+ ( cache_ptr->max_cache_size != (500 * 1000) ) ||
+ ( cache_ptr->min_clean_size != (50 * 1000) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 19.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /******************************************************************
+ * now do some tests with the maximum increase and decrease sizes
+ * disabled.
+ ******************************************************************/
+
+ if ( pass ) {
+
+ auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+ auto_size_ctl.rpt_fcn = test_rpt_fcn;
+
+ auto_size_ctl.set_initial_size = TRUE;
+ auto_size_ctl.initial_size = 4 * 1024 * 1024;
+
+ auto_size_ctl.min_clean_fraction = 0.5;
+
+ auto_size_ctl.max_size = 16 * 1024 * 1024;
+ auto_size_ctl.min_size = 1 * 1024 * 1024;
+
+ auto_size_ctl.epoch_length = 1000;
+
+
+ auto_size_ctl.incr_mode = H5C_incr__threshold;
+
+ auto_size_ctl.lower_hr_threshold = 0.75;
+
+ auto_size_ctl.increment = 4.0;
+
+ auto_size_ctl.apply_max_increment = FALSE;
+ auto_size_ctl.max_increment = (4 * 1024 * 1024);
+
+
+ auto_size_ctl.decr_mode = H5C_decr__threshold;
+
+ auto_size_ctl.upper_hr_threshold = 0.995;
+
+ auto_size_ctl.decrement = 0.25;
+
+ auto_size_ctl.apply_max_decrement = FALSE;
+ auto_size_ctl.max_decrement = (1 * 1024 * 1024);
+
+ auto_size_ctl.epochs_before_eviction = 3;
+
+ auto_size_ctl.apply_empty_reserve = TRUE;
+ auto_size_ctl.empty_reserve = 0.05;
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_set_cache_auto_resize_config failed 3.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "bad cache size after set resize re-config 2.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* force high hit rate -- should result in a decrease to the
+ * minimum cache size.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != decrease ) ||
+ ( cache_ptr->max_cache_size != (1 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (512 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 20.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* force low hit rate with cache full -- should increase cache size
+ * from 1 to 4 Meg.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != increase ) ||
+ ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 21.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* force low hit rate again with cache full -- should increase cache
+ * size from 4 to 16 Meg.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != increase ) ||
+ ( cache_ptr->max_cache_size != (16 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != ( 8 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 22.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* force high hit rate -- should result in a decrease cache size from
+ * 16 to 4 Meg.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != decrease ) ||
+ ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 23.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /******************************************************************
+ * We have tested the threshold increment and decrement modes.
+ * must now test the ageout decrement mode.
+ *
+ * Reconfigure the cache for this testing.
+ ******************************************************************/
+
+ if ( pass ) {
+
+ auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+ auto_size_ctl.rpt_fcn = test_rpt_fcn;
+
+ auto_size_ctl.set_initial_size = TRUE;
+ auto_size_ctl.initial_size = 8 * 1024 * 1024;
+
+ auto_size_ctl.min_clean_fraction = 0.5;
+
+ auto_size_ctl.max_size = 8 * 1024 * 1024;
+ auto_size_ctl.min_size = 512 * 1024;
+
+ auto_size_ctl.epoch_length = 1000;
+
+
+ auto_size_ctl.incr_mode = H5C_incr__threshold;
+
+ auto_size_ctl.lower_hr_threshold = 0.75;
+
+ auto_size_ctl.increment = 2.0;
+
+ auto_size_ctl.apply_max_increment = TRUE;
+ auto_size_ctl.max_increment = (4 * 1024 * 1024);
+
+
+ auto_size_ctl.decr_mode = H5C_decr__age_out;
+
+ auto_size_ctl.upper_hr_threshold = 0.995;
+
+ auto_size_ctl.decrement = 0.5;
+
+ auto_size_ctl.apply_max_decrement = FALSE;
+ auto_size_ctl.max_decrement = (1 * 1024 * 1024);
+
+ auto_size_ctl.epochs_before_eviction = 3;
+
+ auto_size_ctl.apply_empty_reserve = FALSE;
+ auto_size_ctl.empty_reserve = 0.05;
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_set_cache_auto_resize_config failed 4.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ if ( ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "bad cache size after set resize re-config 3.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+
+ /* fill the cache with 1024 byte entries -- nothing should happen
+ * for three epochs while the markers are inserted into the cache
+ *
+ * Note that hit rate will be zero, so the cache will attempt to
+ * increase its size. Since we are already at max size, it will
+ * not be able to.
+ */
+ if ( pass ) { /* first epoch */
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != at_max_size ) ||
+ ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 24.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ if ( pass ) { /* second epoch */
+
+ rpt_fcn_called = FALSE;
+ i = 1000;
+ while ( ( pass ) && ( i < 2000 ) )
+ {
+ protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != at_max_size ) ||
+ ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 25.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ if ( pass ) { /* third epoch */
+
+ rpt_fcn_called = FALSE;
+ i = 2000;
+ while ( ( pass ) && ( i < 3000 ) )
+ {
+ protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != at_max_size ) ||
+ ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 26.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* fourth epoch -- If the hit rate were above the lower threshold,
+ * we would see cache size reduction now. However, nothing will
+ * happen until we get the hit rate above the lower threshold.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 3000;
+ while ( ( pass ) && ( i < 4000 ) )
+ {
+ protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != at_max_size ) ||
+ ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 27.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* fifth epoch -- force the hit rate to 100%. We should see cache size
+ * reduction now.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 3000;
+ while ( ( pass ) && ( i < 4000 ) )
+ {
+ protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != decrease ) ||
+ ( cache_ptr->max_cache_size != (2001 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (int)(2001 * 512) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 28.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* sixth epoch -- force the hit rate to 100% again.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 3000;
+ while ( ( pass ) && ( i < 4000 ) )
+ {
+ protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != decrease ) ||
+ ( cache_ptr->max_cache_size != (1001 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (int)(1001 * 512) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 29.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* seventh epoch -- force the hit rate to 100% again.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 3000;
+ while ( ( pass ) && ( i < 4000 ) )
+ {
+ protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != decrease ) ||
+ ( cache_ptr->max_cache_size != (1000 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (int)(1000 * 512) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 30.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* eigth epoch -- force the hit rate to 100% again -- should be steady
+ * state.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 3000;
+ while ( ( pass ) && ( i < 4000 ) )
+ {
+ protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != in_spec ) ||
+ ( cache_ptr->max_cache_size != (1000 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (int)(1000 * 512) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 31.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "*check point %d\n", checkpoint++);
+
+ /* now just bang on one entry -- after three epochs, this should
+ * get all entries other than the one evicted, and the cache size
+ * should be decreased to the minimum.
+ */
+ if ( pass ) { /* ninth epoch */
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != in_spec ) ||
+ ( cache_ptr->max_cache_size != (1000 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (int)(1000 * 512) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 32.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ if ( pass ) { /* tenth epoch */
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != in_spec ) ||
+ ( cache_ptr->max_cache_size != (1000 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (int)(1000 * 512) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 33.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ if ( pass ) { /* eleventh epoch -- cache size reduction */
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != decrease ) ||
+ ( cache_ptr->max_cache_size != (512 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (256 * 1024) ) ||
+ ( cache_ptr->index_len != 2 ) ||
+ ( cache_ptr->index_size !=
+ MONSTER_ENTRY_SIZE + MEDIUM_ENTRY_SIZE ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 34.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ if ( pass ) { /* twelth epoch -- at minimum size so no more ageouts */
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != at_min_size ) ||
+ ( cache_ptr->max_cache_size != (512 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (256 * 1024) ) ||
+ ( cache_ptr->index_len != 2 ) ||
+ ( cache_ptr->index_size !=
+ MONSTER_ENTRY_SIZE + MEDIUM_ENTRY_SIZE ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 35.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+
+ /* repeat the above test, but with max_decrement enabled to see
+ * if that features works as it should. Note that this will change
+ * the structure of the test a bit.
+ */
+
+ if ( pass ) {
+
+ auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+ auto_size_ctl.rpt_fcn = test_rpt_fcn;
+
+ auto_size_ctl.set_initial_size = TRUE;
+ auto_size_ctl.initial_size = 8 * 1024 * 1024;
+
+ auto_size_ctl.min_clean_fraction = 0.5;
+
+ auto_size_ctl.max_size = 8 * 1024 * 1024;
+ auto_size_ctl.min_size = 512 * 1024;
+
+ auto_size_ctl.epoch_length = 1000;
+
+
+ auto_size_ctl.incr_mode = H5C_incr__threshold;
+
+ auto_size_ctl.lower_hr_threshold = 0.75;
+
+ auto_size_ctl.increment = 2.0;
+
+ auto_size_ctl.apply_max_increment = TRUE;
+ auto_size_ctl.max_increment = (4 * 1024 * 1024);
+
+
+ auto_size_ctl.decr_mode = H5C_decr__age_out;
+
+ auto_size_ctl.upper_hr_threshold = 0.995;
+
+ auto_size_ctl.decrement = 0.5;
+
+ auto_size_ctl.apply_max_decrement = TRUE;
+ auto_size_ctl.max_decrement = (1 * 1024 * 1024);
+
+ auto_size_ctl.epochs_before_eviction = 3;
+
+ auto_size_ctl.apply_empty_reserve = FALSE;
+ auto_size_ctl.empty_reserve = 0.05;
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_set_cache_auto_resize_config failed 5.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ if ( ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "bad cache size after set resize re-config 4.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+
+ /* fill the cache with 1024 byte entries -- nothing should happen
+ * for three epochs while the markers are inserted into the cache
+ *
+ * Note that hit rate will be zero, so the cache will attempt to
+ * increase its size. Since we are already at max size, it will
+ * not be able to.
+ */
+ if ( pass ) { /* first epoch */
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != at_max_size ) ||
+ ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 36.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ if ( pass ) { /* second epoch */
+
+ rpt_fcn_called = FALSE;
+ i = 1000;
+ while ( ( pass ) && ( i < 2000 ) )
+ {
+ protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != at_max_size ) ||
+ ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 37.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ if ( pass ) { /* third epoch */
+
+ rpt_fcn_called = FALSE;
+ i = 2000;
+ while ( ( pass ) && ( i < 3000 ) )
+ {
+ protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != at_max_size ) ||
+ ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 38.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* fourth epoch -- If the hit rate were above the lower threshold,
+ * we would see cache size reduction now. However, nothing will
+ * happen until we get the hit rate above the lower threshold.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 3000;
+ while ( ( pass ) && ( i < 4000 ) )
+ {
+ protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != at_max_size ) ||
+ ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 39.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* fifth epoch -- force the hit rate to 100%. We should see cache size
+ * reduction now.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 3000;
+ while ( ( pass ) && ( i < 4000 ) )
+ {
+ protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != decrease ) ||
+ ( cache_ptr->max_cache_size != (7 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (7 * 512 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 40.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* sixth epoch -- force the hit rate to 100% again.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 2000;
+ while ( ( pass ) && ( i < 3000 ) )
+ {
+ protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != decrease ) ||
+ ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (6 * 512 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 41.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* seventh epoch -- keep hit rate at 100%, and keep 2K entries active.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 3000;
+ while ( ( pass ) && ( i < 4000 ) )
+ {
+ protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != decrease ) ||
+ ( cache_ptr->max_cache_size != (5 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (5 * 512 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 42.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* eigth epoch -- still 100% hit rate
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 2000;
+ while ( ( pass ) && ( i < 3000 ) )
+ {
+ protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != decrease ) ||
+ ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (4 * 512 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 43.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* ninth epoch --hit rate at 100%.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 3000;
+ while ( ( pass ) && ( i < 4000 ) )
+ {
+ protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != decrease ) ||
+ ( cache_ptr->max_cache_size != (3 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (3 * 512 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 44.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* tenth epoch -- still 100% hit rate
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 2000;
+ while ( ( pass ) && ( i < 3000 ) )
+ {
+ protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != decrease ) ||
+ ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (2 * 512 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 45.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* eleventh epoch -- hit rate at 100% -- starting to stableize
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 3000;
+ while ( ( pass ) && ( i < 4000 ) )
+ {
+ protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != decrease ) ||
+ ( cache_ptr->max_cache_size != (2000 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (int)(2000 * 512) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 46.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* twelth epoch -- force the hit rate to 100% again -- should be steady
+ * state.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 2000;
+ while ( ( pass ) && ( i < 3000 ) )
+ {
+ protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != in_spec ) ||
+ ( cache_ptr->max_cache_size != (2000 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (int)(2000 * 512) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 47.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* now just bang on one entry -- after three epochs, this should
+ * get all entries other than the one evicted, and the cache size
+ * should be decreased to the minimum.
+ */
+ if ( pass ) { /* thirteenth epoch */
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != in_spec ) ||
+ ( cache_ptr->max_cache_size != (2000 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (int)(2000 * 512) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 48.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ if ( pass ) { /* fourteenth epoch */
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != decrease ) ||
+ ( cache_ptr->max_cache_size !=
+ (1001 * 1024 + MONSTER_ENTRY_SIZE) ) ||
+ ( cache_ptr->min_clean_size !=
+ (1001 * 512 + MONSTER_ENTRY_SIZE / 2) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 49.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ if ( pass ) { /* fifteenth epoch -- cache size reduction */
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != decrease ) ||
+ ( cache_ptr->max_cache_size != (512 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (256 * 1024) ) ||
+ ( cache_ptr->index_len != 2 ) ||
+ ( cache_ptr->index_size !=
+ MONSTER_ENTRY_SIZE + MEDIUM_ENTRY_SIZE ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 50.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ if ( pass ) { /* sixteenth epoch -- at minimum size so no more ageouts */
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != at_min_size ) ||
+ ( cache_ptr->max_cache_size != (512 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (256 * 1024) ) ||
+ ( cache_ptr->index_len != 2 ) ||
+ ( cache_ptr->index_size !=
+ MONSTER_ENTRY_SIZE + MEDIUM_ENTRY_SIZE ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 51.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+
+ /* repeat the test yet again, this time with empty reserve enabled.
+ * Again, some structural changes in the test are necessary.
+ */
+
+ if ( pass ) {
+
+ auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+ auto_size_ctl.rpt_fcn = test_rpt_fcn;
+
+ auto_size_ctl.set_initial_size = TRUE;
+ auto_size_ctl.initial_size = 8 * 1024 * 1024;
+
+ auto_size_ctl.min_clean_fraction = 0.5;
+
+ auto_size_ctl.max_size = 8 * 1024 * 1024;
+ auto_size_ctl.min_size = 512 * 1024;
+
+ auto_size_ctl.epoch_length = 1000;
+
+
+ auto_size_ctl.incr_mode = H5C_incr__threshold;
+
+ auto_size_ctl.lower_hr_threshold = 0.75;
+
+ auto_size_ctl.increment = 2.0;
+
+ auto_size_ctl.apply_max_increment = TRUE;
+ auto_size_ctl.max_increment = (4 * 1024 * 1024);
+
+
+ auto_size_ctl.decr_mode = H5C_decr__age_out;
+
+ auto_size_ctl.upper_hr_threshold = 0.995;
+
+ auto_size_ctl.decrement = 0.5;
+
+ auto_size_ctl.apply_max_decrement = FALSE;
+ auto_size_ctl.max_decrement = (1 * 1024 * 1024);
+
+ auto_size_ctl.epochs_before_eviction = 3;
+
+ auto_size_ctl.apply_empty_reserve = TRUE;
+ auto_size_ctl.empty_reserve = 0.5; /* for ease of testing */
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_set_cache_auto_resize_config failed 6.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ if ( ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "bad cache size after set resize re-config 5.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+
+ /* fill the cache with 1024 byte entries -- nothing should happen
+ * for three epochs while the markers are inserted into the cache
+ *
+ * Note that hit rate will be zero, so the cache will attempt to
+ * increase its size. Since we are already at max size, it will
+ * not be able to.
+ */
+ if ( pass ) { /* first epoch */
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != at_max_size ) ||
+ ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 52.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ if ( pass ) { /* second epoch */
+
+ rpt_fcn_called = FALSE;
+ i = 1000;
+ while ( ( pass ) && ( i < 2000 ) )
+ {
+ protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != at_max_size ) ||
+ ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 53.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ if ( pass ) { /* third epoch */
+
+ rpt_fcn_called = FALSE;
+ i = 2000;
+ while ( ( pass ) && ( i < 3000 ) )
+ {
+ protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != at_max_size ) ||
+ ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 54.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* fourth epoch -- If the hit rate were above the lower threshold,
+ * we would see cache size reduction now. However, nothing will
+ * happen until we get the hit rate above the lower threshold.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 3000;
+ while ( ( pass ) && ( i < 4000 ) )
+ {
+ protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != at_max_size ) ||
+ ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 55.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* fifth epoch -- force the hit rate to 100%. We should see cache size
+ * reduction now.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 3000;
+ while ( ( pass ) && ( i < 4000 ) )
+ {
+ protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != decrease ) ||
+ ( cache_ptr->max_cache_size != (4002 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (int)(4002 * 512) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 56.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* sixth epoch -- force the hit rate to 100% again.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 3000;
+ while ( ( pass ) && ( i < 4000 ) )
+ {
+ protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != decrease ) ||
+ ( cache_ptr->max_cache_size != (2002 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (int)(2002 * 512) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 57.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* seventh epoch -- force the hit rate to 100% again.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 3000;
+ while ( ( pass ) && ( i < 4000 ) )
+ {
+ protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != decrease ) ||
+ ( cache_ptr->max_cache_size != (2000 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (int)(2000 * 512) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 58.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* eigth epoch -- force the hit rate to 100% again -- should be steady
+ * state.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 3000;
+ while ( ( pass ) && ( i < 4000 ) )
+ {
+ protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != in_spec ) ||
+ ( cache_ptr->max_cache_size != (2000 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (int)(2000 * 512) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 59.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* now just bang on one entry -- after three epochs, this should
+ * get all entries other than the one evicted, and the cache size
+ * should be decreased to the minimum.
+ */
+ if ( pass ) { /* ninth epoch */
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != in_spec ) ||
+ ( cache_ptr->max_cache_size != (2000 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (int)(2000 * 512) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 60.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ if ( pass ) { /* tenth epoch */
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != in_spec ) ||
+ ( cache_ptr->max_cache_size != (2000 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (2000 * 512) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 61.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ if ( pass ) { /* eleventh epoch -- cache size reduction */
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != decrease ) ||
+ ( cache_ptr->max_cache_size != (512 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (256 * 1024) ) ||
+ ( cache_ptr->index_len != 2 ) ||
+ ( cache_ptr->index_size !=
+ MONSTER_ENTRY_SIZE + MEDIUM_ENTRY_SIZE ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 62.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ if ( pass ) { /* twelth epoch -- at minimum size so no more ageouts */
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != at_min_size ) ||
+ ( cache_ptr->max_cache_size != (512 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (256 * 1024) ) ||
+ ( cache_ptr->index_len != 2 ) ||
+ ( cache_ptr->index_size !=
+ MONSTER_ENTRY_SIZE + MEDIUM_ENTRY_SIZE ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 63.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+
+ /* Repeat the test again, this time using the age out with threshold
+ * mode. To simplify the testing, set epochs to eviction to 1.
+ *
+ * Again, there are some minor structural changes in the test.
+ */
+
+ if ( pass ) {
+
+ auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+ auto_size_ctl.rpt_fcn = test_rpt_fcn;
+
+ auto_size_ctl.set_initial_size = TRUE;
+ auto_size_ctl.initial_size = 8 * 1024 * 1024;
+
+ auto_size_ctl.min_clean_fraction = 0.5;
+
+ auto_size_ctl.max_size = 8 * 1024 * 1024;
+ auto_size_ctl.min_size = 512 * 1024;
+
+ auto_size_ctl.epoch_length = 1000;
+
+
+ auto_size_ctl.incr_mode = H5C_incr__off;
+
+ auto_size_ctl.lower_hr_threshold = 0.75;
+
+ auto_size_ctl.increment = 2.0;
+
+ auto_size_ctl.apply_max_increment = TRUE;
+ auto_size_ctl.max_increment = (4 * 1024 * 1024);
+
+
+ auto_size_ctl.decr_mode = H5C_decr__age_out_with_threshold;
+
+ auto_size_ctl.upper_hr_threshold = 0.999; /* for ease of testing */
+
+ auto_size_ctl.decrement = 0.5;
+
+ auto_size_ctl.apply_max_decrement = FALSE;
+ auto_size_ctl.max_decrement = (1 * 1024 * 1024);
+
+ auto_size_ctl.epochs_before_eviction = 1; /* for ease of testing */
+
+ auto_size_ctl.apply_empty_reserve = FALSE;
+ auto_size_ctl.empty_reserve = 0.05;
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_set_cache_auto_resize_config failed 7.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ if ( ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "bad cache size after set resize re-config 6.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+
+ /* fill the cache with 4K byte entries -- increment mode is off,
+ * so cache size reduction should kick in as soon as we get the
+ * hit rate above .999.
+ */
+ if ( pass ) { /* first epoch -- hit rate 0 */
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, LARGE_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, LARGE_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != in_spec ) ||
+ ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 64.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ if ( pass ) { /* second epoch -- hit rate 0 */
+
+ rpt_fcn_called = FALSE;
+ i = 1000;
+ while ( ( pass ) && ( i < 2000 ) )
+ {
+ protect_entry(cache_ptr, LARGE_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, LARGE_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != in_spec ) ||
+ ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 65.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ if ( pass ) { /* third epoch -- hit rate 1.0 -- should see decrease */
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, LARGE_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, LARGE_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != decrease ) ||
+ ( cache_ptr->max_cache_size != (1001 * LARGE_ENTRY_SIZE) ) ||
+ ( cache_ptr->min_clean_size != (1001 * LARGE_ENTRY_SIZE / 2) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 66.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* fourth epoch -- load up the cache again -- hit rate 0 */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != in_spec ) ||
+ ( cache_ptr->max_cache_size != (1001 * LARGE_ENTRY_SIZE) ) ||
+ ( cache_ptr->min_clean_size != (1001 * LARGE_ENTRY_SIZE / 2) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 67.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* fifth epoch -- still loading up the cache -- hit rate 0 */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 1000;
+ while ( ( pass ) && ( i < 2000 ) )
+ {
+ protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != in_spec ) ||
+ ( cache_ptr->max_cache_size != (1001 * LARGE_ENTRY_SIZE) ) ||
+ ( cache_ptr->min_clean_size != (1001 * LARGE_ENTRY_SIZE / 2) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 68.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* sixth epoch -- force hit rate to .998 -- should be no reduction */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 1002;
+ while ( ( pass ) && ( i < 2002 ) )
+ {
+ protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != in_spec ) ||
+ ( cache_ptr->max_cache_size != (1001 * LARGE_ENTRY_SIZE) ) ||
+ ( cache_ptr->min_clean_size != (1001 * LARGE_ENTRY_SIZE / 2) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 69.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* seventh epoch -- force hit rate to .999 -- should see reduction
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 1003;
+ while ( ( pass ) && ( i < 2003 ) )
+ {
+ protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != decrease ) ||
+ ( cache_ptr->max_cache_size != (1000 * MEDIUM_ENTRY_SIZE) ) ||
+ ( cache_ptr->min_clean_size != (1000 * MEDIUM_ENTRY_SIZE / 2) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 70.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+
+ /* We have now tested all the major ageout modes individually.
+ * Lets try them all together to look for unexpected interactions
+ * and/or bugs.
+ */
+
+ if ( pass ) {
+
+ auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+ auto_size_ctl.rpt_fcn = test_rpt_fcn;
+
+ auto_size_ctl.set_initial_size = TRUE;
+ auto_size_ctl.initial_size = 8 * 1000 * 1024;
+
+ auto_size_ctl.min_clean_fraction = 0.5;
+
+ auto_size_ctl.max_size = 8 * 1000 * 1024;
+ auto_size_ctl.min_size = 512 * 1024;
+
+ auto_size_ctl.epoch_length = 1000;
+
+
+ auto_size_ctl.incr_mode = H5C_incr__threshold;
+
+ auto_size_ctl.lower_hr_threshold = 0.75;
+
+ auto_size_ctl.increment = 2.0;
+
+ auto_size_ctl.apply_max_increment = TRUE;
+ auto_size_ctl.max_increment = (4 * 1024 * 1024);
+
+
+ auto_size_ctl.decr_mode = H5C_decr__age_out_with_threshold;
+
+ auto_size_ctl.upper_hr_threshold = 0.999; /* for ease of testing */
+
+ auto_size_ctl.decrement = 0.5;
+
+ auto_size_ctl.apply_max_decrement = TRUE;
+ auto_size_ctl.max_decrement = (1 * 1000 * 1024);
+
+ auto_size_ctl.epochs_before_eviction = 1; /* for ease of testing */
+
+ auto_size_ctl.apply_empty_reserve = TRUE;
+ auto_size_ctl.empty_reserve = 0.5; /* for ease of testing */
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_set_cache_auto_resize_config failed 8.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ if ( ( cache_ptr->max_cache_size != (8 * 1000 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (4 * 1000 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "bad cache size after set resize re-config 7.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* fill the cache with 4K byte entries -- increment mode is threshold,
+ * so the decrease code will not be executed until the hit rate exceeds
+ * .75.
+ */
+ if ( pass ) { /* first epoch -- hit rate 0 */
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, LARGE_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, LARGE_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != at_max_size ) ||
+ ( cache_ptr->max_cache_size != (8 * 1000 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (4 * 1000 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 71.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ if ( pass ) { /* second epoch -- hit rate 0 */
+
+ rpt_fcn_called = FALSE;
+ i = 1000;
+ while ( ( pass ) && ( i < 2000 ) )
+ {
+ protect_entry(cache_ptr, LARGE_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, LARGE_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != at_max_size ) ||
+ ( cache_ptr->max_cache_size != (8 * 1000 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (4 * 1000 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 72.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* third epoch -- force the hit rate to 1.0. Should be no change
+ * in the cache size due to the combination of the empty reserve
+ * and the max decrease. Max decrease will limit the evictions
+ * in any one epoch, and the empty reserve will not permit cache
+ * size reduction unless the specified empty reserve is maintained.
+ *
+ * In this epoch, all we should see is a reduction in the index size.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, LARGE_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, LARGE_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != in_spec ) ||
+ ( cache_ptr->max_cache_size != (8 * 1000 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (4 * 1000 * 1024) ) ||
+ ( cache_ptr->index_size != (7 * 1000 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 73.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* fourth epoch -- hit rate still 1.0. Index size should decrease,
+ * but otherwise no change expected.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, LARGE_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, LARGE_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != in_spec ) ||
+ ( cache_ptr->max_cache_size != (8 * 1000 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (4 * 1000 * 1024) ) ||
+ ( cache_ptr->index_size != (6 * 1000 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 74.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* fifth epoch -- hit rate still 1.0. Index size should decrease,
+ * but otherwise no change expected.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, LARGE_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, LARGE_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != in_spec ) ||
+ ( cache_ptr->max_cache_size != (8 * 1000 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (4 * 1000 * 1024) ) ||
+ ( cache_ptr->index_size != (5 * 1000 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 75.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* sixth epoch -- hit rate still 1.0. Index size should decrease,
+ * but otherwise no change expected. Note that the cache size is
+ * now just on the edge of meeting the clean reserve.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, LARGE_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, LARGE_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != in_spec ) ||
+ ( cache_ptr->max_cache_size != (8 * 1000 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (4 * 1000 * 1024) ) ||
+ ( cache_ptr->index_size != (4 * 1000 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 76.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* seventh epoch -- hit rate still 1.0. No change in index size expected.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, LARGE_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, LARGE_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != in_spec ) ||
+ ( cache_ptr->max_cache_size != (8 * 1000 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (4 * 1000 * 1024) ) ||
+ ( cache_ptr->index_size != (4 * 1000 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 77.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* eighth epoch -- start loading 1 KB entries. Hit rate 0 so
+ * decrease code shouldn't be called.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != at_max_size ) ||
+ ( cache_ptr->max_cache_size != (8 * 1000 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (4 * 1000 * 1024) ) ||
+ ( cache_ptr->index_size != (5 * 1000 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 78.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* ninth epoch -- access the 1 KB entries again, driving the hit rate
+ * to 1.0. Decrease code should be triggered, but the max decrease
+ * should prevent the empty reserve from being met in this epoch.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != in_spec ) ||
+ ( cache_ptr->max_cache_size != (8 * 1000 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (4 * 1000 * 1024) ) ||
+ ( cache_ptr->index_size != (4 * 1000 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 79.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* tenth epoch -- access the 1 KB entries yet again, forcing hit rate
+ * to 1.0. Decrease code should be triggered, and the empty reserve
+ * should finally be met.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != decrease ) ||
+ ( cache_ptr->max_cache_size != (7 * 1000 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (7 * 1000 * 1024 / 2) ) ||
+ ( cache_ptr->index_size != (3 * 1000 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 80.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* eleventh epoch -- access the 1 KB entries yet again, forcing hit rate
+ * to 1.0. Decrease code should be triggered, and the empty reserve
+ * should be met again.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != decrease ) ||
+ ( cache_ptr->max_cache_size != (6 * 1000 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (3 * 1000 * 1024) ) ||
+ ( cache_ptr->index_size != (2 * 1000 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 81.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* twelth epoch -- hit rate 1.0 -- decrease as before.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != decrease ) ||
+ ( cache_ptr->max_cache_size != (5 * 1000 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (5 * 1000 * 1024 / 2) ) ||
+ ( cache_ptr->index_size != (1 * 1000 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 82.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* thirteenth epoch -- hit rate 1.0 -- decrease as before.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != decrease ) ||
+ ( cache_ptr->max_cache_size != (4 * 1000 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (2 * 1000 * 1024) ) ||
+ ( cache_ptr->index_size != (1 * 1000 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 83.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* fourteenth epoch -- hit rate 1.0 -- decrease as before.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != decrease ) ||
+ ( cache_ptr->max_cache_size != (3 * 1000 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (3 * 1000 * 1024 / 2) ) ||
+ ( cache_ptr->index_size != (1 * 1000 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 84.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* fifteenth epoch -- hit rate 1.0 -- decrease as before.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != decrease ) ||
+ ( cache_ptr->max_cache_size != (2 * 1000 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (1 * 1000 * 1024) ) ||
+ ( cache_ptr->index_size != (1 * 1000 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 85.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* sixteenth epoch -- hit rate 1.0 -- should be stable now
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != in_spec ) ||
+ ( cache_ptr->max_cache_size != (2 * 1000 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (1 * 1000 * 1024) ) ||
+ ( cache_ptr->index_size != (1 * 1000 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 86.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ if ( pass ) {
+
+ takedown_cache(cache_ptr, FALSE, FALSE);
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ if ( pass ) { PASSED(); } else { H5_FAILED(); }
+
+ if ( ! pass )
+ HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
+ fcn_name, failure_mssg);
+
+} /* check_auto_cache_resize() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: check_auto_cache_resize_disable()
+ *
+ * Purpose: Test the various ways in which the resize code can
+ * be disabled. Unfortunately, there are quite a few of them.
+ *
+ * Return: void
+ *
+ * Programmer: John Mainzer
+ * 12/16/04
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static void
+check_auto_cache_resize_disable(void)
+{
+ const char * fcn_name = "check_auto_cache_resize_disable()";
+ hbool_t show_progress = FALSE;
+ herr_t result;
+ int32_t i;
+ int32_t checkpoint = 0;
+ H5C_t * cache_ptr = NULL;
+ H5C_auto_size_ctl_t auto_size_ctl =
+ {
+ /* int32_t version = */ H5C__CURR_AUTO_SIZE_CTL_VER,
+ /* H5C_auto_resize_report_fcn rpt_fcn = */ test_rpt_fcn,
+
+ /* hbool_t set_initial_size = */ TRUE,
+ /* size_t initial_size = */ (512 * 1024),
+
+ /* double min_clean_fraction = */ 0.5,
+
+ /* size_t max_size = */ (14 * 1024 * 1024),
+ /* size_t min_size = */ (512 * 1024),
+
+ /* int64_t epoch_length = */ 1000,
+
+
+ /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold,
+
+ /* double lower_hr_threshold = */ 0.75,
+
+ /* double increment = */ 2.0,
+
+ /* hbool_t apply_max_increment = */ TRUE,
+ /* size_t max_increment = */ (4 * 1024 * 1024),
+
+
+ /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__threshold,
+
+ /* double upper_hr_threshold = */ 0.995,
+
+ /* double decrement = */ 0.1,
+
+ /* hbool_t apply_max_decrement = */ TRUE,
+ /* size_t max_decrement = */ (1 * 1024 * 1024),
+
+ /* int32_t epochs_before_eviction = */ 3,
+
+ /* hbool_t apply_empty_reserve = */ TRUE,
+ /* double empty_reserve = */ 0.05
+ };
+
+ TESTING("automatic cache resize disable");
+
+ pass = TRUE;
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* allocate a cache, enable automatic cache resizing, and then force
+ * the cache through all its operational modes. Verify that all
+ * performs as expected.
+ */
+
+ if ( pass ) {
+
+ reset_entries();
+
+ cache_ptr = setup_cache((size_t)(2 * 1024),
+ (size_t)(1 * 1024));
+ }
+
+ if ( pass ) {
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_set_cache_auto_resize_config failed 1.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ if ( ( cache_ptr->max_cache_size != (512 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (256 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "bad cache size after initialization.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+
+ /******************************************************************
+ * So far, we have forced the auto cache resize through all modes
+ * other than increase_disabled and decrease_disabled. Force these
+ * modes now. Note that there are several ways we can reach these
+ * modes.
+ ******************************************************************/
+
+ if ( pass ) {
+
+ auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+ auto_size_ctl.rpt_fcn = test_rpt_fcn;
+
+ auto_size_ctl.set_initial_size = TRUE;
+ auto_size_ctl.initial_size = 4 * 1024 * 1024;
+
+ auto_size_ctl.min_clean_fraction = 0.5;
+
+ auto_size_ctl.max_size = 16 * 1024 * 1024;
+ auto_size_ctl.min_size = 1 * 1024 * 1024;
+
+ auto_size_ctl.epoch_length = 1000;
+
+
+ auto_size_ctl.incr_mode = H5C_incr__threshold;
+
+ auto_size_ctl.lower_hr_threshold = 0.75;
+
+ auto_size_ctl.increment = 1.0; /* disable size increases */
+
+ auto_size_ctl.apply_max_increment = FALSE;
+ auto_size_ctl.max_increment = (4 * 1024 * 1024);
+
+
+ auto_size_ctl.decr_mode = H5C_decr__threshold;
+
+ auto_size_ctl.upper_hr_threshold = 0.995;
+
+ auto_size_ctl.decrement = 0.5;
+
+ auto_size_ctl.apply_max_decrement = FALSE;
+ auto_size_ctl.max_decrement = (1 * 1024 * 1024);
+
+ auto_size_ctl.epochs_before_eviction = 3;
+
+ auto_size_ctl.apply_empty_reserve = TRUE;
+ auto_size_ctl.empty_reserve = 0.05;
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_set_cache_auto_resize_config failed 2.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "bad cache size after set resize re-config 1.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* force low hit rate with cache full -- increase disabled so should
+ * be no change in cache size, and result should be increase_disabled.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( cache_ptr->size_increase_possible ) ||
+ ( rpt_status != increase_disabled ) ||
+ ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 1.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* force high hit rate -- make sure that we haven't disabled decreases.
+ * should result in a decrease cache size from 4 to 2 Meg.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != decrease ) ||
+ ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 2.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* force low hit rate again -- increase disabled so should
+ * be no change in cache size, and result should be increase_disabled.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( cache_ptr->size_increase_possible ) ||
+ ( rpt_status != increase_disabled ) ||
+ ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 3.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* Repeat the above tests, disabling increase through the lower
+ * threshold instead of the increment.
+ */
+
+ if ( pass ) {
+
+ auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+ auto_size_ctl.rpt_fcn = test_rpt_fcn;
+
+ auto_size_ctl.set_initial_size = TRUE;
+ auto_size_ctl.initial_size = 4 * 1024 * 1024;
+
+ auto_size_ctl.min_clean_fraction = 0.5;
+
+ auto_size_ctl.max_size = 16 * 1024 * 1024;
+ auto_size_ctl.min_size = 1 * 1024 * 1024;
+
+ auto_size_ctl.epoch_length = 1000;
+
+
+ auto_size_ctl.incr_mode = H5C_incr__threshold;
+
+ auto_size_ctl.lower_hr_threshold = 0.0; /* disable size increases */
+
+ auto_size_ctl.increment = 2.0;
+
+ auto_size_ctl.apply_max_increment = FALSE;
+ auto_size_ctl.max_increment = (4 * 1024 * 1024);
+
+
+ auto_size_ctl.decr_mode = H5C_decr__threshold;
+
+ auto_size_ctl.upper_hr_threshold = 0.995;
+
+ auto_size_ctl.decrement = 0.5;
+
+ auto_size_ctl.apply_max_decrement = FALSE;
+ auto_size_ctl.max_decrement = (1 * 1024 * 1024);
+
+ auto_size_ctl.epochs_before_eviction = 3;
+
+ auto_size_ctl.apply_empty_reserve = TRUE;
+ auto_size_ctl.empty_reserve = 0.05;
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_set_cache_auto_resize_config failed 3.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "bad cache size after set resize re-config 2.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* force low hit rate with cache full -- increase disabled so should
+ * be no change in cache size, and result should be in_spec.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( cache_ptr->size_increase_possible ) ||
+ ( rpt_status != in_spec ) ||
+ ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 4.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* force high hit rate -- make sure that we haven't disabled decreases.
+ * should result in a decrease cache size from 4 to 2 Meg.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != decrease ) ||
+ ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 5.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* force low hit rate again -- increase disabled so should
+ * be no change in cache size, and result should be increase_disabled.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( cache_ptr->size_increase_possible ) ||
+ ( rpt_status != in_spec ) ||
+ ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 6.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* Repeat the above tests yet again, disabling increase through the
+ * incr_mode.
+ */
+
+ if ( pass ) {
+
+ auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+ auto_size_ctl.rpt_fcn = test_rpt_fcn;
+
+ auto_size_ctl.set_initial_size = TRUE;
+ auto_size_ctl.initial_size = 4 * 1024 * 1024;
+
+ auto_size_ctl.min_clean_fraction = 0.5;
+
+ auto_size_ctl.max_size = 16 * 1024 * 1024;
+ auto_size_ctl.min_size = 1 * 1024 * 1024;
+
+ auto_size_ctl.epoch_length = 1000;
+
+
+ auto_size_ctl.incr_mode = H5C_incr__off;
+
+ auto_size_ctl.lower_hr_threshold = 0.75;
+
+ auto_size_ctl.increment = 2.0;
+
+ auto_size_ctl.apply_max_increment = FALSE;
+ auto_size_ctl.max_increment = (4 * 1024 * 1024);
+
+
+ auto_size_ctl.decr_mode = H5C_decr__threshold;
+
+ auto_size_ctl.upper_hr_threshold = 0.995;
+
+ auto_size_ctl.decrement = 0.5;
+
+ auto_size_ctl.apply_max_decrement = FALSE;
+ auto_size_ctl.max_decrement = (1 * 1024 * 1024);
+
+ auto_size_ctl.epochs_before_eviction = 3;
+
+ auto_size_ctl.apply_empty_reserve = TRUE;
+ auto_size_ctl.empty_reserve = 0.05;
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_set_cache_auto_resize_config failed 4.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "bad cache size after set resize re-config 3.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* force low hit rate with cache full -- increase disabled so should
+ * be no change in cache size, and result should be in_spec.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( cache_ptr->size_increase_possible ) ||
+ ( rpt_status != in_spec ) ||
+ ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 7.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* force high hit rate -- make sure that we haven't disabled decreases.
+ * should result in a decrease cache size from 4 to 2 Meg.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != decrease ) ||
+ ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 8.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* force low hit rate again -- increase disabled so should
+ * be no change in cache size, and result should be increase_disabled.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( cache_ptr->size_increase_possible ) ||
+ ( rpt_status != in_spec ) ||
+ ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 9.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* Now, disable size decreases, and repeat the above tests.
+ */
+
+ if ( pass ) {
+
+ auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+ auto_size_ctl.rpt_fcn = test_rpt_fcn;
+
+ auto_size_ctl.set_initial_size = TRUE;
+ auto_size_ctl.initial_size = 4 * 1024 * 1024;
+
+ auto_size_ctl.min_clean_fraction = 0.5;
+
+ auto_size_ctl.max_size = 16 * 1024 * 1024;
+ auto_size_ctl.min_size = 1 * 1024 * 1024;
+
+ auto_size_ctl.epoch_length = 1000;
+
+
+ auto_size_ctl.incr_mode = H5C_incr__threshold;
+
+ auto_size_ctl.lower_hr_threshold = 0.75;
+
+ auto_size_ctl.increment = 2.0;
+
+ auto_size_ctl.apply_max_increment = TRUE;
+ auto_size_ctl.max_increment = (2 * 1024 * 1024);
+
+
+ auto_size_ctl.decr_mode = H5C_decr__threshold;
+
+ auto_size_ctl.upper_hr_threshold = 0.995;
+
+ auto_size_ctl.decrement = 1.0; /* disable size decreases */
+
+ auto_size_ctl.apply_max_decrement = TRUE;
+ auto_size_ctl.max_decrement = (1 * 1024 * 1024);
+
+ auto_size_ctl.epochs_before_eviction = 3;
+
+ auto_size_ctl.apply_empty_reserve = TRUE;
+ auto_size_ctl.empty_reserve = 0.05;
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_set_cache_auto_resize_config failed 5.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ if ( pass ) {
+
+ if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "bad cache size after set resize re-config 4.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* force high hit rate -- should be no change in cache size,
+ * and result should be decrease_disabled.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != decrease_disabled ) ||
+ ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 10.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* force low hit rate -- cache size should increase from 4 to 6 Meg.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != increase ) ||
+ ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 11.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* force high hit rate again -- should be no change in cache size,
+ * and result should be decrease_disabled.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != decrease_disabled ) ||
+ ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 12.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* Repeat the above tests, disabling decrease through the upper
+ * threshold instead of the decrement.
+ */
+
+ if ( pass ) {
+
+ auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+ auto_size_ctl.rpt_fcn = test_rpt_fcn;
+
+ auto_size_ctl.set_initial_size = TRUE;
+ auto_size_ctl.initial_size = 4 * 1024 * 1024;
+
+ auto_size_ctl.min_clean_fraction = 0.5;
+
+ auto_size_ctl.max_size = 16 * 1024 * 1024;
+ auto_size_ctl.min_size = 1 * 1024 * 1024;
+
+ auto_size_ctl.epoch_length = 1000;
+
+
+ auto_size_ctl.incr_mode = H5C_incr__threshold;
+
+ auto_size_ctl.lower_hr_threshold = 0.75;
+
+ auto_size_ctl.increment = 2.0;
+
+ auto_size_ctl.apply_max_increment = TRUE;
+ auto_size_ctl.max_increment = (2 * 1024 * 1024);
+
+
+ auto_size_ctl.decr_mode = H5C_decr__threshold;
+
+ auto_size_ctl.upper_hr_threshold = 1.0; /* disable size decreases */
+
+ auto_size_ctl.decrement = 0.5;
+
+ auto_size_ctl.apply_max_decrement = TRUE;
+ auto_size_ctl.max_decrement = (1 * 1024 * 1024);
+
+ auto_size_ctl.epochs_before_eviction = 3;
+
+ auto_size_ctl.apply_empty_reserve = TRUE;
+ auto_size_ctl.empty_reserve = 0.05;
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_set_cache_auto_resize_config failed 6.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "bad cache size after set resize re-config 5.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* force high hit rate -- should be no change in cache size,
+ * and result should be in_spec.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( cache_ptr->size_decrease_possible ) ||
+ ( rpt_status != in_spec ) ||
+ ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 13.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* force low hit rate -- cache size should increase from 4 to 6 Meg.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != increase ) ||
+ ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 14.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* force high hit rate again -- should be no change in cache size,
+ * and result should be in_spec.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( cache_ptr->size_decrease_possible ) ||
+ ( rpt_status != in_spec ) ||
+ ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 15.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* Repeat the above tests, disabling decrease through the decr_mode.
+ */
+
+ if ( pass ) {
+
+ auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+ auto_size_ctl.rpt_fcn = test_rpt_fcn;
+
+ auto_size_ctl.set_initial_size = TRUE;
+ auto_size_ctl.initial_size = 4 * 1024 * 1024;
+
+ auto_size_ctl.min_clean_fraction = 0.5;
+
+ auto_size_ctl.max_size = 16 * 1024 * 1024;
+ auto_size_ctl.min_size = 1 * 1024 * 1024;
+
+ auto_size_ctl.epoch_length = 1000;
+
+
+ auto_size_ctl.incr_mode = H5C_incr__threshold;
+
+ auto_size_ctl.lower_hr_threshold = 0.75;
+
+ auto_size_ctl.increment = 2.0;
+
+ auto_size_ctl.apply_max_increment = TRUE;
+ auto_size_ctl.max_increment = (2 * 1024 * 1024);
+
+
+ auto_size_ctl.decr_mode = H5C_decr__off;
+
+ auto_size_ctl.upper_hr_threshold = 0.995;
+
+ auto_size_ctl.decrement = 0.5;
+
+ auto_size_ctl.apply_max_decrement = TRUE;
+ auto_size_ctl.max_decrement = (1 * 1024 * 1024);
+
+ auto_size_ctl.epochs_before_eviction = 3;
+
+ auto_size_ctl.apply_empty_reserve = TRUE;
+ auto_size_ctl.empty_reserve = 0.05;
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_set_cache_auto_resize_config failed 7.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "bad cache size after set resize re-config 6.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* force high hit rate -- should be no change in cache size,
+ * and result should be in_spec.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( cache_ptr->size_decrease_possible ) ||
+ ( rpt_status != in_spec ) ||
+ ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 16.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* force low hit rate -- cache size should increase from 4 to 6 Meg.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != increase ) ||
+ ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 17.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* force high hit rate again -- should be no change in cache size,
+ * and result should be in_spec.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( cache_ptr->size_decrease_possible ) ||
+ ( rpt_status != in_spec ) ||
+ ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 18.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* Now do tests disabling size decrement in age out mode.
+ *
+ * Start by disabling size decrement by setting max_decrement to zero.
+ */
+
+ if ( pass ) {
+
+ auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+ auto_size_ctl.rpt_fcn = test_rpt_fcn;
+
+ auto_size_ctl.set_initial_size = TRUE;
+ auto_size_ctl.initial_size = 4 * 1024 * 1024;
+
+ auto_size_ctl.min_clean_fraction = 0.5;
+
+ auto_size_ctl.max_size = 16 * 1024 * 1024;
+ auto_size_ctl.min_size = 1 * 1024 * 1024;
+
+ auto_size_ctl.epoch_length = 1000;
+
+
+ auto_size_ctl.incr_mode = H5C_incr__threshold;
+
+ auto_size_ctl.lower_hr_threshold = 0.75;
+
+ auto_size_ctl.increment = 2.0;
+
+ auto_size_ctl.apply_max_increment = TRUE;
+ auto_size_ctl.max_increment = (2 * 1024 * 1024);
+
+
+ auto_size_ctl.decr_mode = H5C_decr__age_out;
+
+ auto_size_ctl.upper_hr_threshold = 0.995;
+
+ auto_size_ctl.decrement = 0.5;
+
+ auto_size_ctl.apply_max_decrement = TRUE;
+ auto_size_ctl.max_decrement = 0; /* disable decrement */
+
+ auto_size_ctl.epochs_before_eviction = 1;
+
+ auto_size_ctl.apply_empty_reserve = TRUE;
+ auto_size_ctl.empty_reserve = 0.05;
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_set_cache_auto_resize_config failed 8.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "bad cache size after set resize re-config 7.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* flush the cache and destroy all entries so we start from a known point */
+ flush_cache(cache_ptr, TRUE, FALSE, FALSE);
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* load up the cache with small entries. Note that it will take an
+ * epoch for the ageout code to initialize itself if it is enabled.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, SMALL_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, SMALL_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( cache_ptr->size_decrease_possible ) ||
+ ( rpt_status != not_full ) ||
+ ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 19.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* Load up some more small entries.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 1000;
+ while ( ( pass ) && ( i < 2000 ) )
+ {
+ protect_entry(cache_ptr, SMALL_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, SMALL_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( cache_ptr->size_decrease_possible ) ||
+ ( rpt_status != not_full ) ||
+ ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 20.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* Now force a high hit rate so that the size increase code is
+ * is satisfied. We would see a decrease here if decrease were
+ * possible.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, SMALL_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, SMALL_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( cache_ptr->size_decrease_possible ) ||
+ ( rpt_status != decrease_disabled ) ||
+ ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 21.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* force low hit rate -- cache size should increase from 4 to 6 Meg.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != increase ) ||
+ ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 22.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* just bang on a single entry. This will see to it that there are
+ * many entries that could be aged out were decreases enabled.
+ * Should be no change in cache size, and result should be
+ * decrease_disabled.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( cache_ptr->size_decrease_possible ) ||
+ ( rpt_status != decrease_disabled ) ||
+ ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 23.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* Now disable size decrement in age out mode via the empty reserve.
+ */
+
+ if ( pass ) {
+
+ auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+ auto_size_ctl.rpt_fcn = test_rpt_fcn;
+
+ auto_size_ctl.set_initial_size = TRUE;
+ auto_size_ctl.initial_size = 4 * 1024 * 1024;
+
+ auto_size_ctl.min_clean_fraction = 0.5;
+
+ auto_size_ctl.max_size = 16 * 1024 * 1024;
+ auto_size_ctl.min_size = 1 * 1024 * 1024;
+
+ auto_size_ctl.epoch_length = 1000;
+
+
+ auto_size_ctl.incr_mode = H5C_incr__threshold;
+
+ auto_size_ctl.lower_hr_threshold = 0.75;
+
+ auto_size_ctl.increment = 2.0;
+
+ auto_size_ctl.apply_max_increment = TRUE;
+ auto_size_ctl.max_increment = (2 * 1024 * 1024);
+
+
+ auto_size_ctl.decr_mode = H5C_decr__age_out;
+
+ auto_size_ctl.upper_hr_threshold = 0.995;
+
+ auto_size_ctl.decrement = 0.5;
+
+ auto_size_ctl.apply_max_decrement = TRUE;
+ auto_size_ctl.max_decrement = (1 * 1024 * 1024);
+
+ auto_size_ctl.epochs_before_eviction = 1;
+
+ auto_size_ctl.apply_empty_reserve = TRUE;
+ auto_size_ctl.empty_reserve = 1.0; /* disable decrement */
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_set_cache_auto_resize_config failed 9.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "bad cache size after set resize re-config 8.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* flush the cache and destroy all entries so we start from a known point */
+ flush_cache(cache_ptr, TRUE, FALSE, FALSE);
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* load up the cache with small entries. Note that it will take an
+ * epoch for the ageout code to initialize itself if it is enabled.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, SMALL_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, SMALL_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( cache_ptr->size_decrease_possible ) ||
+ ( rpt_status != not_full ) ||
+ ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 24.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* Load up some more small entries.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 1000;
+ while ( ( pass ) && ( i < 2000 ) )
+ {
+ protect_entry(cache_ptr, SMALL_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, SMALL_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( cache_ptr->size_decrease_possible ) ||
+ ( rpt_status != not_full ) ||
+ ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 25.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* Now force a high hit rate so that the size increase code is
+ * is satisfied. We would see a decrease here if decrease were
+ * possible.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, SMALL_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, SMALL_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( cache_ptr->size_decrease_possible ) ||
+ ( rpt_status != decrease_disabled ) ||
+ ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 26.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* force low hit rate -- cache size should increase from 4 to 6 Meg.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != increase ) ||
+ ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 27.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* just bang on a single entry. This will see to it that there are
+ * many entries that could be aged out were decreases enabled.
+ * Should be no change in cache size, and result should be
+ * decrease_disabled.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( cache_ptr->size_decrease_possible ) ||
+ ( rpt_status != decrease_disabled ) ||
+ ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 28.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* Now work with age out with threshold. One can argue that we should
+ * repeat the above age out tests with age out with threshold, but the
+ * same code is executed in both cases so I don't see the point. If
+ * that ever changes, this test should be updated.
+ *
+ * There is only one way of disabling decrements that is peculiar
+ * to age out with threshold, which is to set the upper threshold
+ * to 1.0. Test this now.
+ */
+
+ if ( pass ) {
+
+ auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+ auto_size_ctl.rpt_fcn = test_rpt_fcn;
+
+ auto_size_ctl.set_initial_size = TRUE;
+ auto_size_ctl.initial_size = 4 * 1024 * 1024;
+
+ auto_size_ctl.min_clean_fraction = 0.5;
+
+ auto_size_ctl.max_size = 16 * 1024 * 1024;
+ auto_size_ctl.min_size = 1 * 1024 * 1024;
+
+ auto_size_ctl.epoch_length = 1000;
+
+
+ auto_size_ctl.incr_mode = H5C_incr__threshold;
+
+ auto_size_ctl.lower_hr_threshold = 0.75;
+
+ auto_size_ctl.increment = 2.0;
+
+ auto_size_ctl.apply_max_increment = TRUE;
+ auto_size_ctl.max_increment = (2 * 1024 * 1024);
+
+
+ auto_size_ctl.decr_mode = H5C_decr__age_out_with_threshold;
+
+ auto_size_ctl.upper_hr_threshold = 1.0;
+
+ auto_size_ctl.decrement = 0.5;
+
+ auto_size_ctl.apply_max_decrement = TRUE;
+ auto_size_ctl.max_decrement = (1 * 1024 * 1024);
+
+ auto_size_ctl.epochs_before_eviction = 1;
+
+ auto_size_ctl.apply_empty_reserve = TRUE;
+ auto_size_ctl.empty_reserve = 0.05;
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_set_cache_auto_resize_config failed 10.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "bad cache size after set resize re-config 9.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* flush the cache and destroy all entries so we start from a known point */
+ flush_cache(cache_ptr, TRUE, FALSE, FALSE);
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* load up the cache with small entries. Note that it will take an
+ * epoch for the ageout code to initialize itself if it is enabled.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, SMALL_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, SMALL_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( cache_ptr->size_decrease_possible ) ||
+ ( rpt_status != not_full ) ||
+ ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 29.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* Load up some more small entries.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 1000;
+ while ( ( pass ) && ( i < 2000 ) )
+ {
+ protect_entry(cache_ptr, SMALL_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, SMALL_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( cache_ptr->size_decrease_possible ) ||
+ ( rpt_status != not_full ) ||
+ ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 30.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* Now force a high hit rate so that the size increase code is
+ * is satisfied. We would see a decrease here if decrease were
+ * possible, but the upper threshold cannot be met, so no decrease.
+ *
+ * rpt_status should be decrease_disabled.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, SMALL_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, SMALL_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( cache_ptr->size_decrease_possible ) ||
+ ( rpt_status != decrease_disabled ) ||
+ ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ||
+ ( cache_ptr->index_len != 2000 ) ||
+ ( cache_ptr->index_size != 2000 * SMALL_ENTRY_SIZE ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 31.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* force low hit rate -- cache size should increase from 4 to 6 Meg.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != increase ) ||
+ ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 32.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* just bang on a single entry. This keeps the hit rate high, and sees
+ * to it that there are many entries that could be aged out were
+ * decreases enabled.
+ *
+ * Should be no change in cache size, and result should be
+ * decrease_disabled.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 999);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 999,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( cache_ptr->size_decrease_possible ) ||
+ ( rpt_status != decrease_disabled ) ||
+ ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 33.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+
+ /*********************************************************************
+ * Finally, use the auto cache resize code to set the size of the
+ * cache and keep it there. Again, due to the complexity of the
+ * interface, there are lots of ways of doing this. We have to
+ * check them all.
+ *********************************************************************/
+
+ if ( pass ) {
+
+ auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+ auto_size_ctl.rpt_fcn = test_rpt_fcn;
+
+ auto_size_ctl.set_initial_size = TRUE;
+ auto_size_ctl.initial_size = 2 * 1024 * 1024;
+
+ auto_size_ctl.min_clean_fraction = 0.5;
+
+ auto_size_ctl.max_size = 16 * 1024 * 1024;
+ auto_size_ctl.min_size = 1 * 1024 * 1024;
+
+ auto_size_ctl.epoch_length = 1000;
+
+
+ auto_size_ctl.incr_mode = H5C_incr__threshold;
+
+ auto_size_ctl.lower_hr_threshold = 0.0; /* disable size increases */
+
+ auto_size_ctl.increment = 2.0;
+
+ auto_size_ctl.apply_max_increment = TRUE;
+ auto_size_ctl.max_increment = (2 * 1024 * 1024);
+
+
+ auto_size_ctl.decr_mode = H5C_decr__threshold;
+
+ auto_size_ctl.upper_hr_threshold = 1.0; /* disable size decreases */
+
+ auto_size_ctl.decrement = 0.5;
+
+ auto_size_ctl.apply_max_decrement = TRUE;
+ auto_size_ctl.max_decrement = (1 * 1024 * 1024);
+
+ auto_size_ctl.epochs_before_eviction = 3;
+
+ auto_size_ctl.apply_empty_reserve = TRUE;
+ auto_size_ctl.empty_reserve = 0.05;
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_set_cache_auto_resize_config failed 11.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ if ( ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "bad cache size after set resize re-config 10.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* force low hit rate -- should be no response as the auto-resize
+ * code should be disabled.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( rpt_fcn_called ) ||
+ ( cache_ptr->resize_enabled ) ||
+ ( cache_ptr->size_increase_possible ) ||
+ ( cache_ptr->size_decrease_possible ) ||
+ ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 34.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* force high hit rate -- should be no response as the auto-resize
+ * code should be disabled.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( rpt_fcn_called ) ||
+ ( cache_ptr->resize_enabled ) ||
+ ( cache_ptr->size_increase_possible ) ||
+ ( cache_ptr->size_decrease_possible ) ||
+ ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 35.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ if ( pass ) {
+
+ auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+ auto_size_ctl.rpt_fcn = test_rpt_fcn;
+
+ auto_size_ctl.set_initial_size = TRUE;
+ auto_size_ctl.initial_size = 4 * 1024 * 1024;
+
+ auto_size_ctl.min_clean_fraction = 0.25;
+
+ auto_size_ctl.max_size = 16 * 1024 * 1024;
+ auto_size_ctl.min_size = 1 * 1024 * 1024;
+
+ auto_size_ctl.epoch_length = 1000;
+
+
+ auto_size_ctl.incr_mode = H5C_incr__threshold;
+
+ auto_size_ctl.lower_hr_threshold = 0.75;
+
+ auto_size_ctl.increment = 1.0; /* disable size increment */
+
+ auto_size_ctl.apply_max_increment = TRUE;
+ auto_size_ctl.max_increment = (2 * 1024 * 1024);
+
+
+ auto_size_ctl.decr_mode = H5C_decr__threshold;
+
+ auto_size_ctl.upper_hr_threshold = 0.995;
+
+ auto_size_ctl.decrement = 1.0; /* disable size decrement */
+
+ auto_size_ctl.apply_max_decrement = TRUE;
+ auto_size_ctl.max_decrement = (1 * 1024 * 1024);
+
+ auto_size_ctl.epochs_before_eviction = 3;
+
+ auto_size_ctl.apply_empty_reserve = TRUE;
+ auto_size_ctl.empty_reserve = 0.05;
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_set_cache_auto_resize_config failed 12.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "bad cache size after set resize re-config 11.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* force low hit rate -- should be no response as the auto-resize
+ * code should be disabled.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( rpt_fcn_called ) ||
+ ( cache_ptr->resize_enabled ) ||
+ ( cache_ptr->size_increase_possible ) ||
+ ( cache_ptr->size_decrease_possible ) ||
+ ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 36.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* force high hit rate -- should be no response as the auto-resize
+ * code should be disabled.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( rpt_fcn_called ) ||
+ ( cache_ptr->resize_enabled ) ||
+ ( cache_ptr->size_increase_possible ) ||
+ ( cache_ptr->size_decrease_possible ) ||
+ ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 37.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ if ( pass ) {
+
+ auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+ auto_size_ctl.rpt_fcn = test_rpt_fcn;
+
+ auto_size_ctl.set_initial_size = FALSE;
+ auto_size_ctl.initial_size = 2 * 1024 * 1024;
+
+ auto_size_ctl.min_clean_fraction = 0.5;
+
+ auto_size_ctl.max_size = 6 * 1024 * 1024; /* no resize */
+ auto_size_ctl.min_size = 6 * 1024 * 1024; /* no resize */
+
+ auto_size_ctl.epoch_length = 1000;
+
+
+ auto_size_ctl.incr_mode = H5C_incr__threshold;
+
+ auto_size_ctl.lower_hr_threshold = 0.75;
+
+ auto_size_ctl.increment = 2.0;
+
+ auto_size_ctl.apply_max_increment = TRUE;
+ auto_size_ctl.max_increment = (2 * 1024 * 1024);
+
+
+ auto_size_ctl.decr_mode = H5C_decr__threshold;
+
+ auto_size_ctl.upper_hr_threshold = 0.995;
+
+ auto_size_ctl.decrement = 0.5;
+
+ auto_size_ctl.apply_max_decrement = TRUE;
+ auto_size_ctl.max_decrement = (1 * 1024 * 1024);
+
+ auto_size_ctl.epochs_before_eviction = 3;
+
+ auto_size_ctl.apply_empty_reserve = TRUE;
+ auto_size_ctl.empty_reserve = 0.05;
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_set_cache_auto_resize_config failed 13.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ if ( ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "bad cache size after set resize re-config 12.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* force low hit rate -- should be no response as the auto-resize
+ * code should be disabled.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( rpt_fcn_called ) ||
+ ( cache_ptr->resize_enabled ) ||
+ ( cache_ptr->size_increase_possible ) ||
+ ( cache_ptr->size_decrease_possible ) ||
+ ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 38.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* force high hit rate -- should be no response as the auto-resize
+ * code should be disabled.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( rpt_fcn_called ) ||
+ ( cache_ptr->resize_enabled ) ||
+ ( cache_ptr->size_increase_possible ) ||
+ ( cache_ptr->size_decrease_possible ) ||
+ ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 39.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ if ( pass ) {
+
+ auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+ auto_size_ctl.rpt_fcn = test_rpt_fcn;
+
+ auto_size_ctl.set_initial_size = TRUE;
+ auto_size_ctl.initial_size = 4 * 1024 * 1024;
+
+ auto_size_ctl.min_clean_fraction = 0.25;
+
+ auto_size_ctl.max_size = 16 * 1024 * 1024;
+ auto_size_ctl.min_size = 1 * 1024 * 1024;
+
+ auto_size_ctl.epoch_length = 1000;
+
+
+ auto_size_ctl.incr_mode = H5C_incr__threshold;
+
+ auto_size_ctl.lower_hr_threshold = 0.75;
+
+ auto_size_ctl.increment = 1.0; /* disable size increment */
+
+ auto_size_ctl.apply_max_increment = TRUE;
+ auto_size_ctl.max_increment = (2 * 1024 * 1024);
+
+
+ auto_size_ctl.decr_mode = H5C_decr__threshold;
+
+ auto_size_ctl.upper_hr_threshold = 1.0; /* disable size decrement */
+
+ auto_size_ctl.decrement = 0.5;
+
+ auto_size_ctl.apply_max_decrement = TRUE;
+ auto_size_ctl.max_decrement = (1 * 1024 * 1024);
+
+ auto_size_ctl.epochs_before_eviction = 3;
+
+ auto_size_ctl.apply_empty_reserve = TRUE;
+ auto_size_ctl.empty_reserve = 0.05;
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_set_cache_auto_resize_config failed 14.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "bad cache size after set resize re-config 13.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* force low hit rate -- should be no response as the auto-resize
+ * code should be disabled.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( rpt_fcn_called ) ||
+ ( cache_ptr->resize_enabled ) ||
+ ( cache_ptr->size_increase_possible ) ||
+ ( cache_ptr->size_decrease_possible ) ||
+ ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 40.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* force high hit rate -- should be no response as the auto-resize
+ * code should be disabled.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( rpt_fcn_called ) ||
+ ( cache_ptr->resize_enabled ) ||
+ ( cache_ptr->size_increase_possible ) ||
+ ( cache_ptr->size_decrease_possible ) ||
+ ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 41.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ if ( pass ) {
+
+ auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+ auto_size_ctl.rpt_fcn = test_rpt_fcn;
+
+ auto_size_ctl.set_initial_size = TRUE;
+ auto_size_ctl.initial_size = 4 * 1024 * 1024;
+
+ auto_size_ctl.min_clean_fraction = 0.5;
+
+ auto_size_ctl.max_size = 16 * 1024 * 1024;
+ auto_size_ctl.min_size = 1 * 1024 * 1024;
+
+ auto_size_ctl.epoch_length = 1000;
+
+
+ auto_size_ctl.incr_mode = H5C_incr__threshold;
+
+ auto_size_ctl.lower_hr_threshold = 0.0; /* disable size increment */
+
+ auto_size_ctl.increment = 2.0;
+
+ auto_size_ctl.apply_max_increment = TRUE;
+ auto_size_ctl.max_increment = (2 * 1024 * 1024);
+
+
+ auto_size_ctl.decr_mode = H5C_decr__threshold;
+
+ auto_size_ctl.upper_hr_threshold = 0.995;
+
+ auto_size_ctl.decrement = 1.0; /* disable size decrement */
+
+ auto_size_ctl.apply_max_decrement = TRUE;
+ auto_size_ctl.max_decrement = (1 * 1024 * 1024);
+
+ auto_size_ctl.epochs_before_eviction = 3;
+
+ auto_size_ctl.apply_empty_reserve = TRUE;
+ auto_size_ctl.empty_reserve = 0.05;
+
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_set_cache_auto_resize_config failed 15.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "bad cache size after set resize re-config 14.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* force low hit rate -- should be no response as the auto-resize
+ * code should be disabled.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( rpt_fcn_called ) ||
+ ( cache_ptr->resize_enabled ) ||
+ ( cache_ptr->size_increase_possible ) ||
+ ( cache_ptr->size_decrease_possible ) ||
+ ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 42.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* force high hit rate -- should be no response as the auto-resize
+ * code should be disabled.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( rpt_fcn_called ) ||
+ ( cache_ptr->resize_enabled ) ||
+ ( cache_ptr->size_increase_possible ) ||
+ ( cache_ptr->size_decrease_possible ) ||
+ ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 43.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ if ( pass ) {
+
+ auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+ auto_size_ctl.rpt_fcn = test_rpt_fcn;
+
+ auto_size_ctl.set_initial_size = TRUE;
+ auto_size_ctl.initial_size = 4 * 1024 * 1024;
+
+ auto_size_ctl.min_clean_fraction = 0.5;
+
+ auto_size_ctl.max_size = 16 * 1024 * 1024;
+ auto_size_ctl.min_size = 1 * 1024 * 1024;
+
+ auto_size_ctl.epoch_length = 1000;
+
+
+ auto_size_ctl.incr_mode = H5C_incr__off;
+
+ auto_size_ctl.lower_hr_threshold = 0.75;
+
+ auto_size_ctl.increment = 2.0;
+
+ auto_size_ctl.apply_max_increment = TRUE;
+ auto_size_ctl.max_increment = (2 * 1024 * 1024);
+
+
+ auto_size_ctl.decr_mode = H5C_decr__off;
+
+ auto_size_ctl.upper_hr_threshold = 0.995;
+
+ auto_size_ctl.decrement = 0.5;
+
+ auto_size_ctl.apply_max_decrement = TRUE;
+ auto_size_ctl.max_decrement = (1 * 1024 * 1024);
+
+ auto_size_ctl.epochs_before_eviction = 3;
+
+ auto_size_ctl.apply_empty_reserve = TRUE;
+ auto_size_ctl.empty_reserve = 0.05;
+
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_set_cache_auto_resize_config failed 16.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "bad cache size after set resize re-config 15.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* force low hit rate -- should be no response as the auto-resize
+ * code should be disabled.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( rpt_fcn_called ) ||
+ ( cache_ptr->resize_enabled ) ||
+ ( cache_ptr->size_increase_possible ) ||
+ ( cache_ptr->size_decrease_possible ) ||
+ ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 44.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* force high hit rate -- should be no response as the auto-resize
+ * code should be disabled.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( rpt_fcn_called ) ||
+ ( cache_ptr->resize_enabled ) ||
+ ( cache_ptr->size_increase_possible ) ||
+ ( cache_ptr->size_decrease_possible ) ||
+ ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 45.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ if ( pass ) {
+
+ takedown_cache(cache_ptr, FALSE, FALSE);
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ if ( pass ) { PASSED(); } else { H5_FAILED(); }
+
+ if ( ! pass )
+ HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
+ fcn_name, failure_mssg);
+
+} /* check_auto_cache_resize_disable() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: check_auto_cache_resize_epoch_markers()
+ *
+ * Purpose: Verify that the auto-resize code manages epoch markers
+ * correctly.
+ *
+ * Return: void
+ *
+ * Programmer: John Mainzer
+ * 12/16/04
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static void
+check_auto_cache_resize_epoch_markers(void)
+{
+ const char * fcn_name = "check_auto_cache_resize_epoch_markers()";
+ hbool_t show_progress = FALSE;
+ herr_t result;
+ int32_t i;
+ int32_t j;
+ int32_t checkpoint = 0;
+ H5C_t * cache_ptr = NULL;
+ H5C_auto_size_ctl_t auto_size_ctl =
+ {
+ /* int32_t version = */ H5C__CURR_AUTO_SIZE_CTL_VER,
+ /* H5C_auto_resize_report_fcn rpt_fcn = */ test_rpt_fcn,
+
+ /* hbool_t set_initial_size = */ TRUE,
+ /* size_t initial_size = */ (512 * 1024),
+
+ /* double min_clean_fraction = */ 0.5,
+
+ /* size_t max_size = */ (14 * 1024 * 1024),
+ /* size_t min_size = */ (512 * 1024),
+
+ /* int64_t epoch_length = */ 1000,
+
+
+ /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold,
+
+ /* double lower_hr_threshold = */ 0.75,
+
+ /* double increment = */ 2.0,
+
+ /* hbool_t apply_max_increment = */ TRUE,
+ /* size_t max_increment = */ (4 * 1024 * 1024),
+
+
+ /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__threshold,
+
+ /* double upper_hr_threshold = */ 0.995,
+
+ /* double decrement = */ 0.1,
+
+ /* hbool_t apply_max_decrement = */ TRUE,
+ /* size_t max_decrement = */ (1 * 1024 * 1024),
+
+ /* int32_t epochs_before_eviction = */ 3,
+
+ /* hbool_t apply_empty_reserve = */ TRUE,
+ /* double empty_reserve = */ 0.05
+ };
+
+ TESTING("automatic cache resize epoch marker management");
+
+ pass = TRUE;
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ if ( pass ) {
+
+ reset_entries();
+
+ cache_ptr = setup_cache((size_t)(2 * 1024),
+ (size_t)(1 * 1024));
+ }
+
+ if ( pass ) {
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_set_cache_auto_resize_config failed 1.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ if ( ( cache_ptr->max_cache_size != (512 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (256 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "bad cache size after initialization.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+
+ /* Now make sure that we are managing the epoch markers correctly.
+ */
+
+ if ( pass ) {
+
+ auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+ auto_size_ctl.rpt_fcn = test_rpt_fcn;
+
+ auto_size_ctl.set_initial_size = TRUE;
+ auto_size_ctl.initial_size = 8 * 1024 * 1024;
+
+ auto_size_ctl.min_clean_fraction = 0.5;
+
+ auto_size_ctl.max_size = 8 * 1024 * 1024;
+ auto_size_ctl.min_size = 512 * 1024;
+
+ auto_size_ctl.epoch_length = 1000;
+
+
+ auto_size_ctl.incr_mode = H5C_incr__off;
+
+ auto_size_ctl.lower_hr_threshold = 0.75;
+
+ auto_size_ctl.increment = 2.0;
+
+ auto_size_ctl.apply_max_increment = TRUE;
+ auto_size_ctl.max_increment = (4 * 1024 * 1024);
+
+
+ auto_size_ctl.decr_mode = H5C_decr__age_out;
+
+ auto_size_ctl.upper_hr_threshold = 0.995;
+
+ auto_size_ctl.decrement = 0.5;
+
+ auto_size_ctl.apply_max_decrement = FALSE;
+ auto_size_ctl.max_decrement = (1 * 1024 * 1024);
+
+ auto_size_ctl.epochs_before_eviction = 10;
+
+ auto_size_ctl.apply_empty_reserve = FALSE;
+ auto_size_ctl.empty_reserve = 0.05;
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_set_cache_auto_resize_config failed 2.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ if ( ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "bad cache size after set resize re-config 1.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* Since we just created the cache, there should be no epoch markers
+ * active. Verify that this is true.
+ */
+
+ if ( pass ) {
+
+ if ( cache_ptr->epoch_markers_active != 0 ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected # of epoch markers 1.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != in_spec ) ||
+ ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ||
+ ( cache_ptr->index_size != (1 * 1000 * MEDIUM_ENTRY_SIZE) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 0.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+
+ if ( pass ) {
+
+ j = 2;
+ while ( ( pass ) && ( j <= 10 ) )
+ {
+
+ rpt_fcn_called = FALSE;
+ i = (j - 2) * 1000;
+ while ( ( pass ) && ( i < (j - 1) * 1000 ) )
+ {
+ protect_entry(cache_ptr, SMALL_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, SMALL_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != in_spec ) ||
+ ( cache_ptr->epoch_markers_active != j ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected # of epoch markers 2.\n";
+ }
+
+ j++;
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* we now have a full complement of epoch markers -- see if
+ * we get the expected reduction.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 9000;
+ while ( ( pass ) && ( i < 10000 ) )
+ {
+ protect_entry(cache_ptr, SMALL_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, SMALL_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != decrease ) ||
+ ( cache_ptr->max_cache_size !=
+ (10 * 1000 * SMALL_ENTRY_SIZE + MEDIUM_ENTRY_SIZE) ) ||
+ ( cache_ptr->min_clean_size !=
+ ((10 * 1000 * SMALL_ENTRY_SIZE + MEDIUM_ENTRY_SIZE) / 2) ) ||
+ ( cache_ptr->index_size !=
+ (10 * 1000 * SMALL_ENTRY_SIZE + MEDIUM_ENTRY_SIZE) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 1.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* now reduce the epochs before eviction, and see if the cache
+ * deletes the extra markers
+ */
+ if ( pass ) {
+
+ auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+ auto_size_ctl.rpt_fcn = test_rpt_fcn;
+
+ auto_size_ctl.set_initial_size = TRUE;
+ auto_size_ctl.initial_size = 8 * 1024 * 1024;
+
+ auto_size_ctl.min_clean_fraction = 0.5;
+
+ auto_size_ctl.max_size = 8 * 1024 * 1024;
+ auto_size_ctl.min_size = 512 * 1024;
+
+ auto_size_ctl.epoch_length = 1000;
+
+
+ auto_size_ctl.incr_mode = H5C_incr__off;
+
+ auto_size_ctl.lower_hr_threshold = 0.75;
+
+ auto_size_ctl.increment = 2.0;
+
+ auto_size_ctl.apply_max_increment = TRUE;
+ auto_size_ctl.max_increment = (4 * 1024 * 1024);
+
+
+ auto_size_ctl.decr_mode = H5C_decr__age_out;
+
+ auto_size_ctl.upper_hr_threshold = 0.995;
+
+ auto_size_ctl.decrement = 0.5;
+
+ auto_size_ctl.apply_max_decrement = FALSE;
+ auto_size_ctl.max_decrement = (1 * 1024 * 1024);
+
+ auto_size_ctl.epochs_before_eviction = 1;
+
+ auto_size_ctl.apply_empty_reserve = FALSE;
+ auto_size_ctl.empty_reserve = 0.05;
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_set_cache_auto_resize_config failed 3.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ if ( ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "bad cache size after set resize re-config 2.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* There should be exactly one active epoch marker at present.
+ */
+ if ( pass ) {
+
+ if ( cache_ptr->epoch_markers_active != 1 ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected # of epoch markers 3.\n";
+ }
+ }
+
+ /* Now do an epochs worth of accesses, and verify that everything
+ * not accessed in this epoch gets evicted, and the cache size
+ * is reduced.
+ */
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 9000;
+ while ( ( pass ) && ( i < 10000 ) )
+ {
+ protect_entry(cache_ptr, SMALL_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, SMALL_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != decrease ) ||
+ ( cache_ptr->max_cache_size != (512 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (256 * 1024) ) ||
+ ( cache_ptr->index_size != (1 * 1000 * SMALL_ENTRY_SIZE) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 2.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* There should be exactly one active epoch marker at present...
+ */
+ if ( pass ) {
+
+ if ( cache_ptr->epoch_markers_active != 1 ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected # of epoch markers 4.\n";
+ }
+ }
+
+ /* shift the decrement mode to threshold, and verify that we remove
+ * all epoch markers.
+ */
+ if ( pass ) {
+
+ auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+ auto_size_ctl.rpt_fcn = test_rpt_fcn;
+
+ auto_size_ctl.set_initial_size = TRUE;
+ auto_size_ctl.initial_size = 8 * 1024 * 1024;
+
+ auto_size_ctl.min_clean_fraction = 0.5;
+
+ auto_size_ctl.max_size = 8 * 1024 * 1024;
+ auto_size_ctl.min_size = 512 * 1024;
+
+ auto_size_ctl.epoch_length = 1000;
+
+
+ auto_size_ctl.incr_mode = H5C_incr__off;
+
+ auto_size_ctl.lower_hr_threshold = 0.75;
+
+ auto_size_ctl.increment = 2.0;
+
+ auto_size_ctl.apply_max_increment = TRUE;
+ auto_size_ctl.max_increment = (4 * 1024 * 1024);
+
+
+ auto_size_ctl.decr_mode = H5C_decr__threshold;
+
+ auto_size_ctl.upper_hr_threshold = 0.995;
+
+ auto_size_ctl.decrement = 0.5;
+
+ auto_size_ctl.apply_max_decrement = FALSE;
+ auto_size_ctl.max_decrement = (1 * 1024 * 1024);
+
+ auto_size_ctl.epochs_before_eviction = 1;
+
+ auto_size_ctl.apply_empty_reserve = FALSE;
+ auto_size_ctl.empty_reserve = 0.05;
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_set_cache_auto_resize_config failed 4.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ if ( ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "bad cache size after set resize re-config 3.\n";
+ }
+ }
+
+ /* ... and now there should be none.
+ */
+ if ( pass ) {
+
+ if ( cache_ptr->epoch_markers_active != 0 ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected # of epoch markers 5.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* shift the decrement mode to age out with threshold. Set epochs
+ * before eviction to 10 again.
+ */
+ if ( pass ) {
+
+ auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+ auto_size_ctl.rpt_fcn = test_rpt_fcn;
+
+ auto_size_ctl.set_initial_size = TRUE;
+ auto_size_ctl.initial_size = 8 * 1024 * 1024;
+
+ auto_size_ctl.min_clean_fraction = 0.5;
+
+ auto_size_ctl.max_size = 8 * 1024 * 1024;
+ auto_size_ctl.min_size = 512 * 1024;
+
+ auto_size_ctl.epoch_length = 1000;
+
+
+ auto_size_ctl.incr_mode = H5C_incr__off;
+
+ auto_size_ctl.lower_hr_threshold = 0.75;
+
+ auto_size_ctl.increment = 2.0;
+
+ auto_size_ctl.apply_max_increment = TRUE;
+ auto_size_ctl.max_increment = (4 * 1024 * 1024);
+
+
+ auto_size_ctl.decr_mode = H5C_decr__age_out_with_threshold;
+
+ auto_size_ctl.upper_hr_threshold = 0.995;
+
+ auto_size_ctl.decrement = 0.5;
+
+ auto_size_ctl.apply_max_decrement = FALSE;
+ auto_size_ctl.max_decrement = (1 * 1024 * 1024);
+
+ auto_size_ctl.epochs_before_eviction = 10;
+
+ auto_size_ctl.apply_empty_reserve = FALSE;
+ auto_size_ctl.empty_reserve = 0.05;
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_set_cache_auto_resize_config failed 5.\n";
+ }
+ }
+
+ /* Verify that there are no active epoch markers.
+ */
+ if ( pass ) {
+
+ if ( cache_ptr->epoch_markers_active != 0 ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected # of epoch markers 6.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* build up a full set of epoch markers. */
+ if ( pass ) {
+
+ j = 1;
+ while ( ( pass ) && ( j <= 10 ) )
+ {
+
+ rpt_fcn_called = FALSE;
+ i = (j - 1) * 1000;
+ while ( ( pass ) && ( i < j * 1000 ) )
+ {
+ protect_entry(cache_ptr, SMALL_ENTRY_TYPE, i);
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, SMALL_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+
+ if ( ( ! rpt_fcn_called ) ||
+ ( rpt_status != in_spec ) ||
+ ( cache_ptr->epoch_markers_active != j ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected # of epoch markers 7.\n";
+ }
+
+ j++;
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* Verify that there are now 10 active epoch markers.
+ */
+ if ( pass ) {
+
+ if ( cache_ptr->epoch_markers_active != 10 ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected # of epoch markers 8.\n";
+ }
+ }
+
+ /* shift the decrement mode to off. This should cause all epoch
+ * markers to be removed.
+ */
+ if ( pass ) {
+
+ auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+ auto_size_ctl.rpt_fcn = test_rpt_fcn;
+
+ auto_size_ctl.set_initial_size = TRUE;
+ auto_size_ctl.initial_size = 8 * 1024 * 1024;
+
+ auto_size_ctl.min_clean_fraction = 0.5;
+
+ auto_size_ctl.max_size = 8 * 1024 * 1024;
+ auto_size_ctl.min_size = 512 * 1024;
+
+ auto_size_ctl.epoch_length = 1000;
+
+
+ auto_size_ctl.incr_mode = H5C_incr__off;
+
+ auto_size_ctl.lower_hr_threshold = 0.75;
+
+ auto_size_ctl.increment = 2.0;
+
+ auto_size_ctl.apply_max_increment = TRUE;
+ auto_size_ctl.max_increment = (4 * 1024 * 1024);
+
+
+ auto_size_ctl.decr_mode = H5C_decr__off;
+
+ auto_size_ctl.upper_hr_threshold = 0.995;
+
+ auto_size_ctl.decrement = 0.5;
+
+ auto_size_ctl.apply_max_decrement = FALSE;
+ auto_size_ctl.max_decrement = (1 * 1024 * 1024);
+
+ auto_size_ctl.epochs_before_eviction = 10;
+
+ auto_size_ctl.apply_empty_reserve = FALSE;
+ auto_size_ctl.empty_reserve = 0.05;
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_set_cache_auto_resize_config failed 6.\n";
+ }
+ }
+
+ /* Verify that there are now no active epoch markers.
+ */
+ if ( pass ) {
+
+ if ( cache_ptr->epoch_markers_active != 0 ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected # of epoch markers 9.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ /* verify that we still have the expected number of entries in the cache,
+ * and that the cache is of the expected size.
+ */
+ if ( pass ) {
+
+ if ( ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (4 * 1024 * 1024) )||
+ ( cache_ptr->index_size != (10 * 1000 * SMALL_ENTRY_SIZE) ) ||
+ ( cache_ptr->index_len != 10000 ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache size change results 3.\n";
+ }
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ if ( pass ) {
+
+ takedown_cache(cache_ptr, FALSE, FALSE);
+ }
+
+ if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
+
+ if ( pass ) { PASSED(); } else { H5_FAILED(); }
+
+ if ( ! pass )
+ HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
+ fcn_name, failure_mssg);
+
+} /* check_auto_cache_resize_epoch_markers() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: check_auto_cache_resize_input_errs()
+ *
+ * Purpose: Verify that H5C_set_cache_auto_resize_config() detects
+ * and rejects invalid input.
+ *
+ * Return: void
+ *
+ * Programmer: John Mainzer
+ * 10/29/04
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#define RESIZE_CONFIGS_ARE_EQUAL(a, b, compare_init) \
+( ( (a).version == (b).version ) && \
+ ( (a).rpt_fcn == (b).rpt_fcn ) && \
+ ( ( ! compare_init ) || \
+ ( (a).set_initial_size == (b).set_initial_size ) ) && \
+ ( ( ! compare_init ) || \
+ ( (a).initial_size == (b).initial_size ) ) && \
+ ( (a).min_clean_fraction == (b).min_clean_fraction ) && \
+ ( (a).max_size == (b).max_size ) && \
+ ( (a).min_size == (b).min_size ) && \
+ ( (a).epoch_length == (b).epoch_length ) && \
+ ( (a).incr_mode == (b).incr_mode ) && \
+ ( (a).lower_hr_threshold == (b).lower_hr_threshold ) && \
+ ( (a).increment == (b).increment ) && \
+ ( (a).apply_max_increment == (b).apply_max_increment ) && \
+ ( (a).max_increment == (b).max_increment ) && \
+ ( (a).decr_mode == (b).decr_mode ) && \
+ ( (a).upper_hr_threshold == (b).upper_hr_threshold ) && \
+ ( (a).decrement == (b).decrement ) && \
+ ( (a).apply_max_decrement == (b).apply_max_decrement ) && \
+ ( (a).max_decrement == (b).max_decrement ) && \
+ ( (a).epochs_before_eviction == (b).epochs_before_eviction ) && \
+ ( (a).apply_empty_reserve == (b).apply_empty_reserve ) && \
+ ( (a).empty_reserve == (b).empty_reserve ) )
+
+static void
+check_auto_cache_resize_input_errs(void)
+{
+ const char * fcn_name = "check_auto_cache_resize_input_errs()";
+ herr_t result;
+ H5C_t * cache_ptr = NULL;
+ H5C_auto_size_ctl_t ref_auto_size_ctl =
+ {
+ /* int32_t version = */ H5C__CURR_AUTO_SIZE_CTL_VER,
+ /* H5C_auto_resize_report_fcn rpt_fcn = */ test_rpt_fcn,
+
+ /* hbool_t set_initial_size = */ TRUE,
+ /* size_t initial_size = */ (512 * 1024),
+
+ /* double min_clean_fraction = */ 0.5,
+
+ /* size_t max_size = */ (16 * 1024 * 1024),
+ /* size_t min_size = */ (512 * 1024),
+
+ /* int64_t epoch_length = */ 1000,
+
+
+ /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold,
+
+ /* double lower_hr_threshold = */ 0.75,
+
+ /* double increment = */ 2.0,
+
+ /* hbool_t apply_max_increment = */ TRUE,
+ /* size_t max_increment = */ (4 * 1024 * 1024),
+
+
+ /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__threshold,
+
+ /* double upper_hr_threshold = */ 0.995,
+
+ /* double decrement = */ 0.1,
+
+ /* hbool_t apply_max_decrement = */ TRUE,
+ /* size_t max_decrement = */ (1 * 1024 * 1024),
+
+ /* int32_t epochs_before_eviction = */ 3,
+
+ /* hbool_t apply_empty_reserve = */ TRUE,
+ /* double empty_reserve = */ 0.05
+ };
+
+ H5C_auto_size_ctl_t invalid_auto_size_ctl;
+ H5C_auto_size_ctl_t test_auto_size_ctl;
+
+ TESTING("automatic cache resize input errors");
+
+ pass = TRUE;
+
+ /* allocate a cache, and set a reference automatic cache control
+ * configuration. Then feed H5C_set_cache_auto_resize_config()
+ * invalid input, and verify that the correct error is returned,
+ * and that the configuration is not modified.
+ */
+
+ if ( pass ) {
+
+ reset_entries();
+
+ cache_ptr = setup_cache((size_t)(2 * 1024),
+ (size_t)(1 * 1024));
+ }
+
+ if ( pass ) {
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr,
+ &ref_auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_set_cache_auto_resize_config failed 1.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ if ( ( cache_ptr->max_cache_size != (512 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (256 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "bad cache size after initialization.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ result = H5C_get_cache_auto_resize_config(cache_ptr,
+ &test_auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_get_cache_auto_resize_config failed 1.";
+
+ } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \
+ ref_auto_size_ctl, FALSE) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected auto resize config 1.";
+ }
+ }
+
+ if ( pass ) {
+
+ invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+ invalid_auto_size_ctl.rpt_fcn = NULL;
+
+ invalid_auto_size_ctl.set_initial_size = TRUE;
+ invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024;
+
+ invalid_auto_size_ctl.min_clean_fraction = 0.5;
+
+ invalid_auto_size_ctl.max_size = 16 * 1024 * 1024;
+ invalid_auto_size_ctl.min_size = 1 * 1024 * 1024;
+
+ invalid_auto_size_ctl.epoch_length = 5000;
+
+
+ invalid_auto_size_ctl.incr_mode = H5C_incr__threshold;
+
+ invalid_auto_size_ctl.lower_hr_threshold = 0.7;
+
+ invalid_auto_size_ctl.increment = 2.0;
+
+ invalid_auto_size_ctl.apply_max_increment = TRUE;
+ invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+
+
+ invalid_auto_size_ctl.decr_mode = H5C_decr__threshold;
+
+ invalid_auto_size_ctl.upper_hr_threshold = 0.999;
+
+ invalid_auto_size_ctl.decrement = 0.5;
+
+ invalid_auto_size_ctl.apply_max_decrement = TRUE;
+ invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024);
+
+ invalid_auto_size_ctl.epochs_before_eviction = 3;
+
+ invalid_auto_size_ctl.apply_empty_reserve = TRUE;
+ invalid_auto_size_ctl.empty_reserve = 0.05;
+
+ result = H5C_set_cache_auto_resize_config(NULL,
+ &invalid_auto_size_ctl);
+
+ if ( result != FAIL ) {
+
+ pass = FALSE;
+ failure_mssg =
+ "H5C_set_cache_auto_resize_config accepted NULL cache_ptr.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ result = H5C_get_cache_auto_resize_config(cache_ptr,
+ &test_auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_get_cache_auto_resize_config failed 2.";
+
+ } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \
+ ref_auto_size_ctl, FALSE) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected auto resize config 2.";
+ }
+ }
+
+
+ /* check bad version rejection. */
+
+ if ( pass ) {
+
+ invalid_auto_size_ctl.version = -1; /* INVALID */
+ invalid_auto_size_ctl.rpt_fcn = NULL;
+
+ invalid_auto_size_ctl.set_initial_size = TRUE;
+ invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024;
+
+ invalid_auto_size_ctl.min_clean_fraction = 0.5;
+
+ invalid_auto_size_ctl.max_size = 16 * 1024 * 1024;
+ invalid_auto_size_ctl.min_size = 1 * 1024 * 1024;
+
+ invalid_auto_size_ctl.epoch_length = 5000;
+
+
+ invalid_auto_size_ctl.incr_mode = H5C_incr__threshold;
+
+ invalid_auto_size_ctl.lower_hr_threshold = 0.7;
+
+ invalid_auto_size_ctl.increment = 2.0;
+
+ invalid_auto_size_ctl.apply_max_increment = TRUE;
+ invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+
+
+ invalid_auto_size_ctl.decr_mode = H5C_decr__threshold;
+
+ invalid_auto_size_ctl.upper_hr_threshold = 0.999;
+
+ invalid_auto_size_ctl.decrement = 0.5;
+
+ invalid_auto_size_ctl.apply_max_decrement = TRUE;
+ invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024);
+
+ invalid_auto_size_ctl.epochs_before_eviction = 3;
+
+ invalid_auto_size_ctl.apply_empty_reserve = TRUE;
+ invalid_auto_size_ctl.empty_reserve = 0.05;
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr,
+ &invalid_auto_size_ctl);
+
+ if ( result != FAIL ) {
+
+ pass = FALSE;
+ failure_mssg =
+ "H5C_set_cache_auto_resize_config accepted bad version.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ result = H5C_get_cache_auto_resize_config(cache_ptr,
+ &test_auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_get_cache_auto_resize_config failed 3.";
+
+ } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \
+ ref_auto_size_ctl, FALSE) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected auto resize config 3.";
+ }
+ }
+
+
+ /* check bad initial size rejection */
+
+ if ( pass ) {
+
+ invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+ invalid_auto_size_ctl.rpt_fcn = NULL;
+
+ invalid_auto_size_ctl.set_initial_size = TRUE;
+ invalid_auto_size_ctl.initial_size = 16 * 1024 * 1024 + 1;
+ /* INVALID */
+
+ invalid_auto_size_ctl.min_clean_fraction = 0.5;
+
+ invalid_auto_size_ctl.max_size = 16 * 1024 * 1024;
+ invalid_auto_size_ctl.min_size = 1 * 1024 * 1024;
+
+ invalid_auto_size_ctl.epoch_length = 5000;
+
+
+ invalid_auto_size_ctl.incr_mode = H5C_incr__threshold;
+
+ invalid_auto_size_ctl.lower_hr_threshold = 0.75;
+
+ invalid_auto_size_ctl.increment = 2.0;
+
+ invalid_auto_size_ctl.apply_max_increment = TRUE;
+ invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+
+
+ invalid_auto_size_ctl.decr_mode = H5C_decr__threshold;
+
+ invalid_auto_size_ctl.upper_hr_threshold = 0.999;
+
+ invalid_auto_size_ctl.decrement = 0.5;
+
+ invalid_auto_size_ctl.apply_max_decrement = TRUE;
+ invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024);
+
+ invalid_auto_size_ctl.epochs_before_eviction = 3;
+
+ invalid_auto_size_ctl.apply_empty_reserve = TRUE;
+ invalid_auto_size_ctl.empty_reserve = 0.05;
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr,
+ &invalid_auto_size_ctl);
+
+ if ( result != FAIL ) {
+
+ pass = FALSE;
+ failure_mssg =
+ "H5C_set_cache_auto_resize_config accepted bad init size 1.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ result = H5C_get_cache_auto_resize_config(cache_ptr,
+ &test_auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_get_cache_auto_resize_config failed 4.";
+
+ } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \
+ ref_auto_size_ctl, FALSE) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected auto resize config 4.";
+ }
+ }
+
+ if ( pass ) {
+
+ invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+ invalid_auto_size_ctl.rpt_fcn = NULL;
+
+ invalid_auto_size_ctl.set_initial_size = TRUE;
+ invalid_auto_size_ctl.initial_size = 1 * 1024 * 1024 - 1;
+ /* INVALID */
+
+ invalid_auto_size_ctl.min_clean_fraction = 0.5;
+
+ invalid_auto_size_ctl.max_size = 16 * 1024 * 1024;
+ invalid_auto_size_ctl.min_size = 1 * 1024 * 1024;
+
+ invalid_auto_size_ctl.epoch_length = 5000;
+
+
+ invalid_auto_size_ctl.incr_mode = H5C_incr__threshold;
+
+ invalid_auto_size_ctl.lower_hr_threshold = 0.75;
+
+ invalid_auto_size_ctl.increment = 2.0;
+
+ invalid_auto_size_ctl.apply_max_increment = TRUE;
+ invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+
+
+ invalid_auto_size_ctl.decr_mode = H5C_decr__threshold;
+
+ invalid_auto_size_ctl.upper_hr_threshold = 0.999;
+
+ invalid_auto_size_ctl.decrement = 0.5;
+
+ invalid_auto_size_ctl.apply_max_decrement = TRUE;
+ invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024);
+
+ invalid_auto_size_ctl.epochs_before_eviction = 3;
+
+ invalid_auto_size_ctl.apply_empty_reserve = TRUE;
+ invalid_auto_size_ctl.empty_reserve = 0.05;
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr,
+ &invalid_auto_size_ctl);
+
+ if ( result != FAIL ) {
+
+ pass = FALSE;
+ failure_mssg =
+ "H5C_set_cache_auto_resize_config accepted bad init size 2.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ result = H5C_get_cache_auto_resize_config(cache_ptr,
+ &test_auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_get_cache_auto_resize_config failed 5.";
+
+ } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \
+ ref_auto_size_ctl, FALSE) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected auto resize config 5.";
+ }
+ }
+
+
+ /* test for invalid min clean fraction rejection. */
+
+ if ( pass ) {
+
+ invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+ invalid_auto_size_ctl.rpt_fcn = NULL;
+
+ invalid_auto_size_ctl.set_initial_size = TRUE;
+ invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024;
+
+ invalid_auto_size_ctl.min_clean_fraction = 1.00001; /* INVALID */
+
+ invalid_auto_size_ctl.max_size = 16 * 1024 * 1024;
+ invalid_auto_size_ctl.min_size = 1 * 1024 * 1024;
+
+ invalid_auto_size_ctl.epoch_length = 5000;
+
+
+ invalid_auto_size_ctl.incr_mode = H5C_incr__threshold;
+
+ invalid_auto_size_ctl.lower_hr_threshold = 0.75;
+
+ invalid_auto_size_ctl.increment = 2.0;
+
+ invalid_auto_size_ctl.apply_max_increment = TRUE;
+ invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+
+
+ invalid_auto_size_ctl.decr_mode = H5C_decr__threshold;
+
+ invalid_auto_size_ctl.upper_hr_threshold = 0.999;
+
+ invalid_auto_size_ctl.decrement = 0.5;
+
+ invalid_auto_size_ctl.apply_max_decrement = TRUE;
+ invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024);
+
+ invalid_auto_size_ctl.epochs_before_eviction = 3;
+
+ invalid_auto_size_ctl.apply_empty_reserve = TRUE;
+ invalid_auto_size_ctl.empty_reserve = 0.05;
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr,
+ &invalid_auto_size_ctl);
+
+ if ( result != FAIL ) {
+
+ pass = FALSE;
+ failure_mssg =
+ "H5C_set_cache_auto_resize_config accepted bad min clean frac 1.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ result = H5C_get_cache_auto_resize_config(cache_ptr,
+ &test_auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_get_cache_auto_resize_config failed 6.";
+
+ } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \
+ ref_auto_size_ctl, FALSE) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected auto resize config 6.";
+ }
+ }
+
+ if ( pass ) {
+
+ invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+ invalid_auto_size_ctl.rpt_fcn = NULL;
+
+ invalid_auto_size_ctl.set_initial_size = TRUE;
+ invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024;
+
+ invalid_auto_size_ctl.min_clean_fraction = -0.00001; /* INVALID */
+
+ invalid_auto_size_ctl.max_size = 16 * 1024 * 1024;
+ invalid_auto_size_ctl.min_size = 1 * 1024 * 1024;
+
+ invalid_auto_size_ctl.epoch_length = 5000;
+
+
+ invalid_auto_size_ctl.incr_mode = H5C_incr__threshold;
+
+ invalid_auto_size_ctl.lower_hr_threshold = 0.75;
+
+ invalid_auto_size_ctl.increment = 2.0;
+
+ invalid_auto_size_ctl.apply_max_increment = TRUE;
+ invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+
+
+ invalid_auto_size_ctl.decr_mode = H5C_decr__threshold;
+
+ invalid_auto_size_ctl.upper_hr_threshold = 0.999;
+
+ invalid_auto_size_ctl.decrement = 0.5;
+
+ invalid_auto_size_ctl.apply_max_decrement = TRUE;
+ invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024);
+
+ invalid_auto_size_ctl.epochs_before_eviction = 3;
+
+ invalid_auto_size_ctl.apply_empty_reserve = TRUE;
+ invalid_auto_size_ctl.empty_reserve = 0.05;
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr,
+ &invalid_auto_size_ctl);
+
+ if ( result != FAIL ) {
+
+ pass = FALSE;
+ failure_mssg =
+ "H5C_set_cache_auto_resize_config accepted bad min clean frac 2.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ result = H5C_get_cache_auto_resize_config(cache_ptr,
+ &test_auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_get_cache_auto_resize_config failed 7.";
+
+ } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \
+ ref_auto_size_ctl, FALSE) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected auto resize config 7.";
+ }
+ }
+
+
+ /* test for invalid max_size and/or min_size rejection */
+
+ if ( pass ) {
+
+ invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+ invalid_auto_size_ctl.rpt_fcn = NULL;
+
+ invalid_auto_size_ctl.set_initial_size = TRUE;
+ invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024;
+
+ invalid_auto_size_ctl.min_clean_fraction = 0.5;
+
+ invalid_auto_size_ctl.max_size = H5C__MAX_MAX_CACHE_SIZE + 1;
+ /* INVALID */
+ invalid_auto_size_ctl.min_size = 1 * 1024 * 1024;
+
+ invalid_auto_size_ctl.epoch_length = 5000;
+
+
+ invalid_auto_size_ctl.incr_mode = H5C_incr__threshold;
+
+ invalid_auto_size_ctl.lower_hr_threshold = 0.75;
+
+ invalid_auto_size_ctl.increment = 2.0;
+
+ invalid_auto_size_ctl.apply_max_increment = TRUE;
+ invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+
+
+ invalid_auto_size_ctl.decr_mode = H5C_decr__threshold;
+
+ invalid_auto_size_ctl.upper_hr_threshold = 0.999;
+
+ invalid_auto_size_ctl.decrement = 0.5;
+
+ invalid_auto_size_ctl.apply_max_decrement = TRUE;
+ invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024);
+
+ invalid_auto_size_ctl.epochs_before_eviction = 3;
+
+ invalid_auto_size_ctl.apply_empty_reserve = TRUE;
+ invalid_auto_size_ctl.empty_reserve = 0.05;
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr,
+ &invalid_auto_size_ctl);
+
+ if ( result != FAIL ) {
+
+ pass = FALSE;
+ failure_mssg =
+ "H5C_set_cache_auto_resize_config accepted bad max_size.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ result = H5C_get_cache_auto_resize_config(cache_ptr,
+ &test_auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_get_cache_auto_resize_config failed 8.";
+
+ } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \
+ ref_auto_size_ctl, FALSE) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected auto resize config 8.";
+ }
+ }
+
+ if ( pass ) {
+
+ invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+ invalid_auto_size_ctl.rpt_fcn = NULL;
+
+ invalid_auto_size_ctl.set_initial_size = TRUE;
+ invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024;
+
+ invalid_auto_size_ctl.min_clean_fraction = 0.5;
+
+ invalid_auto_size_ctl.max_size = 1 * 1024 * 1024;/* INVALID */
+ invalid_auto_size_ctl.min_size = 1 * 1024 * 1024 + 1;/*PAIR */
+
+ invalid_auto_size_ctl.epoch_length = 5000;
+
+
+ invalid_auto_size_ctl.incr_mode = H5C_incr__threshold;
+
+ invalid_auto_size_ctl.lower_hr_threshold = 0.75;
+
+ invalid_auto_size_ctl.increment = 2.0;
+
+ invalid_auto_size_ctl.apply_max_increment = TRUE;
+ invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+
+
+ invalid_auto_size_ctl.decr_mode = H5C_decr__threshold;
+
+ invalid_auto_size_ctl.upper_hr_threshold = 0.999;
+
+ invalid_auto_size_ctl.decrement = 0.5;
+
+ invalid_auto_size_ctl.apply_max_decrement = TRUE;
+ invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024);
+
+ invalid_auto_size_ctl.epochs_before_eviction = 3;
+
+ invalid_auto_size_ctl.apply_empty_reserve = TRUE;
+ invalid_auto_size_ctl.empty_reserve = 0.05;
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr,
+ &invalid_auto_size_ctl);
+
+ if ( result != FAIL ) {
+
+ pass = FALSE;
+ failure_mssg =
+ "H5C_set_cache_auto_resize_config accepted bad size pair.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ result = H5C_get_cache_auto_resize_config(cache_ptr,
+ &test_auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_get_cache_auto_resize_config failed 9.";
+
+ } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \
+ ref_auto_size_ctl, FALSE) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected auto resize config 9.";
+ }
+ }
+
+ if ( pass ) {
+
+ invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+ invalid_auto_size_ctl.rpt_fcn = NULL;
+
+ invalid_auto_size_ctl.set_initial_size = TRUE;
+ invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024;
+
+ invalid_auto_size_ctl.min_clean_fraction = 0.5;
+
+ invalid_auto_size_ctl.max_size = 16 * 1024 * 1024;
+ invalid_auto_size_ctl.min_size = H5C__MIN_MAX_CACHE_SIZE - 1;
+ /* INVALID */
+ invalid_auto_size_ctl.epoch_length = 5000;
+
+
+ invalid_auto_size_ctl.incr_mode = H5C_incr__threshold;
+
+ invalid_auto_size_ctl.lower_hr_threshold = 0.75;
+
+ invalid_auto_size_ctl.increment = 2.0;
+
+ invalid_auto_size_ctl.apply_max_increment = TRUE;
+ invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+
+
+ invalid_auto_size_ctl.decr_mode = H5C_decr__threshold;
+
+ invalid_auto_size_ctl.upper_hr_threshold = 0.999;
+
+ invalid_auto_size_ctl.decrement = 0.5;
+
+ invalid_auto_size_ctl.apply_max_decrement = TRUE;
+ invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024);
+
+ invalid_auto_size_ctl.epochs_before_eviction = 3;
+
+ invalid_auto_size_ctl.apply_empty_reserve = TRUE;
+ invalid_auto_size_ctl.empty_reserve = 0.05;
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr,
+ &invalid_auto_size_ctl);
+
+ if ( result != FAIL ) {
+
+ pass = FALSE;
+ failure_mssg =
+ "H5C_set_cache_auto_resize_config accepted bad min_size.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ result = H5C_get_cache_auto_resize_config(cache_ptr,
+ &test_auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_get_cache_auto_resize_config failed 10.";
+
+ } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \
+ ref_auto_size_ctl, FALSE) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected auto resize config 10.";
+ }
+ }
+
+
+ /* test for invalid epoch_length rejection */
+
+ if ( pass ) {
+
+ invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+ invalid_auto_size_ctl.rpt_fcn = NULL;
+
+ invalid_auto_size_ctl.set_initial_size = TRUE;
+ invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024;
+
+ invalid_auto_size_ctl.min_clean_fraction = 0.1;
+
+ invalid_auto_size_ctl.max_size = 16 * 1024 * 1024;
+ invalid_auto_size_ctl.min_size = 1 * 1024 * 1024;
+
+ invalid_auto_size_ctl.epoch_length = H5C__MAX_AR_EPOCH_LENGTH + 1;
+ /* INVALID */
+
+ invalid_auto_size_ctl.incr_mode = H5C_incr__threshold;
+
+ invalid_auto_size_ctl.lower_hr_threshold = 0.75;
+
+ invalid_auto_size_ctl.increment = 2.0;
+
+ invalid_auto_size_ctl.apply_max_increment = TRUE;
+ invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+
+
+ invalid_auto_size_ctl.decr_mode = H5C_decr__threshold;
+
+ invalid_auto_size_ctl.upper_hr_threshold = 0.999;
+
+ invalid_auto_size_ctl.decrement = 0.9;
+
+ invalid_auto_size_ctl.apply_max_decrement = TRUE;
+ invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024);
+
+ invalid_auto_size_ctl.epochs_before_eviction = 3;
+
+ invalid_auto_size_ctl.apply_empty_reserve = TRUE;
+ invalid_auto_size_ctl.empty_reserve = 0.05;
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr,
+ &invalid_auto_size_ctl);
+
+ if ( result != FAIL ) {
+
+ pass = FALSE;
+ failure_mssg =
+ "H5C_set_cache_auto_resize_config accepted bad epoch len 1.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ result = H5C_get_cache_auto_resize_config(cache_ptr,
+ &test_auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_get_cache_auto_resize_config failed 11.";
+
+ } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \
+ ref_auto_size_ctl, FALSE) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected auto resize config 11.";
+ }
+ }
+
+ if ( pass ) {
+
+ invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+ invalid_auto_size_ctl.rpt_fcn = NULL;
+
+ invalid_auto_size_ctl.set_initial_size = TRUE;
+ invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024;
+
+ invalid_auto_size_ctl.min_clean_fraction = 0.1;
+
+ invalid_auto_size_ctl.max_size = 16 * 1024 * 1024;
+ invalid_auto_size_ctl.min_size = 1 * 1024 * 1024;
+
+ invalid_auto_size_ctl.epoch_length = H5C__MIN_AR_EPOCH_LENGTH - 1;
+ /* INVALID */
+
+ invalid_auto_size_ctl.incr_mode = H5C_incr__threshold;
+
+ invalid_auto_size_ctl.lower_hr_threshold = 0.75;
+
+ invalid_auto_size_ctl.increment = 2.0;
+
+ invalid_auto_size_ctl.apply_max_increment = TRUE;
+ invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+
+
+ invalid_auto_size_ctl.decr_mode = H5C_decr__threshold;
+
+ invalid_auto_size_ctl.upper_hr_threshold = 0.999;
+
+ invalid_auto_size_ctl.decrement = 0.9;
+
+ invalid_auto_size_ctl.apply_max_decrement = TRUE;
+ invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024);
+
+ invalid_auto_size_ctl.epochs_before_eviction = 3;
+
+ invalid_auto_size_ctl.apply_empty_reserve = TRUE;
+ invalid_auto_size_ctl.empty_reserve = 0.05;
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr,
+ &invalid_auto_size_ctl);
+
+ if ( result != FAIL ) {
+
+ pass = FALSE;
+ failure_mssg =
+ "H5C_set_cache_auto_resize_config accepted bad epoch len 2.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ result = H5C_get_cache_auto_resize_config(cache_ptr,
+ &test_auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_get_cache_auto_resize_config failed 12.";
+
+ } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \
+ ref_auto_size_ctl, FALSE) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected auto resize config 12.";
+ }
+ }
+
+
+ /* test for bad incr_mode rejection */
+
+ if ( pass ) {
+
+ invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+ invalid_auto_size_ctl.rpt_fcn = NULL;
+
+ invalid_auto_size_ctl.set_initial_size = TRUE;
+ invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024;
+
+ invalid_auto_size_ctl.min_clean_fraction = 0.1;
+
+ invalid_auto_size_ctl.max_size = 16 * 1024 * 1024;
+ invalid_auto_size_ctl.min_size = 1 * 1024 * 1024;
+
+ invalid_auto_size_ctl.epoch_length = 5000;
+
+
+ invalid_auto_size_ctl.incr_mode =
+ (enum H5C_cache_incr_mode) -1; /* INVALID */
+
+ invalid_auto_size_ctl.lower_hr_threshold = 0.75;
+
+ invalid_auto_size_ctl.increment = 2.0;
+
+ invalid_auto_size_ctl.apply_max_increment = TRUE;
+ invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+
+
+ invalid_auto_size_ctl.decr_mode = H5C_decr__threshold;
+
+ invalid_auto_size_ctl.upper_hr_threshold = 0.999;
+
+ invalid_auto_size_ctl.decrement = 0.9;
+
+ invalid_auto_size_ctl.apply_max_decrement = TRUE;
+ invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024);
+
+ invalid_auto_size_ctl.epochs_before_eviction = 3;
+
+ invalid_auto_size_ctl.apply_empty_reserve = TRUE;
+ invalid_auto_size_ctl.empty_reserve = 0.05;
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr,
+ &invalid_auto_size_ctl);
+
+ if ( result != FAIL ) {
+
+ pass = FALSE;
+ failure_mssg =
+ "H5C_set_cache_auto_resize_config accepted bad incr_mode 1.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ result = H5C_get_cache_auto_resize_config(cache_ptr,
+ &test_auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_get_cache_auto_resize_config failed 13.";
+
+ } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \
+ ref_auto_size_ctl, FALSE) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected auto resize config 13.";
+ }
+ }
+
+ if ( pass ) {
+
+ invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+ invalid_auto_size_ctl.rpt_fcn = NULL;
+
+ invalid_auto_size_ctl.set_initial_size = TRUE;
+ invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024;
+
+ invalid_auto_size_ctl.min_clean_fraction = 0.1;
+
+ invalid_auto_size_ctl.max_size = 16 * 1024 * 1024;
+ invalid_auto_size_ctl.min_size = 1 * 1024 * 1024;
+
+ invalid_auto_size_ctl.epoch_length = 5000;
+
+
+ invalid_auto_size_ctl.incr_mode =
+ (enum H5C_cache_incr_mode) 2; /* INVALID */
+
+ invalid_auto_size_ctl.lower_hr_threshold = 0.75;
+
+ invalid_auto_size_ctl.increment = 2.0;
+
+ invalid_auto_size_ctl.apply_max_increment = TRUE;
+ invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+
+
+ invalid_auto_size_ctl.decr_mode = H5C_decr__threshold;
+
+ invalid_auto_size_ctl.upper_hr_threshold = 0.999;
+
+ invalid_auto_size_ctl.decrement = 0.9;
+
+ invalid_auto_size_ctl.apply_max_decrement = TRUE;
+ invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024);
+
+ invalid_auto_size_ctl.epochs_before_eviction = 3;
+
+ invalid_auto_size_ctl.apply_empty_reserve = TRUE;
+ invalid_auto_size_ctl.empty_reserve = 0.05;
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr,
+ &invalid_auto_size_ctl);
+
+ if ( result != FAIL ) {
+
+ pass = FALSE;
+ failure_mssg =
+ "H5C_set_cache_auto_resize_config accepted bad incr_mode 2.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ result = H5C_get_cache_auto_resize_config(cache_ptr,
+ &test_auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_get_cache_auto_resize_config failed 14.";
+
+ } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \
+ ref_auto_size_ctl, FALSE) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected auto resize config 14.";
+ }
+ }
+
+
+ /* check for bad upper and/or lower threshold rejection */
+
+ if ( pass ) {
+
+ invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+ invalid_auto_size_ctl.rpt_fcn = NULL;
+
+ invalid_auto_size_ctl.set_initial_size = TRUE;
+ invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024;
+
+ invalid_auto_size_ctl.min_clean_fraction = 0.5;
+
+ invalid_auto_size_ctl.max_size = 16 * 1024 * 1024;
+ invalid_auto_size_ctl.min_size = 1 * 1024 * 1024;
+
+ invalid_auto_size_ctl.epoch_length = 5000;
+
+
+ invalid_auto_size_ctl.incr_mode = H5C_incr__threshold;
+
+ invalid_auto_size_ctl.lower_hr_threshold = 0.7;
+
+ invalid_auto_size_ctl.increment = 2.0;
+
+ invalid_auto_size_ctl.apply_max_increment = TRUE;
+ invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+
+
+ invalid_auto_size_ctl.decr_mode = H5C_decr__threshold;
+
+ invalid_auto_size_ctl.upper_hr_threshold = 1.01; /* INVALID */
+
+ invalid_auto_size_ctl.decrement = 0.5;
+
+ invalid_auto_size_ctl.apply_max_decrement = TRUE;
+ invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024);
+
+ invalid_auto_size_ctl.epochs_before_eviction = 3;
+
+ invalid_auto_size_ctl.apply_empty_reserve = TRUE;
+ invalid_auto_size_ctl.empty_reserve = 0.05;
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr,
+ &invalid_auto_size_ctl);
+
+ if ( result != FAIL ) {
+
+ pass = FALSE;
+ failure_mssg =
+ "H5C_set_cache_auto_resize_config accepted bad upper threshold.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ result = H5C_get_cache_auto_resize_config(cache_ptr,
+ &test_auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_get_cache_auto_resize_config failed 15.";
+
+ } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \
+ ref_auto_size_ctl, FALSE) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected auto resize config 15.";
+ }
+ }
+
+ if ( pass ) {
+
+ invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+ invalid_auto_size_ctl.rpt_fcn = NULL;
+
+ invalid_auto_size_ctl.set_initial_size = TRUE;
+ invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024;
+
+ invalid_auto_size_ctl.min_clean_fraction = 0.5;
+
+ invalid_auto_size_ctl.max_size = 16 * 1024 * 1024;
+ invalid_auto_size_ctl.min_size = 1 * 1024 * 1024;
+
+ invalid_auto_size_ctl.epoch_length = 5000;
+
+
+ invalid_auto_size_ctl.incr_mode = H5C_incr__threshold;
+
+ invalid_auto_size_ctl.lower_hr_threshold = 0.8; /* INVALID */
+
+ invalid_auto_size_ctl.increment = 2.0;
+
+ invalid_auto_size_ctl.apply_max_increment = TRUE;
+ invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+
+
+ invalid_auto_size_ctl.decr_mode = H5C_decr__threshold;
+
+ invalid_auto_size_ctl.upper_hr_threshold = 0.7; /* INVALID */
+
+ invalid_auto_size_ctl.decrement = 0.5;
+
+ invalid_auto_size_ctl.apply_max_decrement = TRUE;
+ invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024);
+
+ invalid_auto_size_ctl.epochs_before_eviction = 3;
+
+ invalid_auto_size_ctl.apply_empty_reserve = TRUE;
+ invalid_auto_size_ctl.empty_reserve = 0.05;
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr,
+ &invalid_auto_size_ctl);
+
+ if ( result != FAIL ) {
+
+ pass = FALSE;
+ failure_mssg =
+ "H5C_set_cache_auto_resize_config accepted bad threshold pair.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ result = H5C_get_cache_auto_resize_config(cache_ptr,
+ &test_auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_get_cache_auto_resize_config failed 16.";
+
+ } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \
+ ref_auto_size_ctl, FALSE) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected auto resize config 16.";
+ }
+ }
+
+ if ( pass ) {
+
+ invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+ invalid_auto_size_ctl.rpt_fcn = NULL;
+
+ invalid_auto_size_ctl.set_initial_size = TRUE;
+ invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024;
+
+ invalid_auto_size_ctl.min_clean_fraction = 0.5;
+
+ invalid_auto_size_ctl.max_size = 16 * 1024 * 1024;
+ invalid_auto_size_ctl.min_size = 1 * 1024 * 1024;
+
+ invalid_auto_size_ctl.epoch_length = 5000;
+
+
+ invalid_auto_size_ctl.incr_mode = H5C_incr__threshold;
+
+ invalid_auto_size_ctl.lower_hr_threshold = -0.0001; /* INVALID */
+
+ invalid_auto_size_ctl.increment = 2.0;
+
+ invalid_auto_size_ctl.apply_max_increment = TRUE;
+ invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+
+
+ invalid_auto_size_ctl.decr_mode = H5C_decr__threshold;
+
+ invalid_auto_size_ctl.upper_hr_threshold = 0.999;
+
+ invalid_auto_size_ctl.decrement = 0.5;
+
+ invalid_auto_size_ctl.apply_max_decrement = TRUE;
+ invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024);
+
+ invalid_auto_size_ctl.epochs_before_eviction = 3;
+
+ invalid_auto_size_ctl.apply_empty_reserve = TRUE;
+ invalid_auto_size_ctl.empty_reserve = 0.05;
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr,
+ &invalid_auto_size_ctl);
+
+ if ( result != FAIL ) {
+
+ pass = FALSE;
+ failure_mssg =
+ "H5C_set_cache_auto_resize_config accepted bad lower threshold.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ result = H5C_get_cache_auto_resize_config(cache_ptr,
+ &test_auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_get_cache_auto_resize_config failed 17.";
+
+ } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \
+ ref_auto_size_ctl, FALSE) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected auto resize config 17.";
+ }
+ }
+
+
+ /* test for bad increment rejection */
+
+ if ( pass ) {
+
+ invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+ invalid_auto_size_ctl.rpt_fcn = NULL;
+
+ invalid_auto_size_ctl.set_initial_size = TRUE;
+ invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024;
+
+ invalid_auto_size_ctl.min_clean_fraction = 0.1;
+
+ invalid_auto_size_ctl.max_size = 16 * 1024 * 1024;
+ invalid_auto_size_ctl.min_size = 1 * 1024 * 1024;
+
+ invalid_auto_size_ctl.epoch_length = 5000;
+
+
+ invalid_auto_size_ctl.incr_mode = H5C_incr__threshold;
+
+ invalid_auto_size_ctl.lower_hr_threshold = 0.75;
+
+ invalid_auto_size_ctl.increment = 0.99999; /* INVALID */
+
+ invalid_auto_size_ctl.apply_max_increment = TRUE;
+ invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+
+
+ invalid_auto_size_ctl.decr_mode = H5C_decr__threshold;
+
+ invalid_auto_size_ctl.upper_hr_threshold = 0.999;
+
+ invalid_auto_size_ctl.decrement = 0.5;
+
+ invalid_auto_size_ctl.apply_max_decrement = TRUE;
+ invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024);
+
+ invalid_auto_size_ctl.epochs_before_eviction = 3;
+
+ invalid_auto_size_ctl.apply_empty_reserve = TRUE;
+ invalid_auto_size_ctl.empty_reserve = 0.05;
+
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr,
+ &invalid_auto_size_ctl);
+
+ if ( result != FAIL ) {
+
+ pass = FALSE;
+ failure_mssg =
+ "H5C_set_cache_auto_resize_config accepted bad increment.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ result = H5C_get_cache_auto_resize_config(cache_ptr,
+ &test_auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_get_cache_auto_resize_config failed 18.";
+
+ } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \
+ ref_auto_size_ctl, FALSE) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected auto resize config 18.";
+ }
+ }
+
+
+ /* test for bad decr_mode rejection */
+
+ if ( pass ) {
+
+ invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+ invalid_auto_size_ctl.rpt_fcn = NULL;
+
+ invalid_auto_size_ctl.set_initial_size = TRUE;
+ invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024;
+
+ invalid_auto_size_ctl.min_clean_fraction = 0.1;
+
+ invalid_auto_size_ctl.max_size = 16 * 1024 * 1024;
+ invalid_auto_size_ctl.min_size = 1 * 1024 * 1024;
+
+ invalid_auto_size_ctl.epoch_length = 5000;
+
+
+ invalid_auto_size_ctl.incr_mode = H5C_incr__threshold;
+
+ invalid_auto_size_ctl.lower_hr_threshold = 0.75;
+
+ invalid_auto_size_ctl.increment = 2.0;
+
+ invalid_auto_size_ctl.apply_max_increment = TRUE;
+ invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+
+
+ invalid_auto_size_ctl.decr_mode =
+ (enum H5C_cache_decr_mode) -1; /* INVALID */
+
+ invalid_auto_size_ctl.upper_hr_threshold = 0.999;
+
+ invalid_auto_size_ctl.decrement = 0.9;
+
+ invalid_auto_size_ctl.apply_max_decrement = TRUE;
+ invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024);
+
+ invalid_auto_size_ctl.epochs_before_eviction = 3;
+
+ invalid_auto_size_ctl.apply_empty_reserve = TRUE;
+ invalid_auto_size_ctl.empty_reserve = 0.05;
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr,
+ &invalid_auto_size_ctl);
+
+ if ( result != FAIL ) {
+
+ pass = FALSE;
+ failure_mssg =
+ "H5C_set_cache_auto_resize_config accepted bad decr_mode 1.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ result = H5C_get_cache_auto_resize_config(cache_ptr,
+ &test_auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_get_cache_auto_resize_config failed 19.";
+
+ } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \
+ ref_auto_size_ctl, FALSE) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected auto resize config 19.";
+ }
+ }
+
+ if ( pass ) {
+
+ invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+ invalid_auto_size_ctl.rpt_fcn = NULL;
+
+ invalid_auto_size_ctl.set_initial_size = TRUE;
+ invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024;
+
+ invalid_auto_size_ctl.min_clean_fraction = 0.1;
+
+ invalid_auto_size_ctl.max_size = 16 * 1024 * 1024;
+ invalid_auto_size_ctl.min_size = 1 * 1024 * 1024;
+
+ invalid_auto_size_ctl.epoch_length = 5000;
+
+
+ invalid_auto_size_ctl.incr_mode = H5C_incr__threshold;
+
+ invalid_auto_size_ctl.lower_hr_threshold = 0.75;
+
+ invalid_auto_size_ctl.increment = 2.0;
+
+ invalid_auto_size_ctl.apply_max_increment = TRUE;
+ invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+
+
+ invalid_auto_size_ctl.decr_mode =
+ (enum H5C_cache_incr_mode) 4; /* INVALID */
+
+ invalid_auto_size_ctl.upper_hr_threshold = 0.999;
+
+ invalid_auto_size_ctl.decrement = 0.9;
+
+ invalid_auto_size_ctl.apply_max_decrement = TRUE;
+ invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024);
+
+ invalid_auto_size_ctl.epochs_before_eviction = 3;
+
+ invalid_auto_size_ctl.apply_empty_reserve = TRUE;
+ invalid_auto_size_ctl.empty_reserve = 0.05;
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr,
+ &invalid_auto_size_ctl);
+
+ if ( result != FAIL ) {
+
+ pass = FALSE;
+ failure_mssg =
+ "H5C_set_cache_auto_resize_config accepted bad decr_mode 2.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ result = H5C_get_cache_auto_resize_config(cache_ptr,
+ &test_auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_get_cache_auto_resize_config failed 20.";
+
+ } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \
+ ref_auto_size_ctl, FALSE) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected auto resize config 20.";
+ }
+ }
+
+
+ /* check for bad decrement rejection */
+
+ if ( pass ) {
+
+ invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+ invalid_auto_size_ctl.rpt_fcn = NULL;
+
+ invalid_auto_size_ctl.set_initial_size = TRUE;
+ invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024;
+
+ invalid_auto_size_ctl.min_clean_fraction = 0.1;
+
+ invalid_auto_size_ctl.max_size = 16 * 1024 * 1024;
+ invalid_auto_size_ctl.min_size = 1 * 1024 * 1024;
+
+ invalid_auto_size_ctl.epoch_length = 5000;
+
+
+ invalid_auto_size_ctl.incr_mode = H5C_incr__threshold;
+
+ invalid_auto_size_ctl.lower_hr_threshold = 0.75;
+
+ invalid_auto_size_ctl.increment = 2.0;
+
+ invalid_auto_size_ctl.apply_max_increment = TRUE;
+ invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+
+
+ invalid_auto_size_ctl.decr_mode = H5C_decr__threshold;
+
+ invalid_auto_size_ctl.upper_hr_threshold = 0.999;
+
+ invalid_auto_size_ctl.decrement = 1.000001; /* INVALID */
+
+ invalid_auto_size_ctl.apply_max_decrement = TRUE;
+ invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024);
+
+ invalid_auto_size_ctl.epochs_before_eviction = 3;
+
+ invalid_auto_size_ctl.apply_empty_reserve = TRUE;
+ invalid_auto_size_ctl.empty_reserve = 0.05;
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr,
+ &invalid_auto_size_ctl);
+
+ if ( result != FAIL ) {
+
+ pass = FALSE;
+ failure_mssg =
+ "H5C_set_cache_auto_resize_config accepted bad decrement 1.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ result = H5C_get_cache_auto_resize_config(cache_ptr,
+ &test_auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_get_cache_auto_resize_config failed 21.";
+
+ } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \
+ ref_auto_size_ctl, FALSE) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected auto resize config 21.";
+ }
+ }
+
+ if ( pass ) {
+
+ invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+ invalid_auto_size_ctl.rpt_fcn = NULL;
+
+ invalid_auto_size_ctl.set_initial_size = TRUE;
+ invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024;
+
+ invalid_auto_size_ctl.min_clean_fraction = 0.1;
+
+ invalid_auto_size_ctl.max_size = 16 * 1024 * 1024;
+ invalid_auto_size_ctl.min_size = 1 * 1024 * 1024;
+
+ invalid_auto_size_ctl.epoch_length = 5000;
+
+
+ invalid_auto_size_ctl.incr_mode = H5C_incr__threshold;
+
+ invalid_auto_size_ctl.lower_hr_threshold = 0.75;
+
+ invalid_auto_size_ctl.increment = 2.0;
+
+ invalid_auto_size_ctl.apply_max_increment = TRUE;
+ invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+
+
+ invalid_auto_size_ctl.decr_mode = H5C_decr__threshold;
+
+ invalid_auto_size_ctl.upper_hr_threshold = 0.999;
+
+ invalid_auto_size_ctl.decrement = -0.000001; /* INVALID */
+
+ invalid_auto_size_ctl.apply_max_decrement = TRUE;
+ invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024);
+
+ invalid_auto_size_ctl.epochs_before_eviction = 3;
+
+ invalid_auto_size_ctl.apply_empty_reserve = TRUE;
+ invalid_auto_size_ctl.empty_reserve = 0.05;
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr,
+ &invalid_auto_size_ctl);
+
+ if ( result != FAIL ) {
+
+ pass = FALSE;
+ failure_mssg =
+ "H5C_set_cache_auto_resize_config accepted bad decrement 2.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ result = H5C_get_cache_auto_resize_config(cache_ptr,
+ &test_auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_get_cache_auto_resize_config failed 22.";
+
+ } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \
+ ref_auto_size_ctl, FALSE) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected auto resize config 22.";
+ }
+ }
+
+
+ /* check for rejection of bad epochs_before_eviction */
+
+ if ( pass ) {
+
+ invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+ invalid_auto_size_ctl.rpt_fcn = NULL;
+
+ invalid_auto_size_ctl.set_initial_size = TRUE;
+ invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024;
+
+ invalid_auto_size_ctl.min_clean_fraction = 0.1;
+
+ invalid_auto_size_ctl.max_size = 16 * 1024 * 1024;
+ invalid_auto_size_ctl.min_size = 1 * 1024 * 1024;
+
+ invalid_auto_size_ctl.epoch_length = 5000;
+
+
+ invalid_auto_size_ctl.incr_mode = H5C_incr__threshold;
+
+ invalid_auto_size_ctl.lower_hr_threshold = 0.75;
+
+ invalid_auto_size_ctl.increment = 2.0;
+
+ invalid_auto_size_ctl.apply_max_increment = TRUE;
+ invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+
+
+ invalid_auto_size_ctl.decr_mode = H5C_decr__age_out;
+
+ invalid_auto_size_ctl.upper_hr_threshold = 0.999;
+
+ invalid_auto_size_ctl.decrement = 0.9;
+
+ invalid_auto_size_ctl.apply_max_decrement = TRUE;
+ invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024);
+
+ invalid_auto_size_ctl.epochs_before_eviction = 0; /* INVALID */
+
+ invalid_auto_size_ctl.apply_empty_reserve = TRUE;
+ invalid_auto_size_ctl.empty_reserve = 0.05;
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr,
+ &invalid_auto_size_ctl);
+
+ if ( result != FAIL ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_set_cache_auto_resize_config accepted bad epochs_before_eviction 1.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ result = H5C_get_cache_auto_resize_config(cache_ptr,
+ &test_auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_get_cache_auto_resize_config failed 23.";
+
+ } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \
+ ref_auto_size_ctl, FALSE) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected auto resize config 23.";
+ }
+ }
+
+ if ( pass ) {
+
+ invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+ invalid_auto_size_ctl.rpt_fcn = NULL;
+
+ invalid_auto_size_ctl.set_initial_size = TRUE;
+ invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024;
+
+ invalid_auto_size_ctl.min_clean_fraction = 0.1;
+
+ invalid_auto_size_ctl.max_size = 16 * 1024 * 1024;
+ invalid_auto_size_ctl.min_size = 1 * 1024 * 1024;
+
+ invalid_auto_size_ctl.epoch_length = 5000;
+
+
+ invalid_auto_size_ctl.incr_mode = H5C_incr__threshold;
+
+ invalid_auto_size_ctl.lower_hr_threshold = 0.75;
+
+ invalid_auto_size_ctl.increment = 2.0;
+
+ invalid_auto_size_ctl.apply_max_increment = TRUE;
+ invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+
+
+ invalid_auto_size_ctl.decr_mode = H5C_decr__age_out_with_threshold;
+
+ invalid_auto_size_ctl.upper_hr_threshold = 0.999;
+
+ invalid_auto_size_ctl.decrement = 0.9;
+
+ invalid_auto_size_ctl.apply_max_decrement = TRUE;
+ invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024);
+
+ invalid_auto_size_ctl.epochs_before_eviction =
+ H5C__MAX_EPOCH_MARKERS + 1; /* INVALID */
+
+ invalid_auto_size_ctl.apply_empty_reserve = TRUE;
+ invalid_auto_size_ctl.empty_reserve = 0.05;
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr,
+ &invalid_auto_size_ctl);
+
+ if ( result != FAIL ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_set_cache_auto_resize_config accepted bad epochs_before_eviction 2.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ result = H5C_get_cache_auto_resize_config(cache_ptr,
+ &test_auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_get_cache_auto_resize_config failed 24.";
+
+ } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \
+ ref_auto_size_ctl, FALSE) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected auto resize config 24.";
+ }
+ }
+
+
+ /* Check for bad apply_empty_reserve rejection */
+
+ if ( pass ) {
+
+ invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+ invalid_auto_size_ctl.rpt_fcn = NULL;
+
+ invalid_auto_size_ctl.set_initial_size = TRUE;
+ invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024;
+
+ invalid_auto_size_ctl.min_clean_fraction = 0.1;
+
+ invalid_auto_size_ctl.max_size = 16 * 1024 * 1024;
+ invalid_auto_size_ctl.min_size = 1 * 1024 * 1024;
+
+ invalid_auto_size_ctl.epoch_length = 5000;
+
+
+ invalid_auto_size_ctl.incr_mode = H5C_incr__threshold;
+
+ invalid_auto_size_ctl.lower_hr_threshold = 0.75;
+
+ invalid_auto_size_ctl.increment = 2.0;
+
+ invalid_auto_size_ctl.apply_max_increment = TRUE;
+ invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+
+
+ invalid_auto_size_ctl.decr_mode = H5C_decr__age_out;
+
+ invalid_auto_size_ctl.upper_hr_threshold = 0.999;
+
+ invalid_auto_size_ctl.decrement = 0.9;
+
+ invalid_auto_size_ctl.apply_max_decrement = TRUE;
+ invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024);
+
+ invalid_auto_size_ctl.epochs_before_eviction = 3;
+
+ invalid_auto_size_ctl.apply_empty_reserve = TRUE;
+ invalid_auto_size_ctl.empty_reserve = -0.0000001; /* INVALID */
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr,
+ &invalid_auto_size_ctl);
+
+ if ( result != FAIL ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_set_cache_auto_resize_config accepted bad empty_reserve 1.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ result = H5C_get_cache_auto_resize_config(cache_ptr,
+ &test_auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_get_cache_auto_resize_config failed 25.";
+
+ } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \
+ ref_auto_size_ctl, FALSE) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected auto resize config 25.";
+ }
+ }
+
+ if ( pass ) {
+
+ invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+ invalid_auto_size_ctl.rpt_fcn = NULL;
+
+ invalid_auto_size_ctl.set_initial_size = TRUE;
+ invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024;
+
+ invalid_auto_size_ctl.min_clean_fraction = 0.1;
+
+ invalid_auto_size_ctl.max_size = 16 * 1024 * 1024;
+ invalid_auto_size_ctl.min_size = 1 * 1024 * 1024;
+
+ invalid_auto_size_ctl.epoch_length = 5000;
+
+
+ invalid_auto_size_ctl.incr_mode = H5C_incr__threshold;
+
+ invalid_auto_size_ctl.lower_hr_threshold = 0.75;
+
+ invalid_auto_size_ctl.increment = 2.0;
+
+ invalid_auto_size_ctl.apply_max_increment = TRUE;
+ invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024);
+
+
+ invalid_auto_size_ctl.decr_mode = H5C_decr__age_out_with_threshold;
+
+ invalid_auto_size_ctl.upper_hr_threshold = 0.999;
+
+ invalid_auto_size_ctl.decrement = 0.9;
+
+ invalid_auto_size_ctl.apply_max_decrement = TRUE;
+ invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024);
+
+ invalid_auto_size_ctl.epochs_before_eviction =
+ H5C__MAX_EPOCH_MARKERS + 1; /* INVALID */
+
+ invalid_auto_size_ctl.apply_empty_reserve = TRUE;
+ invalid_auto_size_ctl.empty_reserve = 0.05;
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr,
+ &invalid_auto_size_ctl);
+
+ if ( result != FAIL ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_set_cache_auto_resize_config accepted bad empty_reserve 2.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ result = H5C_get_cache_auto_resize_config(cache_ptr,
+ &test_auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_get_cache_auto_resize_config failed 26.";
+
+ } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \
+ ref_auto_size_ctl, FALSE) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected auto resize config 26.";
+ }
+ }
+
+
+ /* finally, before we finish, try feeding
+ * H5C_get_cache_auto_resize_config invalid data.
+ */
+
+ if ( pass ) {
+
+ result = H5C_get_cache_auto_resize_config(NULL, &test_auto_size_ctl);
+
+ if ( result != FAIL ) {
+
+ pass = FALSE;
+ failure_mssg =
+ "H5C_get_cache_auto_resize_config accepted NULL cache_ptr.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ result = H5C_get_cache_auto_resize_config((H5C_t *)&test_auto_size_ctl,
+ &test_auto_size_ctl);
+
+ if ( result != FAIL ) {
+
+ pass = FALSE;
+ failure_mssg =
+ "H5C_get_cache_auto_resize_config accepted bad cache_ptr.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ result = H5C_get_cache_auto_resize_config(cache_ptr, NULL);
+
+ if ( result != FAIL ) {
+
+ pass = FALSE;
+ failure_mssg =
+ "H5C_get_cache_auto_resize_config accepted NULL config ptr.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ takedown_cache(cache_ptr, FALSE, FALSE);
+ }
+
+ if ( pass ) { PASSED(); } else { H5_FAILED(); }
+
+ if ( ! pass )
+ HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
+ fcn_name, failure_mssg);
+
+} /* check_auto_cache_resize_input_errs() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: check_auto_cache_resize_aux_fcns()
+ *
+ * Purpose: Verify that the auxilary functions associated with
+ * the automatic cache resize capability are operating
+ * correctly. These functions are:
+ *
+ * H5C_get_cache_size()
+ * H5C_get_cache_hit_rate()
+ * H5C_reset_cache_hit_rate_stats()
+ *
+ * Return: void
+ *
+ * Programmer: John Mainzer
+ * 11/4/04
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static void
+check_auto_cache_resize_aux_fcns(void)
+{
+ const char * fcn_name = "check_auto_cache_resize_aux_fcns()";
+ herr_t result;
+ int32_t i;
+ H5C_t * cache_ptr = NULL;
+ double hit_rate;
+ size_t max_size;
+ size_t min_clean_size;
+ size_t cur_size;
+ int32_t cur_num_entries;
+ H5C_auto_size_ctl_t auto_size_ctl =
+ {
+ /* int32_t version = */ H5C__CURR_AUTO_SIZE_CTL_VER,
+#if 0
+ /* H5C_auto_resize_report_fcn rpt_fcn = */ NULL,
+#else
+ /* H5C_auto_resize_report_fcn rpt_fcn = */ H5C_def_auto_resize_rpt_fcn,
+#endif
+ /* hbool_t set_initial_size = */ TRUE,
+ /* size_t initial_size = */ (1 * 1024 * 1024),
+
+ /* double min_clean_fraction = */ 0.5,
+
+ /* size_t max_size = */ (16 * 1024 * 1025),
+ /* size_t min_size = */ (512 * 1024),
+
+ /* int64_t epoch_length = */ 50000,
+
+
+ /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__off,
+
+ /* double lower_hr_threshold = */ 0.75,
+
+ /* double increment = */ 2.0,
+
+ /* hbool_t apply_max_increment = */ TRUE,
+ /* size_t max_increment = */ (4 * 1024 * 1024),
+
+
+ /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__off,
+
+ /* double upper_hr_threshold = */ 0.995,
+
+ /* double decrement = */ 0.9,
+
+ /* hbool_t apply_max_decrement = */ TRUE,
+ /* size_t max_decrement = */ (1 * 1024 * 1024),
+
+ /* int32_t epochs_before_eviction = */ 3,
+
+ /* hbool_t apply_empty_reserve = */ TRUE,
+ /* double empty_reserve = */ 0.5
+ };
+
+
+ TESTING("automatic cache resize auxilary functions");
+
+ pass = TRUE;
+
+ /* allocate a cache, and then test the various auxilary functions.
+ */
+
+ if ( pass ) {
+
+ reset_entries();
+
+ cache_ptr = setup_cache((size_t)(2 * 1024),
+ (size_t)(1 * 1024));
+ }
+
+ if ( pass ) {
+
+ result = H5C_set_cache_auto_resize_config(cache_ptr,
+ &auto_size_ctl);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_set_cache_auto_resize_config failed 1.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ if ( ( cache_ptr->max_cache_size != (1 * 1024 * 1024) ) ||
+ ( cache_ptr->min_clean_size != (512 * 1024) ) ) {
+
+ pass = FALSE;
+ failure_mssg = "bad cache size after initialization.\n";
+ }
+ }
+
+ /* lets start with the H5C_get_cache_hit_rate(),
+ * H5C_reset_cache_hit_rate_stats() pair.
+ */
+
+ if ( pass ) {
+
+ if ( ( H5C_get_cache_hit_rate(NULL, &hit_rate) != FAIL ) ||
+ ( H5C_get_cache_hit_rate(cache_ptr, NULL) != FAIL ) ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_get_cache_hit_rate accepts bad params.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ result = H5C_get_cache_hit_rate(cache_ptr, &hit_rate);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_get_cache_hit_rate failed.\n";
+
+ } else if ( hit_rate != 0.0 ) {
+
+ pass = FALSE;
+ failure_mssg =
+ "H5C_get_cache_hit_rate returned unexpected hit rate 1.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, PICO_ENTRY_TYPE, i);
+
+ if ( pass ) {
+
+ unprotect_entry(cache_ptr, PICO_ENTRY_TYPE, i,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+ }
+
+ if ( pass ) {
+
+ result = H5C_get_cache_hit_rate(cache_ptr, &hit_rate);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_get_cache_hit_rate failed.\n";
+
+ } else if ( hit_rate != 0.0 ) {
+
+ pass = FALSE;
+ failure_mssg =
+ "H5C_get_cache_hit_rate returned unexpected hit rate 2.\n";
+
+ } else if ( ( cache_ptr->cache_accesses != 1000 ) ||
+ ( cache_ptr->cache_hits != 0 ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache hit rate stats.\n";
+
+ } else if ( rpt_fcn_called ) {
+
+ pass = FALSE;
+ failure_mssg = "Report function called?.\n";
+
+ }
+ }
+
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, PICO_ENTRY_TYPE, 0);
+
+ if ( pass ) {
+
+ unprotect_entry(cache_ptr, PICO_ENTRY_TYPE, 0,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+ }
+
+ if ( pass ) {
+
+ result = H5C_get_cache_hit_rate(cache_ptr, &hit_rate);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_get_cache_hit_rate failed.\n";
+
+ } else if ( hit_rate != 0.5 ) {
+
+ pass = FALSE;
+ failure_mssg =
+ "H5C_get_cache_hit_rate returned unexpected hit rate 3.\n";
+
+ } else if ( ( cache_ptr->cache_accesses != 2000 ) ||
+ ( cache_ptr->cache_hits != 1000 ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache hit rate stats.\n";
+
+ } else if ( rpt_fcn_called ) {
+
+ pass = FALSE;
+ failure_mssg = "Report function called?.\n";
+
+ }
+ }
+
+ if ( pass ) {
+
+ result = H5C_reset_cache_hit_rate_stats(NULL);
+
+ if ( result != FAIL ) {
+
+ pass = FALSE;
+ failure_mssg =
+ "H5C_reset_cache_hit_rate_stats accepted NULL cache_ptr.\n";
+
+ } else if ( ( cache_ptr->cache_accesses != 2000 ) ||
+ ( cache_ptr->cache_hits != 1000 ) ) {
+
+ pass = FALSE;
+ failure_mssg =
+ "Failed call to H5C_reset_cache_hit_rate_stats altered stats?\n";
+ }
+ }
+
+ if ( pass ) {
+
+ result = H5C_reset_cache_hit_rate_stats(cache_ptr);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_reset_cache_hit_rate_stats failed.\n";
+
+ } else if ( ( cache_ptr->cache_accesses != 0 ) ||
+ ( cache_ptr->cache_hits != 0 ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache hit rate stats.\n";
+
+ }
+ }
+
+ if ( pass ) {
+
+ rpt_fcn_called = FALSE;
+ i = 0;
+ while ( ( pass ) && ( i < 1000 ) )
+ {
+ protect_entry(cache_ptr, PICO_ENTRY_TYPE, i + 500);
+
+ if ( pass ) {
+
+ unprotect_entry(cache_ptr, PICO_ENTRY_TYPE, i + 500,
+ NO_CHANGE, FALSE);
+ }
+ i++;
+ }
+ }
+
+
+ if ( pass ) {
+
+ result = H5C_get_cache_hit_rate(cache_ptr, &hit_rate);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_get_cache_hit_rate failed.\n";
+
+ } else if ( hit_rate != 0.5 ) {
+
+ pass = FALSE;
+ failure_mssg =
+ "H5C_get_cache_hit_rate returned unexpected hit rate 4.\n";
+
+ } else if ( ( cache_ptr->cache_accesses != 1000 ) ||
+ ( cache_ptr->cache_hits != 500 ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Unexpected cache hit rate stats.\n";
+
+ } else if ( rpt_fcn_called ) {
+
+ pass = FALSE;
+ failure_mssg = "Report function called?.\n";
+
+ }
+ }
+
+ /***************************************************
+ * So much for testing H5C_get_cache_hit_rate() and
+ * H5C_reset_cache_hit_rate_stats(). Now on to
+ * H5C_get_cache_size().
+ ***************************************************/
+
+ if ( pass ) {
+
+ result = H5C_get_cache_size(NULL, &max_size, &min_clean_size,
+ &cur_size, &cur_num_entries);
+
+ if ( result != FAIL ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_get_cache_size accepted NULL cache_ptr.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ max_size = 0;
+ min_clean_size = 0;
+ cur_size = 0;
+ cur_num_entries = 0;
+
+ result = H5C_get_cache_size(cache_ptr, &max_size, &min_clean_size,
+ &cur_size, &cur_num_entries);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_get_cache_size failed 1.\n";
+
+ } else if ( max_size != (1 * 1024 * 1024) ) {
+
+ pass = FALSE;
+ failure_mssg =
+ "H5C_get_cache_size reports unexpected max_size 1.\n";
+
+ } else if ( min_clean_size != (512 * 1024) ) {
+
+ pass = FALSE;
+ failure_mssg =
+ "H5C_get_cache_size reports unexpected min_clean_size 1.\n";
+
+ } else if ( cur_size != (1500 * PICO_ENTRY_SIZE) ) {
+
+ pass = FALSE;
+ failure_mssg =
+ "H5C_get_cache_size reports unexpected cur_size 1.\n";
+
+ } else if ( cur_num_entries != 1500 ) {
+
+ pass = FALSE;
+ failure_mssg =
+ "H5C_get_cache_size reports unexpected cur_num_entries 1.\n";
+ }
+ }
+
+ /* read a larger entry so that cur_size and cur_num_entries will be
+ * different.
+ */
+ if ( pass ) {
+
+ protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0);
+ }
+
+ if ( pass ) {
+ unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, NO_CHANGE, FALSE);
+ }
+
+ if ( pass ) {
+
+ max_size = 0;
+ min_clean_size = 0;
+ cur_size = 0;
+ cur_num_entries = 0;
+
+ result = H5C_get_cache_size(cache_ptr, &max_size, &min_clean_size,
+ &cur_size, &cur_num_entries);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_get_cache_size failed 2.\n";
+
+ } else if ( max_size != (1 * 1024 * 1024) ) {
+
+ pass = FALSE;
+ failure_mssg =
+ "H5C_get_cache_size reports unexpected max_size 2.\n";
+
+ } else if ( min_clean_size != (512 * 1024) ) {
+
+ pass = FALSE;
+ failure_mssg =
+ "H5C_get_cache_size reports unexpected min_clean_size 2.\n";
+
+ } else if ( cur_size !=
+ ((1500 * PICO_ENTRY_SIZE) + MONSTER_ENTRY_SIZE) ) {
+
+ pass = FALSE;
+ failure_mssg =
+ "H5C_get_cache_size reports unexpected cur_size 2.\n";
+
+ } else if ( cur_num_entries != 1501 ) {
+
+ pass = FALSE;
+ failure_mssg =
+ "H5C_get_cache_size reports unexpected cur_num_entries 2.\n";
+ }
+ }
+
+ if ( pass ) {
+
+ max_size = 0;
+ min_clean_size = 0;
+ cur_size = 0;
+ cur_num_entries = 0;
+
+ result = H5C_get_cache_size(cache_ptr, &max_size, NULL, NULL, NULL);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_get_cache_size failed 3.\n";
+
+ } else if ( max_size != (1 * 1024 * 1024) ) {
+
+ pass = FALSE;
+ failure_mssg =
+ "H5C_get_cache_size reports unexpected max_size 3.\n";
+
+ } else if ( ( min_clean_size != 0 ) ||
+ ( cur_size != 0 ) ||
+ ( cur_num_entries != 0 ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Phantom returns from H5C_get_cache_size?\n";
+
+ }
+ }
+
+ if ( pass ) {
+
+ max_size = 0;
+ min_clean_size = 0;
+ cur_size = 0;
+ cur_num_entries = 0;
+
+ result = H5C_get_cache_size(cache_ptr, NULL, &min_clean_size,
+ NULL, NULL);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_get_cache_size failed 4.\n";
+
+ } else if ( min_clean_size != (512 * 1024) ) {
+
+ pass = FALSE;
+ failure_mssg =
+ "H5C_get_cache_size reports unexpected min_clean_size 4.\n";
+
+ } else if ( ( max_size != 0 ) ||
+ ( cur_size != 0 ) ||
+ ( cur_num_entries != 0 ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Phantom returns from H5C_get_cache_size?\n";
+
+ }
+ }
+
+ if ( pass ) {
+
+ max_size = 0;
+ min_clean_size = 0;
+ cur_size = 0;
+ cur_num_entries = 0;
+
+ result = H5C_get_cache_size(cache_ptr, NULL, NULL, &cur_size, NULL);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_get_cache_size failed 5.\n";
+
+ } else if ( cur_size !=
+ ((1500 * PICO_ENTRY_SIZE) + MONSTER_ENTRY_SIZE) ) {
+
+ pass = FALSE;
+ failure_mssg =
+ "H5C_get_cache_size reports unexpected cur_size 5.\n";
+
+ } else if ( ( max_size != 0 ) ||
+ ( min_clean_size != 0 ) ||
+ ( cur_num_entries != 0 ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Phantom returns from H5C_get_cache_size?\n";
+
+ }
+ }
+
+ if ( pass ) {
+
+ max_size = 0;
+ min_clean_size = 0;
+ cur_size = 0;
+ cur_num_entries = 0;
+
+ result = H5C_get_cache_size(cache_ptr, NULL, NULL, NULL,
+ &cur_num_entries);
+
+ if ( result != SUCCEED ) {
+
+ pass = FALSE;
+ failure_mssg = "H5C_get_cache_size failed 6.\n";
+
+ } else if ( cur_num_entries != 1501 ) {
+
+ pass = FALSE;
+ failure_mssg =
+ "H5C_get_cache_size reports unexpected cur_num_entries 2.\n";
+
+ } else if ( ( max_size != 0 ) ||
+ ( min_clean_size != 0 ) ||
+ ( cur_size != 0 ) ) {
+
+ pass = FALSE;
+ failure_mssg = "Phantom returns from H5C_get_cache_size?\n";
+
+ }
+ }
+
+ if ( pass ) {
+
+ takedown_cache(cache_ptr, FALSE, FALSE);
+ }
+
+ if ( pass ) { PASSED(); } else { H5_FAILED(); }
+
+ if ( ! pass )
+ HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
+ fcn_name, failure_mssg);
+
+} /* check_auto_cache_resize_aux_fcns() */
+
+
+/*-------------------------------------------------------------------------
* Function: main
*
* Purpose: Run tests on the cache code contained in H5C.c
@@ -4142,11 +14315,16 @@ int
main(void)
{
H5open();
-
+#if 1
smoke_check_1();
smoke_check_2();
smoke_check_3();
smoke_check_4();
+ smoke_check_5();
+ smoke_check_6();
+ smoke_check_7();
+ smoke_check_8();
+#endif
write_permitted_check();
check_flush_protected_err();
check_destroy_protected_err();
@@ -4154,6 +14332,11 @@ main(void)
check_rename_err();
check_double_protect_err();
check_double_unprotect_err();
+ check_auto_cache_resize();
+ check_auto_cache_resize_disable();
+ check_auto_cache_resize_epoch_markers();
+ check_auto_cache_resize_input_errs();
+ check_auto_cache_resize_aux_fcns();
return(0);