From 9437a2686563bda04c9dda9e6c09bb527fe63dd0 Mon Sep 17 00:00:00 2001 From: cvs2svn Date: Thu, 8 Jul 2004 21:06:32 -0500 Subject: [svn-r8845] This commit was manufactured by cvs2svn to create branch 'hdf5_1_6'. --- src/H5Cpublic.h | 40 +++++++++++++++++ src/H5RC.c | 129 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/H5RCprivate.h | 62 ++++++++++++++++++++++++++ 3 files changed, 231 insertions(+) create mode 100644 src/H5Cpublic.h create mode 100644 src/H5RC.c create mode 100644 src/H5RCprivate.h diff --git a/src/H5Cpublic.h b/src/H5Cpublic.h new file mode 100644 index 0000000..d4e82be --- /dev/null +++ b/src/H5Cpublic.h @@ -0,0 +1,40 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdf.ncsa.uiuc.edu/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from hdfhelp@ncsa.uiuc.edu. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/*------------------------------------------------------------------------- + * + * Created: H5Cproto.h + * June 4, 2005 + * John Mainzer + * + * Purpose: Public include file for cache functions. + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +#ifndef _H5Cpublic_H +#define _H5Cpublic_H + +/* Public headers needed by this file */ +#include "H5public.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/H5RC.c b/src/H5RC.c new file mode 100644 index 0000000..8ab1818 --- /dev/null +++ b/src/H5RC.c @@ -0,0 +1,129 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdf.ncsa.uiuc.edu/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from hdfhelp@ncsa.uiuc.edu. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * Reference counting buffer algorithms. + * + * These are used for various internal buffers which are shared. + * + */ + +/* Pablo information */ +/* (Put before include files to avoid problems with inline functions) */ +#define PABLO_MASK H5RC_mask + +#include "H5Eprivate.h" /* Error handling */ +#include "H5FLprivate.h" /* Free lists */ +#include "H5RCprivate.h" /* Reference-counted buffers */ + +/* Private typedefs & structs */ + +/* Declare a free list to manage the H5RC_t struct */ +H5FL_DEFINE_STATIC(H5RC_t); + + +/*-------------------------------------------------------------------------- + NAME + H5RC_create + PURPOSE + Create a reference counted object + USAGE + H5RC_t *H5RC_create(o,free) + const void *o; IN: Object to initialize ref-counted object with + H5RC_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 +--------------------------------------------------------------------------*/ +H5RC_t * +H5RC_create(void *o, H5RC_free_func_t free_func) +{ + H5RC_t *ret_value=NULL; /* Return value */ + + FUNC_ENTER_NOAPI(H5RC_create,NULL); + + /* Sanity check */ + HDassert(o); + HDassert(free_func); + + /* Allocate ref-counted string structure */ + if((ret_value=H5FL_MALLOC(H5RC_t))==NULL) + 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 H5RC_create() */ + + +/*-------------------------------------------------------------------------- + NAME + H5RC_decr + PURPOSE + Decrement the reference count for a ref-counted object + USAGE + herr_t H5RC_decr(rc) + H5RC_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 +H5RC_decr(H5RC_t *rc) +{ + herr_t ret_value=SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI(H5RC_decr,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) { + H5FL_FREE(H5RC_t,rc); + HGOTO_ERROR(H5E_RS,H5E_CANTFREE,FAIL,"memory release failed"); + } /* end if */ + H5FL_FREE(H5RC_t,rc); + } /* end if */ + +done: + FUNC_LEAVE_NOAPI(ret_value); +} /* end H5RC_decr() */ + diff --git a/src/H5RCprivate.h b/src/H5RCprivate.h new file mode 100644 index 0000000..7f1dc3a --- /dev/null +++ b/src/H5RCprivate.h @@ -0,0 +1,62 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdf.ncsa.uiuc.edu/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from hdfhelp@ncsa.uiuc.edu. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * This file contains private information about the H5RC module + */ +#ifndef _H5RCprivate_H +#define _H5RCprivate_H + +/**************************************/ +/* Public headers needed by this file */ +/**************************************/ +#ifdef LATER +#include "H5RCpublic.h" +#endif /* LATER */ + +/***************************************/ +/* Private headers needed by this file */ +/***************************************/ +#include "H5private.h" + +/************/ +/* Typedefs */ +/************/ + +/* Typedef for function to release object when reference count drops to zero */ +typedef herr_t (*H5RC_free_func_t)(void *o); + +/* Typedef for reference counted objects */ +typedef struct H5RC_t { + void *o; /* Object to be reference counted */ + size_t n; /* Reference count of number of pointers sharing object */ + H5RC_free_func_t free_func; /* Function to free object */ +} H5RC_t; + +/**********/ +/* Macros */ +/**********/ +#define H5RC_INC(rc) ((rc)->n++) +#define H5RC_DEC(rc) (H5RC_decr(rc)) +#define H5RC_GET_OBJ(rc) ((rc)->o) + +/********************/ +/* Private routines */ +/********************/ +H5_DLL H5RC_t *H5RC_create(void *s, H5RC_free_func_t free_func); +H5_DLL herr_t H5RC_decr(H5RC_t *rc); + +#endif /* _H5RSprivate_H */ + + -- cgit v0.12