diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/CMakeLists.txt | 27 | ||||
-rw-r--r-- | src/H5AC.c | 5 | ||||
-rw-r--r-- | src/H5ACpublic.h | 7 | ||||
-rw-r--r-- | src/H5C.c | 3 | ||||
-rw-r--r-- | src/H5CSprivate.h | 4 | ||||
-rw-r--r-- | src/H5CXprivate.h | 5 | ||||
-rw-r--r-- | src/H5Cpublic.h | 7 | ||||
-rw-r--r-- | src/H5EAprivate.h | 5 | ||||
-rw-r--r-- | src/H5FAprivate.h | 5 | ||||
-rw-r--r-- | src/H5FDvfd_swmr.c | 58 | ||||
-rw-r--r-- | src/H5FLprivate.h | 18 | ||||
-rw-r--r-- | src/H5Fvfd_swmr.c | 6 | ||||
-rw-r--r-- | src/H5HP.c | 904 | ||||
-rw-r--r-- | src/H5HPprivate.h | 68 | ||||
-rw-r--r-- | src/H5MP.c | 443 | ||||
-rw-r--r-- | src/H5MPmodule.h | 32 | ||||
-rw-r--r-- | src/H5MPpkg.h | 99 | ||||
-rw-r--r-- | src/H5MPprivate.h | 57 | ||||
-rw-r--r-- | src/H5MPtest.c | 213 | ||||
-rw-r--r-- | src/H5PBprivate.h | 4 | ||||
-rw-r--r-- | src/H5Spublic.h | 16 | ||||
-rw-r--r-- | src/H5TSprivate.h | 6 | ||||
-rw-r--r-- | src/H5module.h | 6 | ||||
-rw-r--r-- | src/H5private.h | 6 | ||||
-rw-r--r-- | src/Makefile.am | 3 |
25 files changed, 73 insertions, 1934 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 4ebc8bc..538655b 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -380,14 +380,6 @@ set (H5HL_HDRS IDE_GENERATED_PROPERTIES ("H5HL" "${H5HL_HDRS}" "${H5HL_SOURCES}" ) -set (H5HP_SOURCES - ${HDF5_SRC_DIR}/H5HP.c -) -set (H5HP_HDRS -) -IDE_GENERATED_PROPERTIES ("H5HP" "${H5HP_HDRS}" "${H5HP_SOURCES}" ) - - set (H5I_SOURCES ${HDF5_SRC_DIR}/H5I.c ${HDF5_SRC_DIR}/H5Idbg.c @@ -444,15 +436,6 @@ set (H5MM_HDRS IDE_GENERATED_PROPERTIES ("H5MM" "${H5MM_HDRS}" "${H5MM_SOURCES}" ) -set (H5MP_SOURCES - ${HDF5_SRC_DIR}/H5MP.c - ${HDF5_SRC_DIR}/H5MPtest.c -) - -set (H5MP_HDRS -) -IDE_GENERATED_PROPERTIES ("H5MP" "${H5MP_HDRS}" "${H5MP_SOURCES}" ) - set (H5MV_SOURCES ${HDF5_SRC_DIR}/H5MV.c ${HDF5_SRC_DIR}/H5MVsection.c @@ -461,6 +444,7 @@ set (H5MV_HDRS ) IDE_GENERATED_PROPERTIES ("H5MV" "${H5MV_HDRS}" "${H5MV_SOURCES}" ) + set (H5O_SOURCES ${HDF5_SRC_DIR}/H5O.c ${HDF5_SRC_DIR}/H5Oainfo.c @@ -759,7 +743,6 @@ set (H5_MODULE_HEADERS ${HDF5_SRC_DIR}/H5Lmodule.h ${HDF5_SRC_DIR}/H5Mmodule.h ${HDF5_SRC_DIR}/H5MFmodule.h - ${HDF5_SRC_DIR}/H5MPmodule.h ${HDF5_SRC_DIR}/H5Omodule.h ${HDF5_SRC_DIR}/H5Pmodule.h ${HDF5_SRC_DIR}/H5PBmodule.h @@ -797,13 +780,11 @@ set (common_SRCS ${H5HF_SOURCES} ${H5HG_SOURCES} ${H5HL_SOURCES} - ${H5HP_SOURCES} ${H5I_SOURCES} ${H5L_SOURCES} ${H5M_SOURCES} ${H5MF_SOURCES} ${H5MM_SOURCES} - ${H5MP_SOURCES} ${H5MV_SOURCES} ${H5O_SOURCES} ${H5P_SOURCES} @@ -847,7 +828,6 @@ set (H5_PUBLIC_HEADERS ${H5M_HDRS} ${H5MF_HDRS} ${H5MM_HDRS} - ${H5MP_HDRS} ${H5MV_HDRS} ${H5O_HDRS} ${H5P_HDRS} @@ -931,8 +911,6 @@ set (H5_PRIVATE_HEADERS ${HDF5_SRC_DIR}/H5HLpkg.h ${HDF5_SRC_DIR}/H5HLprivate.h - ${HDF5_SRC_DIR}/H5HPprivate.h - ${HDF5_SRC_DIR}/H5Ipkg.h ${HDF5_SRC_DIR}/H5Iprivate.h @@ -947,9 +925,6 @@ set (H5_PRIVATE_HEADERS ${HDF5_SRC_DIR}/H5MMprivate.h - ${HDF5_SRC_DIR}/H5MPpkg.h - ${HDF5_SRC_DIR}/H5MPprivate.h - ${HDF5_SRC_DIR}/H5MVpkg.h ${HDF5_SRC_DIR}/H5MVprivate.h @@ -2508,7 +2508,7 @@ H5AC_expunge_all_tagged_metadata(H5F_t *f, haddr_t tag, int type_id, unsigned fl HDassert(f); HDassert(f->shared); - /* Call cache level function to expunge all tagged entries */ + /* Call cache-level function to expunge all tagged entries */ if (H5C_expunge_all_tagged_metadata(f, tag, type_id, flags) < 0) HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Cannot expunge all entries") @@ -2856,7 +2856,8 @@ done: * * Return: SUCCEED on success, and FAIL on failure. * - * Programmer: Vailin Choi; Dec 2021 + * Programmer: Vailin Choi + * Dec 2021 * *------------------------------------------------------------------------- */ diff --git a/src/H5ACpublic.h b/src/H5ACpublic.h index c853794..42bc090 100644 --- a/src/H5ACpublic.h +++ b/src/H5ACpublic.h @@ -28,10 +28,6 @@ #include "H5public.h" #include "H5Cpublic.h" -#ifdef __cplusplus -extern "C" { -#endif - /**************************************************************************** * * structure H5AC_cache_config_t @@ -783,7 +779,4 @@ typedef struct H5AC_cache_image_config_t { //! <!-- [H5AC_cache_image_config_t_snip] --> -#ifdef __cplusplus -} -#endif #endif @@ -3495,7 +3495,6 @@ H5C_set_vfd_swmr_reader(H5C_t *cache_ptr, hbool_t vfd_swmr_reader, hsize_t page_ FUNC_ENTER_NOAPI(FAIL) if ((cache_ptr == NULL) || (cache_ptr->magic != H5C__H5C_T_MAGIC)) - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr on entry") cache_ptr->vfd_swmr_reader = vfd_swmr_reader; @@ -7653,7 +7652,7 @@ H5C__load_entry(H5F_t *f, h5_retry_t retry; /* - * This do/while loop performs the following till the metadata checksum + * This for loop performs the following till the metadata checksum * is correct or the file's number of allowed read attempts are reached. * --read the metadata * --determine the actual size of the metadata diff --git a/src/H5CSprivate.h b/src/H5CSprivate.h index a238ec7..2dc28f5 100644 --- a/src/H5CSprivate.h +++ b/src/H5CSprivate.h @@ -17,10 +17,6 @@ #ifndef H5CSprivate_H #define H5CSprivate_H -#ifdef NOT_YET -#include "H5CSpublic.h" -#endif /* NOT_YET */ - /* Private headers needed by this file */ #include "H5private.h" diff --git a/src/H5CXprivate.h b/src/H5CXprivate.h index 8ec1c59..878bcf6 100644 --- a/src/H5CXprivate.h +++ b/src/H5CXprivate.h @@ -16,11 +16,6 @@ #ifndef H5CXprivate_H #define H5CXprivate_H -/* Include package's public header */ -#ifdef NOT_YET -#include "H5CXpublic.h" -#endif /* NOT_YET */ - /* Private headers needed by this file */ #include "H5private.h" /* Generic Functions */ #include "H5ACprivate.h" /* Metadata cache */ diff --git a/src/H5Cpublic.h b/src/H5Cpublic.h index 79ece10..c65dc7c 100644 --- a/src/H5Cpublic.h +++ b/src/H5Cpublic.h @@ -27,10 +27,6 @@ /* Public headers needed by this file */ #include "H5public.h" -#ifdef __cplusplus -extern "C" { -#endif - enum H5C_cache_incr_mode { H5C_incr__off, /**<Automatic cache size increase is disabled, and the remaining increment fields are ignored.*/ @@ -61,7 +57,4 @@ enum H5C_cache_decr_mode { /**<Automatic cache size decrease is enabled using the ageout with hit rate threshold algorithm.*/ }; -#ifdef __cplusplus -} -#endif #endif diff --git a/src/H5EAprivate.h b/src/H5EAprivate.h index 19dabd9..9481559f 100644 --- a/src/H5EAprivate.h +++ b/src/H5EAprivate.h @@ -26,11 +26,6 @@ #ifndef H5EAprivate_H #define H5EAprivate_H -/* Include package's public header */ -#ifdef NOT_YET -#include "H5EApublic.h" -#endif /* NOT_YET */ - /* Private headers needed by this file */ #include "H5ACprivate.h" /* Metadata cache */ #include "H5Fprivate.h" /* File access */ diff --git a/src/H5FAprivate.h b/src/H5FAprivate.h index 59d3652..745c129 100644 --- a/src/H5FAprivate.h +++ b/src/H5FAprivate.h @@ -24,11 +24,6 @@ #ifndef H5FAprivate_H #define H5FAprivate_H -/* Include package's public header */ -#ifdef NOT_YET -#include "H5FApublic.h" -#endif /* NOT_YET */ - /* Private headers needed by this file */ #include "H5ACprivate.h" /* Metadata cache */ #include "H5Fprivate.h" /* File access */ diff --git a/src/H5FDvfd_swmr.c b/src/H5FDvfd_swmr.c index cd1a02e..c79a357 100644 --- a/src/H5FDvfd_swmr.c +++ b/src/H5FDvfd_swmr.c @@ -142,9 +142,6 @@ H5FL_SEQ_DEFINE(H5FD_vfd_swmr_idx_entry_t); * Return: Success: The driver ID for the VFD SWMR driver. * Failure: Negative * - * Programmer: Robb Matzke - * Thursday, July 29, 1999 - * *------------------------------------------------------------------------- */ hid_t @@ -170,9 +167,6 @@ H5FD_vfd_swmr_init(void) * * Returns: SUCCEED (Can't fail) * - * Programmer: Quincey Koziol - * Friday, Jan 30, 2004 - * *--------------------------------------------------------------------------- */ static herr_t @@ -214,9 +208,16 @@ done: FUNC_LEAVE_API(ret_value) } /* end H5Pset_fapl_vfd_swmr() */ -/* Perform the reader-only aspects of opening in VFD SWMR mode: - * initialize histogram of ticks spent in API calls, wait for the - * shadow file to appear, load the header and index. +/*------------------------------------------------------------------------- + * Function: H5FD__swmr_reader_open + * + * Purpose: Perform the reader-only aspects of opening in VFD SWMR mode: + * initialize histogram of ticks spent in API calls, wait for + * the shadow file to appear, load the header and index. + * + * Return: SUCCEED/FAIL + * + *------------------------------------------------------------------------- */ static herr_t H5FD__swmr_reader_open(H5FD_vfd_swmr_t *file) @@ -351,24 +352,38 @@ done: FUNC_LEAVE_NOAPI(ret_value) } /* end H5FD__vfd_swmr_open() */ -/* Perform the reader-only aspects of closing in VFD SWMR mode: optionally - * log and always release the histogram of ticks spent in API calls, - * close the shadow file, release the shadow index. +/*------------------------------------------------------------------------- + * Function: H5FD__swmr_reader_close + * + * Purpose: Perform the reader-only aspects of closing in VFD SWMR mode: + * optionally log and always release the histogram of ticks spent + * in API calls, close the shadow file, release the shadow index. + * + * Return: void + * + *------------------------------------------------------------------------- */ -static void +static herr_t H5FD__swmr_reader_close(H5FD_vfd_swmr_t *file) { + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_STATIC + if (file->api_elapsed_ticks != NULL) H5MM_xfree(file->api_elapsed_ticks); /* Close the metadata file */ if (file->md_fd >= 0 && HDclose(file->md_fd) < 0) /* Push error, but keep going */ - HERROR(H5E_VFL, H5E_CANTCLOSEFILE, "unable to close the metadata file"); + HDONE_ERROR(H5E_VFL, H5E_CANTCLOSEFILE, FAIL, "unable to close the metadata file"); /* Free the index entries */ if (file->md_index.num_entries && file->md_index.entries) file->md_index.entries = H5FL_SEQ_FREE(H5FD_vfd_swmr_idx_entry_t, file->md_index.entries); + + FUNC_LEAVE_NOAPI(ret_value) + } /* end H5FD__swmr_reader_close() */ /*------------------------------------------------------------------------- @@ -1188,7 +1203,7 @@ done: } /* H5FD__vfd_swmr_header_deserialize() */ -/* +/*------------------------------------------------------------------------- * Function: H5FD__vfd_swmr_index_deserialize() * * Purpose: Load and decode the index in the metadata file @@ -1199,10 +1214,8 @@ done: * --Decode the index entries if the tick number in the header and * the index match * - * Return: Success: TRUE - * Failure: FAIL - * Retry: FALSE - * + * Return: TRUE/FALSE/FAIL + *------------------------------------------------------------------------- */ static htri_t H5FD__vfd_swmr_index_deserialize(const H5FD_vfd_swmr_t *file, H5FD_vfd_swmr_md_index *md_index, @@ -1342,8 +1355,7 @@ done: * --Return tick_num, num_entries and index from the VFD's * local copies. * - * Return: Success: SUCCEED - * Failure: FAIL + * Return: SUCCEED/FAIL * * Programmer: Vailin Choi * @@ -1392,8 +1404,7 @@ done: * Purpose: Dump a variety of information about the vfd swmr reader * vfd to stderr for debugging purposes. * - * Return: Success: SUCCEED - * Failure: FAIL + * Return: SUCCEED/FAIL * *------------------------------------------------------------------------- */ @@ -1476,7 +1487,6 @@ H5FD_vfd_swmr_set_pb_configured(H5FD_t *_file) * Programmer: JRM -- 1/29/19 * *------------------------------------------------------------------------- - * */ void H5FD_vfd_swmr_record_elapsed_ticks(H5FD_t *_file, uint64_t elapsed) diff --git a/src/H5FLprivate.h b/src/H5FLprivate.h index 6519551..8e9d0d4 100644 --- a/src/H5FLprivate.h +++ b/src/H5FLprivate.h @@ -50,6 +50,11 @@ */ /* #define H5FL_TRACK */ #ifdef H5FL_TRACK + +#ifndef H5_HAVE_CODESTACK +#error "Free list tracking requires code stack to be enabled" +#endif + /* Macro for inclusion in the free list allocation calls */ #define H5FL_TRACK_INFO , __FILE__, __func__, __LINE__ @@ -273,16 +278,17 @@ typedef struct H5FL_arr_head_t { #define H5FL_BARR_DEFINE_STATIC(b, t, m) static H5FL_ARR_DEFINE_COMMON(sizeof(b), t, m) /* Allocate an array of type 't' */ -#define H5FL_ARR_MALLOC(t, elem) H5FL_arr_malloc(&(H5FL_ARR_NAME(t)), elem) +#define H5FL_ARR_MALLOC(t, elem) H5FL_arr_malloc(&(H5FL_ARR_NAME(t)), elem H5FL_TRACK_INFO) /* Allocate an array of type 't' and clear it to all zeros */ -#define H5FL_ARR_CALLOC(t, elem) H5FL_arr_calloc(&(H5FL_ARR_NAME(t)), elem) +#define H5FL_ARR_CALLOC(t, elem) H5FL_arr_calloc(&(H5FL_ARR_NAME(t)), elem H5FL_TRACK_INFO) /* Free an array of type 't' */ #define H5FL_ARR_FREE(t, obj) (t *)H5FL_arr_free(&(H5FL_ARR_NAME(t)), obj) /* Re-allocate an array of type 't' */ -#define H5FL_ARR_REALLOC(t, obj, new_elem) H5FL_arr_realloc(&(H5FL_ARR_NAME(t)), obj, new_elem) +#define H5FL_ARR_REALLOC(t, obj, new_elem) \ + H5FL_arr_realloc(&(H5FL_ARR_NAME(t)), obj, new_elem H5FL_TRACK_INFO) #else /* H5_NO_ARR_FREE_LISTS */ /* Common macro for H5FL_ARR_DEFINE & H5FL_ARR_DEFINE_STATIC (and H5FL_BARR variants) */ @@ -405,10 +411,10 @@ H5_DLL void *H5FL_reg_calloc(H5FL_reg_head_t *head H5FL_TRACK_PARAMS); H5_DLL void *H5FL_reg_free(H5FL_reg_head_t *head, void *obj); /* Array free lists */ -H5_DLL void *H5FL_arr_malloc(H5FL_arr_head_t *head, size_t elem); -H5_DLL void *H5FL_arr_calloc(H5FL_arr_head_t *head, size_t elem); +H5_DLL void *H5FL_arr_malloc(H5FL_arr_head_t *head, size_t elem H5FL_TRACK_PARAMS); +H5_DLL void *H5FL_arr_calloc(H5FL_arr_head_t *head, size_t elem H5FL_TRACK_PARAMS); H5_DLL void *H5FL_arr_free(H5FL_arr_head_t *head, void *obj); -H5_DLL void *H5FL_arr_realloc(H5FL_arr_head_t *head, void *obj, size_t new_elem); +H5_DLL void *H5FL_arr_realloc(H5FL_arr_head_t *head, void *obj, size_t new_elem H5FL_TRACK_PARAMS); /* Sequence free lists */ H5_DLL void *H5FL_seq_malloc(H5FL_seq_head_t *head, size_t elem H5FL_TRACK_PARAMS); diff --git a/src/H5Fvfd_swmr.c b/src/H5Fvfd_swmr.c index 84beefc..64cc378 100644 --- a/src/H5Fvfd_swmr.c +++ b/src/H5Fvfd_swmr.c @@ -157,8 +157,7 @@ H5FL_DEFINE(eot_queue_entry_t); * --set f->shared->tick_num to the current tick read from the * metadata file * - * Return: Success: SUCCEED - * Failure: FAIL + * Return: SUCCEED/FAIL *------------------------------------------------------------------------- */ herr_t @@ -298,8 +297,7 @@ done: * --start a new tick (??check with JM for sure) * ??update end_of_tick * - * Return: Success: SUCCEED - * Failure: FAIL + * Return: SUCCEED/FAIL *------------------------------------------------------------------------- */ herr_t diff --git a/src/H5HP.c b/src/H5HP.c deleted file mode 100644 index d164223..0000000 --- a/src/H5HP.c +++ /dev/null @@ -1,904 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * Copyright by the Board of Trustees of the University of Illinois. * - * All rights reserved. * - * * - * This file is part of HDF5. The full HDF5 copyright notice, including * - * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * - * distribution tree, or in https://www.hdfgroup.org/licenses. * - * If you do not have access to either file, you may request a copy from * - * help@hdfgroup.org. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/* - * Purpose: Provides a heap abstract data type. - * - * (See chapter 11 - "Priority Queues" of _Algorithms_, by - * Sedgewick for additional information) - * - */ - -/* Private headers needed */ -#include "H5private.h" /* Generic Functions */ -#include "H5Eprivate.h" /* Error handling */ -#include "H5HPprivate.h" /* Heap routines */ -#include "H5FLprivate.h" /* Memory management functions */ - -/* Local Macros */ -#define H5HP_START_SIZE 16 /* Initial number of entries for heaps */ - -/* Private typedefs & structs */ - -/* Data structure for entries in the internal heap array */ -typedef struct { - int val; /* Value to be used for heap condition */ - H5HP_info_t *obj; /* Pointer to object stored in heap */ -} H5HP_ent_t; - -/* Main heap data structure */ -struct H5HP_t { - H5HP_type_t type; /* Type of heap (minimum or maximum value at "top") */ - size_t nobjs; /* Number of active objects in heap array */ - size_t nalloc; /* Number of allocated locations in heap array */ - H5HP_ent_t *heap; /* Pointer to array containing heap entries */ -}; - -/* Static functions */ -static herr_t H5HP__swim_max(H5HP_t *heap, size_t loc); -static herr_t H5HP__swim_min(H5HP_t *heap, size_t loc); -static herr_t H5HP__sink_max(H5HP_t *heap, size_t loc); -static herr_t H5HP__sink_min(H5HP_t *heap, size_t loc); - -/* Declare a free list to manage the H5HP_t struct */ -H5FL_DEFINE_STATIC(H5HP_t); - -/* Declare a free list to manage sequences of H5HP_ent_t */ -H5FL_SEQ_DEFINE_STATIC(H5HP_ent_t); - -/*-------------------------------------------------------------------------- - NAME - H5HP__swim_max - PURPOSE - Restore heap condition by moving an object upward - USAGE - herr_t H5HP__swim_max(heap, loc) - H5HP_t *heap; IN/OUT: Pointer to heap to modify - size_t loc; IN: Location to start from - - RETURNS - Returns non-negative on success, negative on failure. - DESCRIPTION - Restore the heap condition for the heap's array by "swimming" the object - at a location upward. - GLOBAL VARIABLES - COMMENTS, BUGS, ASSUMPTIONS - This routine is for "maximum" value heaps. - EXAMPLES - REVISION LOG ---------------------------------------------------------------------------*/ -static herr_t -H5HP__swim_max(H5HP_t *heap, size_t loc) -{ - int val; /* Temporary copy value of object to move in heap */ - H5HP_info_t *obj; /* Temporary pointer to object to move in heap */ - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_STATIC_NOERR - - /* Get copies of the information about the object to move in the heap */ - val = heap->heap[loc].val; - obj = heap->heap[loc].obj; - - /* Move object up in heap until it's reached the maximum location possible */ - while (heap->heap[loc / 2].val < val) { - /* Move object "above" current location in heap down */ - heap->heap[loc].val = heap->heap[loc / 2].val; - heap->heap[loc].obj = heap->heap[loc / 2].obj; - - /* Update heap location for object which moved */ - heap->heap[loc].obj->heap_loc = loc; - - /* Move to location "above" current location */ - loc = loc / 2; - } /* end while */ - - /* Put object into heap at correct location */ - heap->heap[loc].val = val; - heap->heap[loc].obj = obj; - - /* Update heap location for object */ - heap->heap[loc].obj->heap_loc = loc; - - FUNC_LEAVE_NOAPI(ret_value); -} /* end H5HP__swim_max() */ - -/*-------------------------------------------------------------------------- - NAME - H5HP__swim_min - PURPOSE - Restore heap condition by moving an object upward - USAGE - herr_t H5HP__swim_min(heap, loc) - H5HP_t *heap; IN/OUT: Pointer to heap to modify - size_t loc; IN: Location to start from - - RETURNS - Returns non-negative on success, negative on failure. - DESCRIPTION - Restore the heap condition for the heap's array by "swimming" the object - at a location upward. - GLOBAL VARIABLES - COMMENTS, BUGS, ASSUMPTIONS - This routine is for "minimum" value heaps. - EXAMPLES - REVISION LOG ---------------------------------------------------------------------------*/ -static herr_t -H5HP__swim_min(H5HP_t *heap, size_t loc) -{ - int val; /* Temporary copy value of object to move in heap */ - H5HP_info_t *obj; /* Temporary pointer to object to move in heap */ - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_STATIC_NOERR - - /* Get copies of the information about the object to move in the heap */ - val = heap->heap[loc].val; - obj = heap->heap[loc].obj; - - /* Move object up in heap until it's reached the minimum location possible */ - while (heap->heap[loc / 2].val > val) { - /* Move object "above" current location in heap down */ - heap->heap[loc].val = heap->heap[loc / 2].val; - heap->heap[loc].obj = heap->heap[loc / 2].obj; - - /* Update heap location for object which moved */ - heap->heap[loc].obj->heap_loc = loc; - - /* Move to location "above" current location */ - loc = loc / 2; - } /* end while */ - - /* Put object into heap at correct location */ - heap->heap[loc].val = val; - heap->heap[loc].obj = obj; - - /* Update heap location for object */ - heap->heap[loc].obj->heap_loc = loc; - - FUNC_LEAVE_NOAPI(ret_value); -} /* end H5HP__swim_min() */ - -/*-------------------------------------------------------------------------- - NAME - H5HP__sink_max - PURPOSE - Restore heap condition by moving an object downward - USAGE - herr_t H5HP__sink_max(heap, loc) - H5HP_t *heap; IN/OUT: Pointer to heap to modify - size_t loc; IN: Location to start from - - RETURNS - Returns non-negative on success, negative on failure. - DESCRIPTION - Restore the heap condition for the heap's array by "sinking" the object - at a location downward. - GLOBAL VARIABLES - COMMENTS, BUGS, ASSUMPTIONS - This routine is for "maximum" value heaps. - EXAMPLES - REVISION LOG ---------------------------------------------------------------------------*/ -static herr_t -H5HP__sink_max(H5HP_t *heap, size_t loc) -{ - int val; /* Temporary copy value of object to move in heap */ - void * obj; /* Temporary pointer to object to move in heap */ - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_STATIC_NOERR - - /* Get copies of the information about the object to move in the heap */ - val = heap->heap[loc].val; - obj = heap->heap[loc].obj; - - /* Move object up in heap until it's reached the maximum location possible */ - while ((2 * loc) <= heap->nobjs) { - size_t new_loc = loc * 2; /* New object's potential location area */ - - /* Get the greater of the two objects below the location in heap */ - if (new_loc < heap->nobjs && (heap->heap[new_loc].val < heap->heap[new_loc + 1].val)) - new_loc++; - - /* Check if the object is smaller than the larger of the objects below it */ - /* If so, its in the correct location now, and we can get out */ - if (val >= heap->heap[new_loc].val) - break; - - /* Move the greater of the two objects below the current location up */ - heap->heap[loc].val = heap->heap[new_loc].val; - heap->heap[loc].obj = heap->heap[new_loc].obj; - - /* Update heap location for object which moved */ - heap->heap[loc].obj->heap_loc = loc; - - /* Move to location "below" current location */ - loc = new_loc; - } /* end while */ - - /* Put object into heap at correct location */ - heap->heap[loc].val = val; - heap->heap[loc].obj = (H5HP_info_t *)obj; - - /* Update heap location for object */ - heap->heap[loc].obj->heap_loc = loc; - - FUNC_LEAVE_NOAPI(ret_value); -} /* end H5HP__sink_max() */ - -/*-------------------------------------------------------------------------- - NAME - H5HP__sink_min - PURPOSE - Restore heap condition by moving an object downward - USAGE - herr_t H5HP__sink_min(heap, loc) - H5HP_t *heap; IN/OUT: Pointer to heap to modify - size_t loc; IN: Location to start from - - RETURNS - Returns non-negative on success, negative on failure. - DESCRIPTION - Restore the heap condition for the heap's array by "sinking" the object - at a location downward. - GLOBAL VARIABLES - COMMENTS, BUGS, ASSUMPTIONS - This routine is for "minimum" value heaps. - EXAMPLES - REVISION LOG ---------------------------------------------------------------------------*/ -static herr_t -H5HP__sink_min(H5HP_t *heap, size_t loc) -{ - int val; /* Temporary copy value of object to move in heap */ - void * obj; /* Temporary pointer to object to move in heap */ - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_STATIC_NOERR - - /* Get copies of the information about the object to move in the heap */ - val = heap->heap[loc].val; - obj = heap->heap[loc].obj; - - /* Move object up in heap until it's reached the maximum location possible */ - while ((2 * loc) <= heap->nobjs) { - size_t new_loc = loc * 2; /* New object's potential location area */ - - /* Get the lesser of the two objects below the location in heap */ - if (new_loc < heap->nobjs && (heap->heap[new_loc].val > heap->heap[new_loc + 1].val)) - new_loc++; - - /* Check if the object is greater than the larger of the objects below it */ - /* If so, its in the correct location now, and we can get out */ - if (val <= heap->heap[new_loc].val) - break; - - /* Move the greater of the two objects below the current location up */ - heap->heap[loc].val = heap->heap[new_loc].val; - heap->heap[loc].obj = heap->heap[new_loc].obj; - - /* Update heap location for object which moved */ - heap->heap[loc].obj->heap_loc = loc; - - /* Move to location "below" current location */ - loc = new_loc; - } /* end while */ - - /* Put object into heap at correct location */ - heap->heap[loc].val = val; - heap->heap[loc].obj = (H5HP_info_t *)obj; - - /* Update heap location for object */ - heap->heap[loc].obj->heap_loc = loc; - - FUNC_LEAVE_NOAPI(ret_value); -} /* end H5HP__sink_min() */ - -/*-------------------------------------------------------------------------- - NAME - H5HP_create - PURPOSE - Create a heap - USAGE - H5HP_t *H5HP_create(heap_type) - H5HP_type_t heap_type; IN: Type of heap to create - - RETURNS - Returns a pointer to a heap on success, NULL on failure. - DESCRIPTION - Create a priority queue. The SIZE is used to set the initial number of - entries allocated. - GLOBAL VARIABLES - COMMENTS, BUGS, ASSUMPTIONS - EXAMPLES - REVISION LOG ---------------------------------------------------------------------------*/ -H5HP_t * -H5HP_create(H5HP_type_t heap_type) -{ - H5HP_t *new_heap = NULL; /* Pointer to new heap object created */ - H5HP_t *ret_value; /* Return value */ - - FUNC_ENTER_NOAPI(NULL) - - /* Check args */ - HDassert(heap_type == H5HP_MIN_HEAP || heap_type == H5HP_MAX_HEAP); - - /* Allocate ref-counted string structure */ - if ((new_heap = H5FL_MALLOC(H5HP_t)) == NULL) - HGOTO_ERROR(H5E_HEAP, H5E_NOSPACE, NULL, "memory allocation failed"); - - /* Allocate the array to store the heap entries */ - if ((new_heap->heap = H5FL_SEQ_MALLOC(H5HP_ent_t, (size_t)(H5HP_START_SIZE + 1))) == NULL) - HGOTO_ERROR(H5E_HEAP, H5E_NOSPACE, NULL, "memory allocation failed"); - - /* Set the internal fields */ - new_heap->type = heap_type; - new_heap->nobjs = 0; - new_heap->nalloc = H5HP_START_SIZE + 1; - - /* Set the information in the 0'th location based on the type of heap */ - if (heap_type == H5HP_MIN_HEAP) { - /* Set the value in the '0' location to be the minimum value, to - * simplify the algorithms - */ - new_heap->heap[0].val = INT_MIN; - new_heap->heap[0].obj = NULL; - } /* end if */ - else { - /* Set the value in the '0' location to be the maximum value, to - * simplify the algorithms - */ - new_heap->heap[0].val = INT_MAX; - new_heap->heap[0].obj = NULL; - } /* end else */ - - /* Set the return value */ - ret_value = new_heap; - -done: - /* Error cleanup */ - if (NULL == ret_value) { - if (NULL != new_heap) { - if (NULL != new_heap->heap) - new_heap->heap = H5FL_SEQ_FREE(H5HP_ent_t, new_heap->heap); - new_heap = H5FL_FREE(H5HP_t, new_heap); - } /* end if */ - } /* end if */ - - FUNC_LEAVE_NOAPI(ret_value); -} /* end H5HP_create() */ - -/*-------------------------------------------------------------------------- - NAME - H5HP_count - PURPOSE - Check the number of elements in a heap - USAGE - ssize_t H5HP_count(heap) - const H5HP_t *heap; IN: Pointer to heap to query - - RETURNS - Returns non-negative on success, negative on failure. - DESCRIPTION - Checks the number of elements in heap - GLOBAL VARIABLES - COMMENTS, BUGS, ASSUMPTIONS - EXAMPLES - REVISION LOG ---------------------------------------------------------------------------*/ -ssize_t -H5HP_count(const H5HP_t *heap) -{ - ssize_t ret_value; /* Return value */ - - FUNC_ENTER_NOAPI_NOINIT_NOERR - - /* Check args */ - HDassert(heap); - - /* Check internal consistency */ - /* (Pre-condition) */ - HDassert(heap->nobjs < heap->nalloc); - HDassert(heap->heap); - HDassert((heap->type == H5HP_MAX_HEAP && heap->heap[0].val == INT_MAX) || - (heap->type == H5HP_MIN_HEAP && heap->heap[0].val == INT_MIN)); - HDassert(heap->heap[0].obj == NULL); - - /* Return the number of objects in the heap */ - H5_CHECK_OVERFLOW(heap->nobjs, size_t, ssize_t); - ret_value = (ssize_t)heap->nobjs; - - /* No post-condition check necessary, since heap is constant */ - FUNC_LEAVE_NOAPI(ret_value); -} /* end H5HP_count() */ - -/*-------------------------------------------------------------------------- - NAME - H5HP_insert - PURPOSE - Insert an object into a heap, with an initial value - USAGE - herr_t H5HP_insert(heap, val, obj) - H5HP_t *heap; IN/OUT: Pointer to heap to modify - int val; IN: Initial value for object in heap - void *obj; IN: Pointer to object to insert into heap - - RETURNS - Returns non-negative on success, negative on failure. - DESCRIPTION - Inserts a OBJ into a HEAP, with an initial VALue. - GLOBAL VARIABLES - COMMENTS, BUGS, ASSUMPTIONS - EXAMPLES - REVISION LOG ---------------------------------------------------------------------------*/ -herr_t -H5HP_insert(H5HP_t *heap, int val, void *obj) -{ - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(FAIL) - - /* Check args */ - HDassert(heap); - HDassert(obj); - - /* Check internal consistency */ - /* (Pre-condition) */ - HDassert(heap->nobjs < heap->nalloc); - HDassert(heap->heap); - HDassert((heap->type == H5HP_MAX_HEAP && heap->heap[0].val == INT_MAX) || - (heap->type == H5HP_MIN_HEAP && heap->heap[0].val == INT_MIN)); - HDassert(heap->heap[0].obj == NULL); - - /* Increment number of objects in heap */ - heap->nobjs++; - - /* Check if we need to allocate more room for heap array */ - if (heap->nobjs >= heap->nalloc) { - size_t n = MAX(H5HP_START_SIZE, 2 * (heap->nalloc - 1)) + 1; - H5HP_ent_t *new_heap = H5FL_SEQ_REALLOC(H5HP_ent_t, heap->heap, n); - - if (!new_heap) - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "unable to extend heap array"); - heap->heap = new_heap; - heap->nalloc = n; - } /* end if */ - - /* Insert new object at end of heap */ - heap->heap[heap->nobjs].val = val; - heap->heap[heap->nobjs].obj = (H5HP_info_t *)obj; - heap->heap[heap->nobjs].obj->heap_loc = heap->nobjs; - - /* Restore heap condition */ - if (heap->type == H5HP_MAX_HEAP) { - if (H5HP__swim_max(heap, heap->nobjs) < 0) - HGOTO_ERROR(H5E_HEAP, H5E_CANTINSERT, FAIL, "unable to restore heap condition"); - } /* end if */ - else { - if (H5HP__swim_min(heap, heap->nobjs) < 0) - HGOTO_ERROR(H5E_HEAP, H5E_CANTINSERT, FAIL, "unable to restore heap condition"); - } /* end else */ - -done: - - /* Check internal consistency */ - /* (Post-condition) */ - HDassert(heap->nobjs < heap->nalloc); - HDassert(heap->heap); - HDassert((heap->type == H5HP_MAX_HEAP && heap->heap[0].val == INT_MAX) || - (heap->type == H5HP_MIN_HEAP && heap->heap[0].val == INT_MIN)); - HDassert(heap->heap[0].obj == NULL); - - FUNC_LEAVE_NOAPI(ret_value); -} /* end H5HP_insert() */ - -/*-------------------------------------------------------------------------- - NAME - H5HP_top - PURPOSE - Check the value of the top object in the heap - USAGE - herr_t H5HP_top(heap, val) - const H5HP_t *heap; IN: Pointer to heap to modify - int val; IN/OUT: Initial value for object in heap - - RETURNS - Returns non-negative on success, negative on failure. - DESCRIPTION - Checks the value of the top object in a heap - GLOBAL VARIABLES - COMMENTS, BUGS, ASSUMPTIONS - EXAMPLES - REVISION LOG ---------------------------------------------------------------------------*/ -herr_t -H5HP_top(const H5HP_t *heap, int *val) -{ - FUNC_ENTER_NOAPI_NOINIT_NOERR - - /* Check args */ - HDassert(heap); - HDassert(val); - - /* Check internal consistency */ - /* (Pre-condition) */ - HDassert(heap->nobjs < heap->nalloc); - HDassert(heap->heap); - HDassert((heap->type == H5HP_MAX_HEAP && heap->heap[0].val == INT_MAX) || - (heap->type == H5HP_MIN_HEAP && heap->heap[0].val == INT_MIN)); - HDassert(heap->heap[0].obj == NULL); - - /* Get value of the top object in the heap */ - *val = heap->heap[1].val; - - /* No post-condition check necessary, since heap is constant */ - FUNC_LEAVE_NOAPI(SUCCEED); -} /* end H5HP_top() */ - -/*-------------------------------------------------------------------------- - NAME - H5HP_remove - PURPOSE - Remove an object into a heap - USAGE - herr_t H5HP_remove(heap, val, obj) - H5HP_t *heap; IN/OUT: Pointer to heap to modify - int *val; OUT: Pointer to value of object removed from heap - void **obj; OUT: Pointer to object removed from heap - - RETURNS - Returns non-negative on success, negative on failure. - DESCRIPTION - Removes the top object on a heap, returning its value and object pointer - GLOBAL VARIABLES - COMMENTS, BUGS, ASSUMPTIONS - EXAMPLES - REVISION LOG ---------------------------------------------------------------------------*/ -herr_t -H5HP_remove(H5HP_t *heap, int *val, void **obj) -{ - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(FAIL) - - /* Check args */ - HDassert(heap); - HDassert(val); - HDassert(obj); - - /* Check internal consistency */ - /* (Pre-condition) */ - HDassert(heap->nobjs < heap->nalloc); - HDassert(heap->heap); - HDassert((heap->type == H5HP_MAX_HEAP && heap->heap[0].val == INT_MAX) || - (heap->type == H5HP_MIN_HEAP && heap->heap[0].val == INT_MIN)); - HDassert(heap->heap[0].obj == NULL); - - /* Check if there are any objects on the heap to remove */ - if (heap->nobjs == 0) - HGOTO_ERROR(H5E_HEAP, H5E_NOTFOUND, FAIL, "heap is empty"); - - /* Get the information for the top object on the heap */ - HDassert(heap->heap[1].obj->heap_loc == 1); - *val = heap->heap[1].val; - *obj = heap->heap[1].obj; - - /* Move the last element in the heap to the top */ - heap->heap[1].val = heap->heap[heap->nobjs].val; - heap->heap[1].obj = heap->heap[heap->nobjs].obj; - heap->heap[1].obj->heap_loc = 1; - - /* Decrement number of objects in heap */ - heap->nobjs--; - - /* Restore heap condition, if there are objects on the heap */ - if (heap->nobjs > 0) { - if (heap->type == H5HP_MAX_HEAP) { - if (H5HP__sink_max(heap, (size_t)1) < 0) - HGOTO_ERROR(H5E_HEAP, H5E_CANTDELETE, FAIL, "unable to restore heap condition"); - } /* end if */ - else { - if (H5HP__sink_min(heap, (size_t)1) < 0) - HGOTO_ERROR(H5E_HEAP, H5E_CANTDELETE, FAIL, "unable to restore heap condition"); - } /* end else */ - } /* end if */ - -done: - - /* Check internal consistency */ - /* (Post-condition) */ - HDassert(heap->nobjs < heap->nalloc); - HDassert(heap->heap); - HDassert((heap->type == H5HP_MAX_HEAP && heap->heap[0].val == INT_MAX) || - (heap->type == H5HP_MIN_HEAP && heap->heap[0].val == INT_MIN)); - HDassert(heap->heap[0].obj == NULL); - - FUNC_LEAVE_NOAPI(ret_value); -} /* end H5HP_remove() */ - -/*-------------------------------------------------------------------------- - NAME - H5HP_change - PURPOSE - Change the priority of an object on a heap - USAGE - herr_t H5HP_change(heap, val, obj) - H5HP_t *heap; IN/OUT: Pointer to heap to modify - int val; IN: New priority value for object - void *obj; IN: Pointer to object to modify - - RETURNS - Returns non-negative on success, negative on failure. - DESCRIPTION - Changes the priority of an object on a heap. - GLOBAL VARIABLES - COMMENTS, BUGS, ASSUMPTIONS - EXAMPLES - REVISION LOG ---------------------------------------------------------------------------*/ -herr_t -H5HP_change(H5HP_t *heap, int val, void *_obj) -{ - H5HP_info_t *obj = (H5HP_info_t *)_obj; /* Alias for object */ - size_t obj_loc; /* Location of object in heap */ - int old_val; /* Object's old priority value */ - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(FAIL) - - /* Check args */ - HDassert(heap); - HDassert(obj); - - /* Check internal consistency */ - /* (Pre-condition) */ - HDassert(heap->nobjs < heap->nalloc); - HDassert(heap->heap); - HDassert((heap->type == H5HP_MAX_HEAP && heap->heap[0].val == INT_MAX) || - (heap->type == H5HP_MIN_HEAP && heap->heap[0].val == INT_MIN)); - HDassert(heap->heap[0].obj == NULL); - - /* Get the location of the object in the heap */ - obj_loc = obj->heap_loc; - HDassert(obj_loc > 0 && obj_loc <= heap->nobjs); - - /* Change the heap object's priority */ - old_val = heap->heap[obj_loc].val; - heap->heap[obj_loc].val = val; - - /* Restore heap condition */ - if (val < old_val) { - if (heap->type == H5HP_MAX_HEAP) { - if (H5HP__sink_max(heap, obj_loc) < 0) - HGOTO_ERROR(H5E_HEAP, H5E_CANTRESTORE, FAIL, "unable to restore heap condition"); - } /* end if */ - else { - if (H5HP__swim_min(heap, obj_loc) < 0) - HGOTO_ERROR(H5E_HEAP, H5E_CANTRESTORE, FAIL, "unable to restore heap condition"); - } /* end else */ - } /* end if */ - else { - if (heap->type == H5HP_MAX_HEAP) { - if (H5HP__swim_max(heap, obj_loc) < 0) - HGOTO_ERROR(H5E_HEAP, H5E_CANTRESTORE, FAIL, "unable to restore heap condition"); - } /* end if */ - else { - if (H5HP__sink_min(heap, obj_loc) < 0) - HGOTO_ERROR(H5E_HEAP, H5E_CANTRESTORE, FAIL, "unable to restore heap condition"); - } /* end else */ - } /* end else */ - -done: - - /* Check internal consistency */ - /* (Post-condition) */ - HDassert(heap->nobjs < heap->nalloc); - HDassert(heap->heap); - HDassert((heap->type == H5HP_MAX_HEAP && heap->heap[0].val == INT_MAX) || - (heap->type == H5HP_MIN_HEAP && heap->heap[0].val == INT_MIN)); - HDassert(heap->heap[0].obj == NULL); - - FUNC_LEAVE_NOAPI(ret_value); -} /* end H5HP_change() */ - -/*-------------------------------------------------------------------------- - NAME - H5HP_incr - PURPOSE - Increment the priority of an object on a heap - USAGE - herr_t H5HP_incr(heap, amt, obj) - H5HP_t *heap; IN/OUT: Pointer to heap to modify - unsigned amt; IN: Amount to increase priority by - void *obj; IN: Pointer to object to modify - - RETURNS - Returns non-negative on success, negative on failure. - DESCRIPTION - Increments the priority of an object on a heap by one. - GLOBAL VARIABLES - COMMENTS, BUGS, ASSUMPTIONS - EXAMPLES - REVISION LOG ---------------------------------------------------------------------------*/ -herr_t -H5HP_incr(H5HP_t *heap, unsigned amt, void *_obj) -{ - H5HP_info_t *obj = (H5HP_info_t *)_obj; /* Alias for object */ - size_t obj_loc; /* Location of object in heap */ - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(FAIL) - - /* Check args */ - HDassert(heap); - HDassert(obj); - - /* Check internal consistency */ - /* (Pre-condition) */ - HDassert(heap->nobjs < heap->nalloc); - HDassert(heap->heap); - HDassert((heap->type == H5HP_MAX_HEAP && heap->heap[0].val == INT_MAX) || - (heap->type == H5HP_MIN_HEAP && heap->heap[0].val == INT_MIN)); - HDassert(heap->heap[0].obj == NULL); - - /* Get the location of the object in the heap */ - obj_loc = obj->heap_loc; - HDassert(obj_loc > 0 && obj_loc <= heap->nobjs); - - /* Change the heap object's priority */ - heap->heap[obj_loc].val += (int)amt; - - /* Restore heap condition */ - if (H5HP_MAX_HEAP == heap->type) { - if (H5HP__swim_max(heap, obj_loc) < 0) - HGOTO_ERROR(H5E_HEAP, H5E_CANTRESTORE, FAIL, "unable to restore heap condition") - } /* end if */ - else { - if (H5HP__sink_min(heap, obj_loc) < 0) - HGOTO_ERROR(H5E_HEAP, H5E_CANTRESTORE, FAIL, "unable to restore heap condition") - } /* end else */ - -done: - - /* Check internal consistency */ - /* (Post-condition) */ - HDassert(heap->nobjs < heap->nalloc); - HDassert(heap->heap); - HDassert((heap->type == H5HP_MAX_HEAP && heap->heap[0].val == INT_MAX) || - (heap->type == H5HP_MIN_HEAP && heap->heap[0].val == INT_MIN)); - HDassert(heap->heap[0].obj == NULL); - - FUNC_LEAVE_NOAPI(ret_value); -} /* end H5HP_incr() */ - -/*-------------------------------------------------------------------------- - NAME - H5HP_decr - PURPOSE - Decrement the priority of an object on a heap - USAGE - herr_t H5HP_dec(heap, amt, obj) - H5HP_t *heap; IN/OUT: Pointer to heap to modify - unsigned amt; IN: Amount to decrease priority by - void *obj; IN: Pointer to object to modify - - RETURNS - Returns non-negative on success, negative on failure. - DESCRIPTION - Decrements the priority of an object on a heap by one. - GLOBAL VARIABLES - COMMENTS, BUGS, ASSUMPTIONS - EXAMPLES - REVISION LOG ---------------------------------------------------------------------------*/ -herr_t -H5HP_decr(H5HP_t *heap, unsigned amt, void *_obj) -{ - H5HP_info_t *obj = (H5HP_info_t *)_obj; /* Alias for object */ - size_t obj_loc; /* Location of object in heap */ - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(FAIL) - - /* Check args */ - HDassert(heap); - HDassert(obj); - - /* Check internal consistency */ - /* (Pre-condition) */ - HDassert(heap->nobjs < heap->nalloc); - HDassert(heap->heap); - HDassert((heap->type == H5HP_MAX_HEAP && heap->heap[0].val == INT_MAX) || - (heap->type == H5HP_MIN_HEAP && heap->heap[0].val == INT_MIN)); - HDassert(heap->heap[0].obj == NULL); - - /* Get the location of the object in the heap */ - obj_loc = obj->heap_loc; - HDassert(obj_loc > 0 && obj_loc <= heap->nobjs); - - /* Change the heap object's priority */ - H5_CHECK_OVERFLOW(amt, unsigned, int); - heap->heap[obj_loc].val -= (int)amt; - - /* Restore heap condition */ - if (heap->type == H5HP_MAX_HEAP) { - if (H5HP__sink_max(heap, obj_loc) < 0) - HGOTO_ERROR(H5E_HEAP, H5E_CANTRESTORE, FAIL, "unable to restore heap condition"); - } /* end if */ - else { - if (H5HP__swim_min(heap, obj_loc) < 0) - HGOTO_ERROR(H5E_HEAP, H5E_CANTRESTORE, FAIL, "unable to restore heap condition"); - } /* end else */ - -done: - - /* Check internal consistency */ - /* (Post-condition) */ - HDassert(heap->nobjs < heap->nalloc); - HDassert(heap->heap); - HDassert((heap->type == H5HP_MAX_HEAP && heap->heap[0].val == INT_MAX) || - (heap->type == H5HP_MIN_HEAP && heap->heap[0].val == INT_MIN)); - HDassert(heap->heap[0].obj == NULL); - - FUNC_LEAVE_NOAPI(ret_value); -} /* end H5HP_decr() */ - -/*-------------------------------------------------------------------------- - NAME - H5HP_close - PURPOSE - Close a heap, deallocating it. - USAGE - herr_t H5HP_close(heap) - H5HP_t *heap; IN/OUT: Pointer to heap to close - - RETURNS - Returns non-negative on success, negative on failure. - DESCRIPTION - Close a heap, freeing all internal information. Any objects left in - the heap are not deallocated. - GLOBAL VARIABLES - COMMENTS, BUGS, ASSUMPTIONS - EXAMPLES - REVISION LOG ---------------------------------------------------------------------------*/ -herr_t -H5HP_close(H5HP_t *heap) -{ - FUNC_ENTER_NOAPI_NOINIT_NOERR - - /* Check args */ - HDassert(heap); - - /* Check internal consistency */ - /* (Pre-condition) */ - HDassert(heap->nobjs < heap->nalloc); - HDassert(heap->heap); - HDassert((heap->type == H5HP_MAX_HEAP && heap->heap[0].val == INT_MAX) || - (heap->type == H5HP_MIN_HEAP && heap->heap[0].val == INT_MIN)); - HDassert(NULL == heap->heap[0].obj); - - /* Free internal structures for heap */ - heap->heap = H5FL_SEQ_FREE(H5HP_ent_t, heap->heap); - - /* Free actual heap object */ - heap = H5FL_FREE(H5HP_t, heap); - - FUNC_LEAVE_NOAPI(SUCCEED) -} /* end H5HP_close() */ diff --git a/src/H5HPprivate.h b/src/H5HPprivate.h deleted file mode 100644 index 50020bc..0000000 --- a/src/H5HPprivate.h +++ /dev/null @@ -1,68 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * Copyright by the Board of Trustees of the University of Illinois. * - * All rights reserved. * - * * - * This file is part of HDF5. The full HDF5 copyright notice, including * - * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * - * distribution tree, or in https://www.hdfgroup.org/licenses. * - * If you do not have access to either file, you may request a copy from * - * help@hdfgroup.org. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/* - * This file contains private information about the H5HP module - */ -#ifndef H5HPprivate_H -#define H5HPprivate_H - -/**************************************/ -/* Public headers needed by this file */ -/**************************************/ -#ifdef LATER -#include "H5HPpublic.h" -#endif /* LATER */ - -/***************************************/ -/* Private headers needed by this file */ -/***************************************/ -#include "H5private.h" - -/************/ -/* Typedefs */ -/************/ - -/* Typedef for heap struct (defined in H5HP.c) */ -typedef struct H5HP_t H5HP_t; - -/* Typedef for objects which can be inserted into heaps */ -/* This _must_ be the first field in objects which can be inserted into heaps */ -typedef struct H5HP_info_t { - size_t heap_loc; /* Location of object in heap */ -} H5HP_info_t; - -/* Typedef for type of heap to create */ -typedef enum { - H5HP_MIN_HEAP, /* Minimum values in heap are at the "top" */ - H5HP_MAX_HEAP /* Maximum values in heap are at the "top" */ -} H5HP_type_t; - -/**********/ -/* Macros */ -/**********/ - -/********************/ -/* Private routines */ -/********************/ -H5_DLL H5HP_t *H5HP_create(H5HP_type_t heap_type); -H5_DLL herr_t H5HP_insert(H5HP_t *heap, int val, void *obj); -H5_DLL ssize_t H5HP_count(const H5HP_t *heap); -H5_DLL herr_t H5HP_top(const H5HP_t *heap, int *val); -H5_DLL herr_t H5HP_remove(H5HP_t *heap, int *val, void **ptr); -H5_DLL herr_t H5HP_change(H5HP_t *heap, int val, void *obj); -H5_DLL herr_t H5HP_incr(H5HP_t *heap, unsigned amt, void *obj); -H5_DLL herr_t H5HP_decr(H5HP_t *heap, unsigned amt, void *obj); -H5_DLL herr_t H5HP_close(H5HP_t *heap); - -#endif /* H5HPprivate_H */ diff --git a/src/H5MP.c b/src/H5MP.c deleted file mode 100644 index 397d26b..0000000 --- a/src/H5MP.c +++ /dev/null @@ -1,443 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * Copyright by the Board of Trustees of the University of Illinois. * - * All rights reserved. * - * * - * This file is part of HDF5. The full HDF5 copyright notice, including * - * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * - * distribution tree, or in https://www.hdfgroup.org/licenses. * - * If you do not have access to either file, you may request a copy from * - * help@hdfgroup.org. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/*------------------------------------------------------------------------- - * - * Created: H5MP.c - * May 2 2005 - * Quincey Koziol - * - * Purpose: Implements memory pools. (Similar to Apache's APR - * memory pools) - * - * Please see the documentation in: - * doc/html/TechNotes/MemoryPools.html for a full description - * of how they work, etc. - * - *------------------------------------------------------------------------- - */ - -#include "H5MPmodule.h" /* This source code file is part of the H5MP module */ - -/* Private headers */ -#include "H5private.h" /* Generic Functions */ -#include "H5Eprivate.h" /* Error handling */ -#include "H5MMprivate.h" /* Memory management */ -#include "H5MPpkg.h" /* Memory Pools */ - -/****************/ -/* Local Macros */ -/****************/ - -/* Minimum sized block */ -#define H5MP_MIN_BLOCK (H5MP_BLOCK_ALIGN(sizeof(H5MP_page_blk_t)) + H5MP_BLOCK_ALIGNMENT) - -/* First block in page */ -#define H5MP_PAGE_FIRST_BLOCK(p) \ - (H5MP_page_blk_t *)((void *)((unsigned char *)(p) + H5MP_BLOCK_ALIGN(sizeof(H5MP_page_t)))) - -/******************/ -/* Local Typedefs */ -/******************/ - -/********************/ -/* Local Prototypes */ -/********************/ - -/********************************/ -/* Package Variable Definitions */ -/********************************/ - -/********************/ -/* Static Variables */ -/********************/ - -/* Declare a free list to manage the H5MP_pool_t struct */ -H5FL_DEFINE(H5MP_pool_t); - -/*------------------------------------------------------------------------- - * Function: H5MP_create - * - * Purpose: Create a new memory pool - * - * Return: Pointer to the memory pool "header" on success/NULL on failure - * - * Programmer: Quincey Koziol - * May 2 2005 - * - *------------------------------------------------------------------------- - */ -H5MP_pool_t * -H5MP_create(size_t page_size, unsigned flags) -{ - H5MP_pool_t *mp = NULL; /* New memory pool header */ - H5MP_pool_t *ret_value = NULL; /* Return value */ - - FUNC_ENTER_NOAPI(NULL) - - /* Allocate space for the pool header */ - if (NULL == (mp = H5FL_MALLOC(H5MP_pool_t))) - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for memory pool header") - - /* Assign information */ - mp->page_size = H5MP_BLOCK_ALIGN(page_size); - mp->flags = flags; - - /* Initialize information */ - mp->free_size = 0; - mp->first = NULL; - mp->max_size = mp->page_size - H5MP_BLOCK_ALIGN(sizeof(H5MP_page_t)); - - /* Create factory for pool pages */ - if (NULL == (mp->page_fac = H5FL_fac_init(page_size))) - HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, NULL, "can't create page factory") - - /* Set return value */ - ret_value = mp; - -done: - if (NULL == ret_value && mp) - if (H5MP_close(mp) < 0) - HDONE_ERROR(H5E_RESOURCE, H5E_CANTFREE, NULL, "unable to free memory pool header") - - FUNC_LEAVE_NOAPI(ret_value) -} /* end H5MP_create() */ - -/*------------------------------------------------------------------------- - * Function: H5MP__new_page - * - * Purpose: Allocate new page for a memory pool - * - * Return: Pointer to the page allocated on success/NULL on failure - * - * Programmer: Quincey Koziol - * May 4 2005 - * - *------------------------------------------------------------------------- - */ -static H5MP_page_t * -H5MP__new_page(H5MP_pool_t *mp, size_t page_size) -{ - H5MP_page_t * new_page; /* New page created */ - H5MP_page_blk_t *first_blk; /* Pointer to first block in page */ - H5MP_page_t * ret_value = NULL; /* Return value */ - - FUNC_ENTER_STATIC - - /* Sanity check */ - HDassert(mp); - HDassert(page_size >= mp->page_size); - - /* Allocate page */ - if (page_size > mp->page_size) { - if (NULL == (new_page = (H5MP_page_t *)H5MM_malloc(page_size))) - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for page") - new_page->free_size = page_size - H5MP_BLOCK_ALIGN(sizeof(H5MP_page_t)); - new_page->fac_alloc = FALSE; - } /* end if */ - else { - if (NULL == (new_page = (H5MP_page_t *)H5FL_FAC_MALLOC(mp->page_fac))) - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for page") - new_page->free_size = mp->max_size; - new_page->fac_alloc = TRUE; - } /* end else */ - - /* Initialize page information */ - first_blk = H5MP_PAGE_FIRST_BLOCK(new_page); - first_blk->size = new_page->free_size; - first_blk->page = new_page; - first_blk->is_free = TRUE; - first_blk->prev = NULL; - first_blk->next = NULL; - - /* Insert into page list */ - new_page->prev = NULL; - new_page->next = mp->first; - if (mp->first) - mp->first->prev = new_page; - mp->first = new_page; - - /* Account for new free space */ - new_page->free_blk = first_blk; - mp->free_size += new_page->free_size; - - /* Assign return value */ - ret_value = new_page; - -done: - FUNC_LEAVE_NOAPI(ret_value) -} /* end H5MP__new_page() */ - -/*------------------------------------------------------------------------- - * Function: H5MP_malloc - * - * Purpose: Allocate space in a memory pool - * - * Return: Pointer to the space allocated on success/NULL on failure - * - * Programmer: Quincey Koziol - * May 2 2005 - * - *------------------------------------------------------------------------- - */ -void * -H5MP_malloc(H5MP_pool_t *mp, size_t request) -{ - H5MP_page_t * alloc_page = NULL; /* Page to allocate space from */ - H5MP_page_blk_t *alloc_free; /* Pointer to free space in page */ - size_t needed; /* Size requested, plus block header and alignment */ - void * ret_value = NULL; /* Return value */ - - FUNC_ENTER_NOAPI(NULL) - - /* Sanity check */ - HDassert(mp); - HDassert(request > 0); - - /* Compute actual size needed */ - needed = H5MP_BLOCK_ALIGN(request) + H5MP_BLOCK_ALIGN(sizeof(H5MP_page_blk_t)); - - /* See if the request can be handled by existing free space */ - if (needed <= mp->free_size) { - size_t pool_free_avail; /* Amount of free space possibly available in pool */ - - /* Locate page with enough free space */ - alloc_page = mp->first; - pool_free_avail = mp->free_size; - while (alloc_page && pool_free_avail >= needed) { - /* If we found a page with enough free space, search for large - * enough free block on that page */ - if (alloc_page->free_size >= needed) { - size_t page_free_avail; /* Amount of free space possibly available */ - - /* Locate large enough block */ - alloc_free = alloc_page->free_blk; - page_free_avail = alloc_page->free_size; - while (alloc_free && page_free_avail >= needed) { - if (alloc_free->is_free) { - /* If we found a large enough block, leave now */ - if (alloc_free->size >= needed) - goto found; /* Needed to escape double "while" loop */ - - /* Decrement amount of potential space left */ - page_free_avail -= alloc_free->size; - } /* end if */ - - /* Go to next block */ - alloc_free = alloc_free->next; - } /* end while */ - } /* end if */ - - /* Decrement amount of potential space left */ - pool_free_avail -= alloc_page->free_size; - - /* Go to next page */ - alloc_page = alloc_page->next; - } /* end while */ - } /* end if */ - - { - size_t page_size; /* Size of page needed */ - - /* Check if the request is too large for a standard page */ - page_size = - (needed > mp->max_size) ? (needed + H5MP_BLOCK_ALIGN(sizeof(H5MP_page_t))) : mp->page_size; - - /* Allocate new page */ - if (NULL == (alloc_page = H5MP__new_page(mp, page_size))) - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for page") - - /* Set the block to allocate from */ - alloc_free = alloc_page->free_blk; - } /* end block */ - - /* Allocate space in page */ -found: - - /* Sanity check */ - HDassert(alloc_page); - HDassert(alloc_free); - - /* Check if we can subdivide the free space */ - if (alloc_free->size > (needed + H5MP_MIN_BLOCK)) { - H5MP_page_blk_t *new_free; /* New free block created */ - - /* Carve out new free block after block to allocate */ - new_free = (H5MP_page_blk_t *)((void *)(((unsigned char *)alloc_free) + needed)); - - /* Link into existing lists */ - new_free->next = alloc_free->next; - if (alloc_free->next) - alloc_free->next->prev = new_free; - new_free->prev = alloc_free; - alloc_free->next = new_free; - - /* Set blocks' information */ - new_free->size = alloc_free->size - needed; - new_free->is_free = TRUE; - new_free->page = alloc_free->page; - alloc_free->size = needed; - alloc_free->is_free = FALSE; - } /* end if */ - else { - /* Use whole free space block for new block */ - alloc_free->is_free = FALSE; - } /* end else */ - - /* Update page & pool's free size information */ - alloc_page->free_size -= alloc_free->size; - if (alloc_page->free_blk == alloc_free) - alloc_page->free_blk = alloc_free->next; - mp->free_size -= alloc_free->size; - - /* Set new space pointer for the return value */ - ret_value = ((unsigned char *)alloc_free) + H5MP_BLOCK_ALIGN(sizeof(H5MP_page_blk_t)); - -done: - FUNC_LEAVE_NOAPI(ret_value) -} /* end H5MP_malloc() */ - -/*------------------------------------------------------------------------- - * Function: H5MP_free - * - * Purpose: Release space in a memory pool - * - * Return: NULL on success/NULL on failure - * - * Programmer: Quincey Koziol - * May 3 2005 - * - * Note: Should we release pages that have no used blocks? - * - *------------------------------------------------------------------------- - */ -void * -H5MP_free(H5MP_pool_t *mp, void *spc) -{ - H5MP_page_blk_t *spc_blk; /* Block for space to free */ - H5MP_page_t * spc_page; /* Page containing block to free */ - void * ret_value = NULL; /* Return value */ - - FUNC_ENTER_NOAPI_NOINIT_NOERR - - /* Sanity check */ - HDassert(mp); - HDassert(spc); - - /* Get block header for space to free */ - spc_blk = - (H5MP_page_blk_t *)((void *)(((unsigned char *)spc) - H5MP_BLOCK_ALIGN(sizeof(H5MP_page_blk_t)))); - - /* Mark block as free */ - HDassert(spc_blk->is_free == FALSE); - spc_blk->is_free = TRUE; - - /* Add it's space to the amount of free space in the page & pool */ - spc_page = spc_blk->page; - spc_page->free_size += spc_blk->size; - mp->free_size += spc_blk->size; - - /* Move page with newly freed space to front of list of pages in pool */ - if (spc_page != mp->first) { - /* Remove page from list */ - spc_page->prev->next = spc_page->next; - if (spc_page->next) - spc_page->next->prev = spc_page->prev; - - /* Insert page at beginning of list */ - spc_page->prev = NULL; - spc_page->next = mp->first; - mp->first->prev = spc_page; - mp->first = spc_page; - } /* end if */ - - /* Check if block can be merged with free space after it on page */ - if (spc_blk->next != NULL) { - H5MP_page_blk_t *next_blk; /* Block following space to free */ - - next_blk = spc_blk->next; - HDassert(next_blk->prev == spc_blk); - if (next_blk->is_free) { - spc_blk->size += next_blk->size; - spc_blk->next = next_blk->next; - } /* end if */ - } /* end if */ - - /* Check if block can be merged with free space before it on page */ - if (spc_blk->prev != NULL) { - H5MP_page_blk_t *prev_blk; /* Block before space to free */ - - prev_blk = spc_blk->prev; - HDassert(prev_blk->next == spc_blk); - if (prev_blk->is_free) { - prev_blk->size += spc_blk->size; - prev_blk->next = spc_blk->next; - } /* end if */ - } /* end if */ - - /* Check if the block freed becomes the first free block on the page */ - if (spc_page->free_blk == NULL || spc_blk < spc_page->free_blk) - spc_page->free_blk = spc_blk; - - FUNC_LEAVE_NOAPI(ret_value) -} /* end H5MP_free() */ - -/*------------------------------------------------------------------------- - * Function: H5MP_close - * - * Purpose: Release all memory for a pool and destroy pool - * - * Return: Non-negative on success/negative on failure - * - * Programmer: Quincey Koziol - * May 3 2005 - * - *------------------------------------------------------------------------- - */ -herr_t -H5MP_close(H5MP_pool_t *mp) -{ - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(FAIL) - - /* Release memory for pool pages */ - if (mp->first != NULL) { - H5MP_page_t *page, *next_page; /* Pointer to pages in pool */ - - /* Iterate through pages, releasing them */ - page = mp->first; - while (page) { - next_page = page->next; - - /* Free the page appropriately */ - if (page->fac_alloc) - page = (H5MP_page_t *)H5FL_FAC_FREE(mp->page_fac, page); - else - page = (H5MP_page_t *)H5MM_xfree(page); - - page = next_page; - } /* end while */ - } /* end if */ - - /* Release page factory */ - if (mp->page_fac) - if (H5FL_fac_term(mp->page_fac) < 0) - HGOTO_ERROR(H5E_RESOURCE, H5E_CANTRELEASE, FAIL, "can't destroy page factory") - -done: - /* Free the memory pool itself */ - mp = H5FL_FREE(H5MP_pool_t, mp); - - FUNC_LEAVE_NOAPI(ret_value) -} /* end H5MP_close() */ diff --git a/src/H5MPmodule.h b/src/H5MPmodule.h deleted file mode 100644 index 8e34598..0000000 --- a/src/H5MPmodule.h +++ /dev/null @@ -1,32 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * All rights reserved. * - * * - * This file is part of HDF5. The full HDF5 copyright notice, including * - * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * - * distribution tree, or in https://www.hdfgroup.org/licenses. * - * If you do not have access to either file, you may request a copy from * - * help@hdfgroup.org. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/* - * Programmer: Quincey Koziol - * Saturday, September 12, 2015 - * - * Purpose: This file contains declarations which define macros for the - * H5MP package. Including this header means that the source file - * is part of the H5MP package. - */ -#ifndef H5MPmodule_H -#define H5MPmodule_H - -/* Define the proper control macros for the generic FUNC_ENTER/LEAVE and error - * reporting macros. - */ -#define H5MP_MODULE -#define H5_MY_PKG H5MP -#define H5_MY_PKG_ERR H5E_RESOURCE -#define H5_MY_PKG_INIT NO - -#endif /* H5MPmodule_H */ diff --git a/src/H5MPpkg.h b/src/H5MPpkg.h deleted file mode 100644 index 64c5293..0000000 --- a/src/H5MPpkg.h +++ /dev/null @@ -1,99 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * Copyright by the Board of Trustees of the University of Illinois. * - * All rights reserved. * - * * - * This file is part of HDF5. The full HDF5 copyright notice, including * - * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * - * distribution tree, or in https://www.hdfgroup.org/licenses. * - * If you do not have access to either file, you may request a copy from * - * help@hdfgroup.org. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/* - * Programmer: Quincey Koziol - * Monday, May 2, 2005 - * - * Purpose: This file contains declarations which are visible only within - * the H5MP package. Source files outside the H5MP package should - * include H5MPprivate.h instead. - */ -#if !(defined H5MP_FRIEND || defined H5MP_MODULE) -#error "Do not include this file outside the H5MP package!" -#endif - -#ifndef H5MPpkg_H -#define H5MPpkg_H - -/* Get package's private header */ -#include "H5MPprivate.h" /* Memory Pools */ - -/* Other private headers needed by this file */ -#include "H5FLprivate.h" /* Free Lists */ - -/**************************/ -/* Package Private Macros */ -/**************************/ - -/* Alignment macros */ -/* (Ideas from Apache APR :-) */ - -/* Default alignment necessary */ -#define H5MP_BLOCK_ALIGNMENT 8 - -/* General alignment macro */ -/* (this only works for aligning to power of 2 boundary) */ -#define H5MP_ALIGN(x, a) (((x) + ((size_t)(a)) - 1) & ~(((size_t)(a)) - 1)) - -/* Default alignment */ -#define H5MP_BLOCK_ALIGN(x) H5MP_ALIGN(x, H5MP_BLOCK_ALIGNMENT) - -/****************************/ -/* Package Private Typedefs */ -/****************************/ - -/* Free block in pool */ -typedef struct H5MP_page_blk_t { - size_t size; /* Size of block (includes this H5MP_page_blk_t info) */ - unsigned is_free : 1; /* Flag to indicate the block is free */ - struct H5MP_page_t * page; /* Pointer to page block is located in */ - struct H5MP_page_blk_t *prev; /* Pointer to previous block in page */ - struct H5MP_page_blk_t *next; /* Pointer to next block in page */ -} H5MP_page_blk_t; - -/* Memory pool page */ -typedef struct H5MP_page_t { - size_t free_size; /* Total amount of free space in page */ - unsigned fac_alloc : 1; /* Flag to indicate the page was allocated by the pool's factory */ - H5MP_page_blk_t * free_blk; /* Pointer to first free block in page */ - struct H5MP_page_t *next; /* Pointer to next page in pool */ - struct H5MP_page_t *prev; /* Pointer to previous page in pool */ -} H5MP_page_t; - -/* Memory pool header */ -struct H5MP_pool_t { - H5FL_fac_head_t *page_fac; /* Free-list factory for pages */ - size_t page_size; /* Page size for pool */ - size_t free_size; /* Total amount of free space in pool */ - size_t max_size; /* Maximum block that will fit in a standard page */ - H5MP_page_t * first; /* Pointer to first page in pool */ - unsigned flags; /* Bit flags for pool settings */ -}; - -/*****************************************/ -/* Package Private Variable Declarations */ -/*****************************************/ - -/******************************/ -/* Package Private Prototypes */ -/******************************/ -#ifdef H5MP_TESTING -H5_DLL herr_t H5MP_get_pool_free_size(const H5MP_pool_t *mp, size_t *free_size); -H5_DLL htri_t H5MP_pool_is_free_size_correct(const H5MP_pool_t *mp); -H5_DLL herr_t H5MP_get_pool_first_page(const H5MP_pool_t *mp, H5MP_page_t **page); -H5_DLL herr_t H5MP_get_page_free_size(const H5MP_page_t *mp, size_t *page); -H5_DLL herr_t H5MP_get_page_next_page(const H5MP_page_t *page, H5MP_page_t **next_page); -#endif /* H5MP_TESTING */ - -#endif /* H5MPpkg_H */ diff --git a/src/H5MPprivate.h b/src/H5MPprivate.h deleted file mode 100644 index 2b06650..0000000 --- a/src/H5MPprivate.h +++ /dev/null @@ -1,57 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * Copyright by the Board of Trustees of the University of Illinois. * - * All rights reserved. * - * * - * This file is part of HDF5. The full HDF5 copyright notice, including * - * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * - * distribution tree, or in https://www.hdfgroup.org/licenses. * - * If you do not have access to either file, you may request a copy from * - * help@hdfgroup.org. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/*------------------------------------------------------------------------- - * - * Created: H5MPprivate.h - * May 2 2005 - * Quincey Koziol - * - * Purpose: Private header for memory pool routines. - * - *------------------------------------------------------------------------- - */ - -#ifndef H5MPprivate_H -#define H5MPprivate_H - -/* Include package's public header (not yet) */ -/* #include "H5MPpublic.h" */ - -/* Private headers needed by this file */ - -/**************************/ -/* Library Private Macros */ -/**************************/ - -/* Pool creation flags */ -/* Default settings */ -#define H5MP_FLG_DEFAULT 0 -#define H5MP_PAGE_SIZE_DEFAULT 4096 /* (bytes) */ - -/****************************/ -/* Library Private Typedefs */ -/****************************/ - -/* Memory pool header (defined in H5MPpkg.c) */ -typedef struct H5MP_pool_t H5MP_pool_t; - -/***************************************/ -/* Library-private Function Prototypes */ -/***************************************/ -H5_DLL H5MP_pool_t *H5MP_create(size_t page_size, unsigned flags); -H5_DLL void * H5MP_malloc(H5MP_pool_t *mp, size_t request); -H5_DLL void * H5MP_free(H5MP_pool_t *mp, void *spc); -H5_DLL herr_t H5MP_close(H5MP_pool_t *mp); - -#endif /* H5MPprivate_H */ diff --git a/src/H5MPtest.c b/src/H5MPtest.c deleted file mode 100644 index 27e7bbe..0000000 --- a/src/H5MPtest.c +++ /dev/null @@ -1,213 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * Copyright by the Board of Trustees of the University of Illinois. * - * All rights reserved. * - * * - * This file is part of HDF5. The full HDF5 copyright notice, including * - * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * - * distribution tree, or in https://www.hdfgroup.org/licenses. * - * If you do not have access to either file, you may request a copy from * - * help@hdfgroup.org. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/* Programmer: Quincey Koziol - * Tuesday, May 3, 2005 - * - * Purpose: Memory pool testing functions. - */ - -#include "H5MPmodule.h" /* This source code file is part of the H5MP module */ -#define H5MP_TESTING /*include H5MP testing funcs*/ - -/* Private headers */ -#include "H5private.h" /* Generic Functions */ -#include "H5MPpkg.h" /* Memory Pools */ -#include "H5Eprivate.h" /* Error handling */ - -/* Static Prototypes */ - -/* Package variables */ - -/*------------------------------------------------------------------------- - * Function: H5MP_get_pool_free_size - * - * Purpose: Retrieve the total amount of free space in entire pool - * - * Return: Success: non-negative - * - * Failure: negative - * - * Programmer: Quincey Koziol - * Tuesday, May 3, 2005 - * - *------------------------------------------------------------------------- - */ -herr_t -H5MP_get_pool_free_size(const H5MP_pool_t *mp, size_t *free_size) -{ - FUNC_ENTER_NOAPI_NOINIT_NOERR - - /* Check arguments. */ - HDassert(mp); - HDassert(free_size); - - /* Get memory pool's free space */ - *free_size = mp->free_size; - - FUNC_LEAVE_NOAPI(SUCCEED) -} /* H5MP_get_pool_free_size() */ - -/*------------------------------------------------------------------------- - * Function: H5MP_get_pool_first_page - * - * Purpose: Retrieve the first page in a memory pool - * - * Return: Success: non-negative - * - * Failure: negative - * - * Programmer: Quincey Koziol - * Tuesday, May 3, 2005 - * - *------------------------------------------------------------------------- - */ -herr_t -H5MP_get_pool_first_page(const H5MP_pool_t *mp, H5MP_page_t **page) -{ - FUNC_ENTER_NOAPI_NOINIT_NOERR - - /* Check arguments. */ - HDassert(mp); - HDassert(page); - - /* Get memory pool's first page */ - *page = mp->first; - - FUNC_LEAVE_NOAPI(SUCCEED) -} /* H5MP_get_pool_first_page() */ - -/*------------------------------------------------------------------------- - * Function: H5MP_pool_is_free_size_correct - * - * Purpose: Check that the free space reported in each page corresponds - * to the free size in each page and that the free space in the - * free blocks for a page corresponds with the free space for - * the page. - * - * Return: Success: non-negative - * - * Failure: negative - * - * Programmer: Quincey Koziol - * Wednesday, May 3, 2005 - * - *------------------------------------------------------------------------- - */ -htri_t -H5MP_pool_is_free_size_correct(const H5MP_pool_t *mp) -{ - H5MP_page_t *page; /* Pointer to current page */ - size_t pool_free; /* Size of pages' free space */ - htri_t ret_value = TRUE; /* Return value */ - - FUNC_ENTER_NOAPI_NOINIT_NOERR - - /* Check arguments. */ - HDassert(mp); - - /* Iterate through pages, checking the free size & accumulating the - * free space for all the pages */ - page = mp->first; - pool_free = 0; - while (page != NULL) { - H5MP_page_blk_t *blk; /* Pointer to current free block */ - size_t page_free; /* Size of blocks on free list */ - - /* Iterate through the blocks in page, accumulating free space */ - blk = (H5MP_page_blk_t *)((void *)((unsigned char *)page + H5MP_BLOCK_ALIGN(sizeof(H5MP_page_t)))); - page_free = 0; - while (blk != NULL) { - if (blk->is_free) - page_free += blk->size; - blk = blk->next; - } /* end while */ - - /* Check that the free space from the blocks on the free list - * corresponds to space in page */ - if (page_free != page->free_size) - HGOTO_DONE(FALSE) - - /* Increment the amount of free space in pool */ - pool_free += page->free_size; - - /* Advance to next page */ - page = page->next; - } /* end while */ - - /* Check that the free space from the pages - * corresponds to free space in pool */ - if (pool_free != mp->free_size) - HGOTO_DONE(FALSE) - -done: - FUNC_LEAVE_NOAPI(ret_value) -} /* H5MP_pool_is_free_size_correct() */ - -/*------------------------------------------------------------------------- - * Function: H5MP_get_page_free_size - * - * Purpose: Retrieve the amount of free space in given page - * - * Return: Success: non-negative - * - * Failure: negative - * - * Programmer: Quincey Koziol - * Tuesday, May 3, 2005 - * - *------------------------------------------------------------------------- - */ -herr_t -H5MP_get_page_free_size(const H5MP_page_t *page, size_t *free_size) -{ - FUNC_ENTER_NOAPI_NOINIT_NOERR - - /* Check arguments. */ - HDassert(page); - HDassert(free_size); - - /* Get memory page's free space */ - *free_size = page->free_size; - - FUNC_LEAVE_NOAPI(SUCCEED) -} /* H5MP_get_page_free_size() */ - -/*------------------------------------------------------------------------- - * Function: H5MP_get_page_next_page - * - * Purpose: Retrieve the next page in the pool - * - * Return: Success: non-negative - * - * Failure: negative - * - * Programmer: Quincey Koziol - * Tuesday, May 3, 2005 - * - *------------------------------------------------------------------------- - */ -herr_t -H5MP_get_page_next_page(const H5MP_page_t *page, H5MP_page_t **next_page) -{ - FUNC_ENTER_NOAPI_NOINIT_NOERR - - /* Check arguments. */ - HDassert(page); - HDassert(next_page); - - /* Get next memory page */ - *next_page = page->next; - - FUNC_LEAVE_NOAPI(SUCCEED) -} /* H5MP_get_page_next_page() */ diff --git a/src/H5PBprivate.h b/src/H5PBprivate.h index c23336e..ad59150 100644 --- a/src/H5PBprivate.h +++ b/src/H5PBprivate.h @@ -24,10 +24,6 @@ #ifndef H5PBprivate_H #define H5PBprivate_H -/* Include package's public header */ - -/* no H5PBpublic.h at present */ - /* Private headers needed by this header */ #include "H5private.h" /* Generic Functions */ diff --git a/src/H5Spublic.h b/src/H5Spublic.h index 30ca813..536f290 100644 --- a/src/H5Spublic.h +++ b/src/H5Spublic.h @@ -171,7 +171,7 @@ H5_DLL herr_t H5Sclose(hid_t space_id); * composing the entire current extent). If either \p stride or * \p block is NULL, then it will be set to \p 1. * - * \since 1.12.0 + * \since 1.10.6 * */ H5_DLL hid_t H5Scombine_hyperslab(hid_t space_id, H5S_seloper_t op, const hsize_t start[], @@ -194,7 +194,7 @@ H5_DLL hid_t H5Scombine_hyperslab(hid_t space_id, H5S_seloper_t op, const hsize_ * from \p space1_id is copied for the dataspace extent of the * newly created dataspace. * - * \since 1.12.0 + * \since 1.10.6 * */ H5_DLL hid_t H5Scombine_select(hid_t space1_id, H5S_seloper_t op, hid_t space2_id); @@ -795,7 +795,7 @@ H5_DLL htri_t H5Sis_simple(hid_t space_id); * \p space2_id. The first selection is modified to contain the * result of \p space1_id operated on by \p space2_id. * - * \since 1.12.0 + * \since 1.10.6 * */ H5_DLL herr_t H5Smodify_select(hid_t space1_id, H5S_seloper_t op, hid_t space2_id); @@ -940,7 +940,7 @@ H5_DLL herr_t H5Ssel_iter_reset(hid_t sel_iter_id, hid_t space_id); * * \note This can be useful for VOL developers to implement chunked datasets. * - * \since 1.12.0 + * \since 1.10.6 */ H5_DLL herr_t H5Sselect_adjust(hid_t spaceid, const hssize_t *offset); /** @@ -977,7 +977,7 @@ H5_DLL herr_t H5Sselect_all(hid_t spaceid); * offset) from the source dataspace \p src_id to the destination * dataspace \p dst_id. * - * \since 1.12.0 + * \since 1.10.6 * */ H5_DLL herr_t H5Sselect_copy(hid_t dst_id, hid_t src_id); @@ -1205,7 +1205,7 @@ H5_DLL herr_t H5Sselect_hyperslab(hid_t space_id, H5S_seloper_t op, const hsize_ * \note Assumes that \p start & \p end block bounds are inclusive, so * \p start == \p end value is OK. * - * \since 1.12.0 + * \since 1.10.6 * */ H5_DLL htri_t H5Sselect_intersect_block(hid_t space_id, const hsize_t *start, const hsize_t *end); @@ -1244,7 +1244,7 @@ H5_DLL herr_t H5Sselect_none(hid_t spaceid); * into a third selection.This can be useful for VOL developers to * implement chunked or virtual datasets. * - * \since 1.12.0 + * \since 1.10.6 * */ H5_DLL hid_t H5Sselect_project_intersection(hid_t src_space_id, hid_t dst_space_id, @@ -1265,7 +1265,7 @@ H5_DLL hid_t H5Sselect_project_intersection(hid_t src_space_id, hid_t dst_space_ * This is primarily used for reading the entire selection in * one swoop. * - * \since 1.12.0 + * \since 1.10.6 * */ H5_DLL htri_t H5Sselect_shape_same(hid_t space1_id, hid_t space2_id); diff --git a/src/H5TSprivate.h b/src/H5TSprivate.h index 3150f59..5d69854 100644 --- a/src/H5TSprivate.h +++ b/src/H5TSprivate.h @@ -13,11 +13,9 @@ /*------------------------------------------------------------------------- * - * Created: H5TSprivate.h - * May 2 2000 - * Chee Wai LEE + * Created: H5TSprivate.h * - * Purpose: Private non-prototype header. + * Purpose: Thread-safety abstractions used by the library * *------------------------------------------------------------------------- */ diff --git a/src/H5module.h b/src/H5module.h index 6d3cba8..f7d3cd6 100644 --- a/src/H5module.h +++ b/src/H5module.h @@ -11,9 +11,9 @@ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* - * Purpose: This file contains declarations which define macros for the - * H5 package. Including this header means that the source file - * is part of the H5 package. + * Purpose: This file contains declarations which define macros for the + * H5 package. Including this header means that the source file + * is part of the H5 package. */ #ifndef H5module_H #define H5module_H diff --git a/src/H5private.h b/src/H5private.h index bee2afc..b9bbe3b 100644 --- a/src/H5private.h +++ b/src/H5private.h @@ -1330,6 +1330,9 @@ H5_DLL H5_ATTR_CONST int Nflock(int fd, int operation); #ifndef HDsigsetjmp #define HDsigsetjmp(J, N) sigsetjmp(J, N) #endif +#ifndef HDsigtimedwait +#define HDsigtimedwait(S, I, T) sigtimedwait(S, I, T) +#endif #ifndef HDsigsuspend #define HDsigsuspend(S) sigsuspend(S) #endif @@ -1408,6 +1411,9 @@ H5_DLL H5_ATTR_CONST int Nflock(int fd, int operation); #ifndef HDstrrchr #define HDstrrchr(S, C) strrchr(S, C) #endif +#ifndef HDstrsignal +#define HDstrsignal(S) strsignal(S) +#endif #ifndef HDstrspn #define HDstrspn(X, Y) strspn(X, Y) #endif diff --git a/src/Makefile.am b/src/Makefile.am index f39afc7..931d335 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -75,13 +75,12 @@ libhdf5_la_SOURCES= H5.c H5checksum.c H5dbg.c H5lib_settings.c H5system.c \ H5HFspace.c H5HFstat.c H5HFtest.c H5HFtiny.c \ H5HG.c H5HGcache.c H5HGdbg.c H5HGquery.c \ H5HL.c H5HLcache.c H5HLdbg.c H5HLint.c H5HLprfx.c H5HLdblk.c \ - H5HP.c \ H5I.c H5Idbg.c H5Iint.c H5Itest.c \ H5L.c H5Ldeprec.c H5Lexternal.c H5Lint.c \ H5M.c \ H5MF.c H5MFaggr.c H5MFdbg.c H5MFsection.c \ + H5MM.c \ H5MV.c H5MVsection.c \ - H5MM.c H5MP.c H5MPtest.c \ H5O.c H5Odeprec.c H5Oainfo.c H5Oalloc.c H5Oattr.c H5Oattribute.c \ H5Obogus.c H5Obtreek.c H5Ocache.c H5Ocache_image.c H5Ochunk.c \ H5Ocont.c H5Ocopy.c H5Ocopy_ref.c H5Odbg.c H5Odrvinfo.c H5Odtype.c \ |