hdf5/src/H5UC.c
Larry Knox 89fbe00dec Merge pull request #426 in HDFFV/hdf5 from ~LRKNOX/hdf5_lrk:hdf5_1_10 to hdf5_1_10
* commit '54957d37f5aa73912763dbb6e308555e863c43f4':
  Commit copyright header change for src/H5PLpkg.c which was added after running script to make changes.
  Add new files in release_docs to MANIFEST. Cimmit changes to Makefile.in(s) and H5PL.c that resulted from running autogen.sh.
  Merge pull request #407 in HDFFV/hdf5 from ~LRKNOX/hdf5_lrk:hdf5_1_10_1 to hdf5_1_10_1
  Change copyright headers to replace url referring to file to be removed and replace it with new url for COPYING file.
2017-04-25 16:05:36 -05:00

129 lines
4.0 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* 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://support.hdfgroup.org/ftp/HDF5/releases. *
* If you do not have access to either file, you may request a copy from *
* help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
* Reference counting buffer algorithms.
*
* These are used for various internal buffers which are shared.
*
* The module used to be H5RC, but changed to H5UC because of
* conflicting requirement for the use of H5RC.
*
*/
#include "H5Eprivate.h" /* Error handling */
#include "H5FLprivate.h" /* Free lists */
#include "H5UCprivate.h" /* Reference-counted buffers */
/* Private typedefs & structs */
/* Declare a free list to manage the H5UC_t struct */
H5FL_DEFINE_STATIC(H5UC_t);
/*--------------------------------------------------------------------------
NAME
H5UC_create
PURPOSE
Create a reference counted object
USAGE
H5UC_t *H5UC_create(o,free)
const void *o; IN: Object to initialize ref-counted object with
H5UC_free_func_t free; IN: Function to call when ref-count drop to zero
RETURNS
Returns a pointer to a new ref-counted object on success, NULL on failure.
DESCRIPTION
Create a reference counted object. The object is not duplicated, it is
assumed to be owned by the reference counted object now and will be freed
with the 'free' function when the reference count drops to zero.
GLOBAL VARIABLES
COMMENTS, BUGS, ASSUMPTIONS
EXAMPLES
REVISION LOG
--------------------------------------------------------------------------*/
H5UC_t *
H5UC_create(void *o, H5UC_free_func_t free_func)
{
H5UC_t *ret_value; /* Return value */
FUNC_ENTER_NOAPI(NULL)
/* Sanity check */
HDassert(o);
HDassert(free_func);
/* Allocate ref-counted string structure */
if(NULL == (ret_value = H5FL_MALLOC(H5UC_t)))
HGOTO_ERROR(H5E_RS,H5E_NOSPACE,NULL,"memory allocation failed")
/* Set the internal fields */
ret_value->o = o;
ret_value->n = 1;
ret_value->free_func = free_func;
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5UC_create() */
/*--------------------------------------------------------------------------
NAME
H5UC_decr
PURPOSE
Decrement the reference count for a ref-counted object
USAGE
herr_t H5UC_decr(rc)
H5UC_t *rc; IN: Ref-counted object to decrement count for
RETURNS
SUCCEED/FAIL
DESCRIPTION
Decrements the reference count for a ref-counted object, calling the
object's free function if ref-count drops to zero.
GLOBAL VARIABLES
COMMENTS, BUGS, ASSUMPTIONS
EXAMPLES
REVISION LOG
--------------------------------------------------------------------------*/
herr_t
H5UC_decr(H5UC_t *rc)
{
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_NOAPI(FAIL)
/* Sanity check */
HDassert(rc);
HDassert(rc->o);
HDassert(rc->n > 0);
HDassert(rc->free_func);
/* Decrement reference count */
rc->n--;
/* Check if we should delete this object now */
if(rc->n == 0) {
if((rc->free_func)(rc->o) < 0) {
rc = H5FL_FREE(H5UC_t, rc);
HGOTO_ERROR(H5E_RS, H5E_CANTFREE, FAIL, "memory release failed")
} /* end if */
rc = H5FL_FREE(H5UC_t, rc);
} /* end if */
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5UC_decr() */