diff options
author | Quincey Koziol <koziol@hdfgroup.org> | 2000-08-04 13:34:05 (GMT) |
---|---|---|
committer | Quincey Koziol <koziol@hdfgroup.org> | 2000-08-04 13:34:05 (GMT) |
commit | 47515ad49c7abc974f0757fd38004cf955e8e00b (patch) | |
tree | eecdf135d88de87e3d8e36506dff184dcc3f66c9 | |
parent | 20be89402848d5730066f0780d1c2038a4968c38 (diff) | |
download | hdf5-47515ad49c7abc974f0757fd38004cf955e8e00b.zip hdf5-47515ad49c7abc974f0757fd38004cf955e8e00b.tar.gz hdf5-47515ad49c7abc974f0757fd38004cf955e8e00b.tar.bz2 |
[svn-r2459] Added public API function (H5set_free_list_limits) to allow limits to be
placed on how much memory is used by the free lists before they are garbage
collected. The default is to have no limit, with garbage collection only
occurring when they cannot allocate memory.
-rw-r--r-- | src/H5.c | 44 | ||||
-rw-r--r-- | src/H5FL.c | 79 | ||||
-rw-r--r-- | src/H5FLprivate.h | 2 | ||||
-rw-r--r-- | src/H5public.h | 3 |
4 files changed, 116 insertions, 12 deletions
@@ -310,6 +310,50 @@ H5garbage_collect(void) /*------------------------------------------------------------------------- + * Function: H5set_free_list_limits + * + * Purpose: Sets limits on the different kinds of free lists. Setting a value + * of -1 for a limit means no limit of that type. These limits are global + * for the entire library. Each "global" limit only applies to free lists + * of that type, so if an application sets a limit of 1 MB on each of the + * global lists, up to 3 MB of total storage might be allocated (1MB on + * each of regular, array and block type lists). + * + * Parameters: + * int reg_global_lim; IN: The limit on all "regular" free list memory used + * int reg_list_lim; IN: The limit on memory used in each "regular" free list + * int arr_global_lim; IN: The limit on all "array" free list memory used + * int arr_list_lim; IN: The limit on memory used in each "array" free list + * int blk_global_lim; IN: The limit on all "block" free list memory used + * int blk_list_lim; IN: The limit on memory used in each "block" free list + * + * Return: Success: non-negative + * + * Failure: negative + * + * Programmer: Quincey Koziol + * Wednesday, August 2, 2000 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +herr_t +H5set_free_list_limits(int reg_global_lim, int reg_list_lim, int arr_global_lim, + int arr_list_lim, int blk_global_lim, int blk_list_lim) +{ + herr_t ret_value = SUCCEED; + + FUNC_ENTER(H5set_free_list_limits, FAIL); + + /* Call the free list function to actually set the limits */ + H5FL_set_free_list_limits(reg_global_lim, reg_list_lim, arr_global_lim, arr_list_lim, blk_global_lim, blk_list_lim); + + FUNC_LEAVE(ret_value); +} /* end H5set_free_list_limits() */ + + +/*------------------------------------------------------------------------- * Function: H5_debug_mask * * Purpose: Set runtime debugging flags according to the string S. The @@ -34,12 +34,12 @@ static intn interface_initialize_g = 0; Default limits on how much memory can accumulate on each free list before it is garbage collected. */ -#define H5FL_REG_GLB_MEM_LIM (10*1024*1024) /* Default to 10MB total on all regular free lists */ -#define H5FL_REG_LST_MEM_LIM (512*1024) /* Default to 512KB on each regular free list */ -#define H5FL_ARR_GLB_MEM_LIM (10*1024*1024) /* Default to 10MB total on all array free lists */ -#define H5FL_ARR_LST_MEM_LIM (2*1024*1024) /* Default to 2MB on each array free list */ -#define H5FL_BLK_GLB_MEM_LIM (10*1024*1024) /* Default to 10MB total on all block free lists */ -#define H5FL_BLK_LST_MEM_LIM (2*1024*1024) /* Default to 2MB on each block free list */ +static size_t H5FL_reg_glb_mem_lim=UINT_MAX; /* Default to no limit on all regular free lists */ +static size_t H5FL_reg_lst_mem_lim=UINT_MAX; /* Default to no limit on each regular free list */ +static size_t H5FL_arr_glb_mem_lim=UINT_MAX; /* Default to no limit on all array free lists */ +static size_t H5FL_arr_lst_mem_lim=UINT_MAX; /* Default to no limit on each array free list */ +static size_t H5FL_blk_glb_mem_lim=UINT_MAX; /* Default to no limit on all block free lists */ +static size_t H5FL_blk_lst_mem_lim=UINT_MAX; /* Default to no limit on each block free list */ /* A garbage collection node for regular free lists */ typedef struct H5FL_reg_gc_node_t { @@ -245,11 +245,11 @@ H5FL_reg_free(H5FL_reg_head_t *head, void *obj) /* Check for exceeding free list memory use limits */ /* First check this particular list */ - if(head->list_mem>H5FL_REG_LST_MEM_LIM) + if(head->list_mem>H5FL_reg_lst_mem_lim) H5FL_reg_gc_list(head); /* Then check the global amount memory on regular free lists */ - if(H5FL_reg_gc_head.mem_freed>H5FL_REG_GLB_MEM_LIM) + if(H5FL_reg_gc_head.mem_freed>H5FL_reg_glb_mem_lim) H5FL_reg_gc(); #endif /* NO_REG_FREE_LISTS */ @@ -812,7 +812,7 @@ H5FL_blk_free(H5FL_blk_head_t *head, void *block) /* Check for exceeding free list memory use limits */ /* First check this particular list */ - if(head->list_mem>H5FL_BLK_LST_MEM_LIM) { + if(head->list_mem>H5FL_blk_lst_mem_lim) { #ifdef QAK printf("%s: temp->size=%u, head->name=%s, head->list_mem=%u, H5FL_blk_gc_head.mem_freed=%u, garbage collecting list\n",FUNC,(unsigned)temp->size,head->name,(unsigned)head->list_mem,(unsigned)H5FL_blk_gc_head.mem_freed); #endif /* QAK */ @@ -820,7 +820,7 @@ printf("%s: temp->size=%u, head->name=%s, head->list_mem=%u, H5FL_blk_gc_head.me } /* end if */ /* Then check the global amount memory on block free lists */ - if(H5FL_blk_gc_head.mem_freed>H5FL_BLK_GLB_MEM_LIM) { + if(H5FL_blk_gc_head.mem_freed>H5FL_blk_glb_mem_lim) { #ifdef QAK printf("%s: head->name=%s, garbage collecting all block lists\n",FUNC,head->name); #endif /* QAK */ @@ -1180,11 +1180,11 @@ H5FL_arr_free(H5FL_arr_head_t *head, void *obj) /* Check for exceeding free list memory use limits */ /* First check this particular list */ - if(head->list_mem>H5FL_ARR_LST_MEM_LIM) + if(head->list_mem>H5FL_arr_lst_mem_lim) H5FL_arr_gc_list(head); /* Then check the global amount memory on array free lists */ - if(H5FL_arr_gc_head.mem_freed>H5FL_ARR_GLB_MEM_LIM) + if(H5FL_arr_gc_head.mem_freed>H5FL_arr_glb_mem_lim) H5FL_arr_gc(); } /* end if */ @@ -1598,6 +1598,61 @@ H5FL_garbage_coll(void) } /* end H5FL_garbage_coll() */ +/*------------------------------------------------------------------------- + * Function: H5FL_set_free_list_limits + * + * Purpose: Sets limits on the different kinds of free lists. Setting a value + * of -1 for a limit means no limit of that type. These limits are global + * for the entire library. Each "global" limit only applies to free lists + * of that type, so if an application sets a limit of 1 MB on each of the + * global lists, up to 3 MB of total storage might be allocated (1MB on + * each of regular, array and block type lists). + * + * Parameters: + * int reg_global_lim; IN: The limit on all "regular" free list memory used + * int reg_list_lim; IN: The limit on memory used in each "regular" free list + * int arr_global_lim; IN: The limit on all "array" free list memory used + * int arr_list_lim; IN: The limit on memory used in each "array" free list + * int blk_global_lim; IN: The limit on all "block" free list memory used + * int blk_list_lim; IN: The limit on memory used in each "block" free list + * + * Return: Success: non-negative + * + * Failure: negative + * + * Programmer: Quincey Koziol + * Wednesday, August 2, 2000 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +herr_t +H5FL_set_free_list_limits(int reg_global_lim, int reg_list_lim, int arr_global_lim, + int arr_list_lim, int blk_global_lim, int blk_list_lim) +{ + herr_t ret_value = SUCCEED; + + FUNC_ENTER(H5FL_set_free_list_limits, FAIL); + + /* Set the limit variables */ + /* limit on all regular free lists */ + H5FL_reg_glb_mem_lim=(reg_global_lim==-1 ? UINT_MAX : (size_t)reg_global_lim); + /* limit on each regular free list */ + H5FL_reg_lst_mem_lim=(reg_list_lim==-1 ? UINT_MAX : (size_t)reg_list_lim); + /* limit on all array free lists */ + H5FL_arr_glb_mem_lim=(arr_global_lim==-1 ? UINT_MAX : (size_t)arr_global_lim); + /* limit on each array free list */ + H5FL_arr_lst_mem_lim=(arr_list_lim==-1 ? UINT_MAX : (size_t)arr_list_lim); + /* limit on all block free lists */ + H5FL_blk_glb_mem_lim=(blk_global_lim==-1 ? UINT_MAX : (size_t)blk_global_lim); + /* limit on each block free list */ + H5FL_blk_lst_mem_lim=(blk_list_lim==-1 ? UINT_MAX : (size_t)blk_list_lim); + + FUNC_LEAVE(ret_value); +} /* end H5FL_set_free_list_limits() */ + + /*-------------------------------------------------------------------------- NAME H5FL_term_interface diff --git a/src/H5FLprivate.h b/src/H5FLprivate.h index d3de019..a98b05a 100644 --- a/src/H5FLprivate.h +++ b/src/H5FLprivate.h @@ -180,6 +180,8 @@ __DLL__ void * H5FL_arr_alloc(H5FL_arr_head_t *head, uintn elem, uintn clear); __DLL__ void * H5FL_arr_free(H5FL_arr_head_t *head, void *obj); __DLL__ void * H5FL_arr_realloc(H5FL_arr_head_t *head, void *obj, uintn new_elem); __DLL__ herr_t H5FL_garbage_coll(void); +__DLL__ herr_t H5FL_set_free_list_limits(int reg_global_lim, int reg_list_lim, + int arr_global_lim, int arr_list_lim, int blk_global_lim, int blk_list_lim); __DLL__ intn H5FL_term_interface(void); #endif diff --git a/src/H5public.h b/src/H5public.h index d09fe6e..01ffc63 100644 --- a/src/H5public.h +++ b/src/H5public.h @@ -145,6 +145,9 @@ __DLL__ herr_t H5open(void); __DLL__ herr_t H5close(void); __DLL__ herr_t H5dont_atexit(void); __DLL__ herr_t H5garbage_collect(void); +__DLL__ herr_t H5set_free_list_limits (int reg_global_lim, int reg_list_lim, + int arr_global_lim, int arr_list_lim, int blk_global_lim, + int blk_list_lim); __DLL__ herr_t H5get_libversion(unsigned *majnum, unsigned *minnum, unsigned *relnum); __DLL__ herr_t H5check_version(unsigned majnum, unsigned minnum, |