summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorQuincey Koziol <koziol@hdfgroup.org>2004-07-09 02:06:32 (GMT)
committerQuincey Koziol <koziol@hdfgroup.org>2004-07-09 02:06:32 (GMT)
commit6beaf50c8fc861e99b46500b4dc7f606e8f72ffb (patch)
treef718fce63e96ad19d5cb8aea628a4c4755918aa0
parent9437a2686563bda04c9dda9e6c09bb527fe63dd0 (diff)
downloadhdf5-6beaf50c8fc861e99b46500b4dc7f606e8f72ffb.zip
hdf5-6beaf50c8fc861e99b46500b4dc7f606e8f72ffb.tar.gz
hdf5-6beaf50c8fc861e99b46500b4dc7f606e8f72ffb.tar.bz2
[svn-r8846] Purpose:
Bug fix Description: The "shared" raw B-tree node can get freed before all the B-tree nodes had been flushed out to disk and released by the cache. Solution: Implement a simple reference counting wrapper for objects in the library and use it to hold the shared raw B-tree nodes so they aren't freed before all references to them in memory are released. Platforms tested: Solaris 2.7 (arabica) FreeBSD 4.10 (sleipnir) IRIX64 6.5 (modei4)
-rw-r--r--MANIFEST2
-rw-r--r--src/H5B.c10
-rw-r--r--src/H5Bpkg.h2
-rw-r--r--src/H5Distore.c44
-rw-r--r--src/H5F.c14
-rw-r--r--src/H5Fpkg.h3
-rw-r--r--src/H5Fprivate.h7
-rw-r--r--src/H5G.c24
-rw-r--r--src/H5Gnode.c46
-rw-r--r--src/H5Oprivate.h3
-rw-r--r--src/H5RC.c4
-rw-r--r--src/Makefile.in16
12 files changed, 132 insertions, 43 deletions
diff --git a/MANIFEST b/MANIFEST
index 5b200b4..d8426a8 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -949,6 +949,8 @@
./src/H5R.c
./src/H5Rprivate.h
./src/H5Rpublic.h
+./src/H5RC.c
+./src/H5RCprivate.h
./src/H5RS.c
./src/H5RSprivate.h
./src/H5S.c
diff --git a/src/H5B.c b/src/H5B.c
index f28701a..a795927 100644
--- a/src/H5B.c
+++ b/src/H5B.c
@@ -243,8 +243,9 @@ H5B_create(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, void *udata,
bt->left = HADDR_UNDEF;
bt->right = HADDR_UNDEF;
bt->nchildren = 0;
- if((bt->raw_page=(type->get_page)(f, udata))==NULL)
+ if((bt->rc_page=(type->get_page)(f, udata))==NULL)
HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL, "can't retrieve B-tree node buffer")
+ bt->raw_page=H5RC_GET_OBJ(bt->rc_page);
if (NULL==(bt->native=H5FL_BLK_MALLOC(native_block,total_native_keysize)) ||
NULL==(bt->child=H5FL_SEQ_MALLOC(haddr_t,(size_t)(2*H5F_KVALUE(f,type)))) ||
NULL==(bt->nkey=H5FL_SEQ_MALLOC(voidp,(size_t)(2*H5F_KVALUE(f,type)+1))))
@@ -342,8 +343,9 @@ H5B_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, const void *_type, void *udata)
NULL==(bt->child=H5FL_SEQ_MALLOC(haddr_t,(size_t)(2*H5F_KVALUE(f,type)))))
HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
- if((bt->raw_page=(type->get_page)(f, udata))==NULL)
+ if((bt->rc_page=(type->get_page)(f, udata))==NULL)
HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL, "can't retrieve B-tree node buffer")
+ bt->raw_page=H5RC_GET_OBJ(bt->rc_page);
if (H5F_block_read(f, H5FD_MEM_BTREE, addr, size, dxpl_id, bt->raw_page)<0)
HGOTO_ERROR(H5E_BTREE, H5E_READERROR, NULL, "can't read B-tree node")
@@ -576,6 +578,7 @@ H5B_dest(H5F_t UNUSED *f, H5B_t *bt)
H5FL_SEQ_FREE(haddr_t,bt->child);
H5FL_SEQ_FREE(voidp,bt->nkey);
H5FL_BLK_FREE(native_block,bt->native);
+ H5RC_DEC(bt->rc_page);
H5FL_FREE(H5B_t,bt);
FUNC_LEAVE_NOAPI(SUCCEED)
@@ -2148,6 +2151,9 @@ H5B_copy(const H5F_t *f, const H5B_t *old_bt)
new_node->nkey[u] = NULL;
}
+ /* Increment the ref-count on the raw page */
+ H5RC_INC(new_node->rc_page);
+
/* Set return value */
ret_value=new_node;
diff --git a/src/H5Bpkg.h b/src/H5Bpkg.h
index 67b49db..67135cf 100644
--- a/src/H5Bpkg.h
+++ b/src/H5Bpkg.h
@@ -31,6 +31,7 @@
#include "H5Bprivate.h"
/* Other private headers needed by this file */
+#include "H5RCprivate.h" /* Reference counted object functions */
/**************************/
/* Package Private Macros */
@@ -54,6 +55,7 @@ struct H5B_t {
haddr_t left; /*address of left sibling */
haddr_t right; /*address of right sibling */
unsigned nchildren; /*number of child pointers */
+ H5RC_t *rc_page; /*ref-counted disk page */
uint8_t *raw_page; /*disk page (shared) */
uint8_t *native; /*array of keys in native format */
void **nkey; /*2k+1 key entries */
diff --git a/src/H5Distore.c b/src/H5Distore.c
index 6bfdf40..70ca239 100644
--- a/src/H5Distore.c
+++ b/src/H5Distore.c
@@ -154,6 +154,7 @@ static haddr_t H5D_istore_get_addr(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *
const hssize_t offset[], H5D_istore_ud1_t *_udata);
static void *H5D_istore_chunk_alloc(size_t size, const H5O_pline_t *pline);
static void *H5D_istore_chunk_xfree(void *chk, const H5O_pline_t *pline);
+static herr_t H5D_istore_page_free (void *page);
/* B-tree iterator callbacks */
static int H5D_istore_iter_allocated(H5F_t *f, hid_t dxpl_id, void *left_key, haddr_t addr,
@@ -286,9 +287,13 @@ H5D_istore_get_page(H5F_t UNUSED *f, const void *_udata)
assert(udata);
assert(udata->mesg);
- assert(udata->mesg->u.chunk.raw_page);
+ assert(udata->mesg->u.chunk.rc_page);
- FUNC_LEAVE_NOAPI(udata->mesg->u.chunk.raw_page);
+ /* Increment reference count on B-tree node */
+ H5RC_INC(udata->mesg->u.chunk.rc_page);
+
+ /* Get the pointer to the ref-count object */
+ FUNC_LEAVE_NOAPI(udata->mesg->u.chunk.rc_page);
} /* end H5D_istore_get_page() */
@@ -906,6 +911,7 @@ H5D_istore_init (H5F_t *f, H5D_t *dset)
size_t sizeof_rkey; /* Single raw key size */
size_t size; /* Raw B-tree node size */
H5D_rdcc_t *rdcc = &(dset->cache.chunk);
+ void *page; /* Buffer for raw B-tree node */
herr_t ret_value=SUCCEED; /* Return value */
FUNC_ENTER_NOAPI(H5D_istore_init, FAIL);
@@ -927,9 +933,13 @@ H5D_istore_init (H5F_t *f, H5D_t *dset)
assert(sizeof_rkey);
size = H5B_nodesize(f, H5B_ISTORE, NULL, sizeof_rkey);
assert(size);
- if(NULL==(dset->layout.u.chunk.raw_page=H5FL_BLK_MALLOC(chunk_page,size)))
+ if(NULL==(page=H5FL_BLK_MALLOC(chunk_page,size)))
HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for B-tree page")
+ /* Make page buffer reference counted */
+ if(NULL==(dset->layout.u.chunk.rc_page=H5RC_create(page,H5D_istore_page_free)))
+ HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't create ref-count wrapper for page")
+
done:
FUNC_LEAVE_NOAPI(ret_value);
} /* end H5D_istore_init() */
@@ -1225,7 +1235,8 @@ H5D_istore_dest (H5F_t *f, hid_t dxpl_id, H5D_t *dset)
HDmemset (rdcc, 0, sizeof(H5D_rdcc_t));
/* Free the raw B-tree node buffer */
- H5FL_BLK_FREE(chunk_page,dset->layout.u.chunk.raw_page);
+ if(H5RC_DEC(dset->layout.u.chunk.rc_page)<0)
+ HGOTO_ERROR (H5E_IO, H5E_CANTFREE, FAIL, "unable to decrement ref-counted page");
done:
FUNC_LEAVE_NOAPI(ret_value);
@@ -1233,6 +1244,31 @@ done:
/*-------------------------------------------------------------------------
+ * Function: H5D_istore_page_free
+ *
+ * Purpose: Free a B-tree node
+ *
+ * Return: Non-negative on success/Negative on failure
+ *
+ * Programmer: Quincey Koziol
+ * Thursday, July 8, 2004
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D_istore_page_free (void *page)
+{
+ FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5D_istore_page_free)
+
+ H5FL_BLK_FREE(chunk_page,page);
+
+ FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5D_istore_page_free() */
+
+
+/*-------------------------------------------------------------------------
* Function: H5D_istore_prune
*
* Purpose: Prune the cache by preempting some things until the cache has
diff --git a/src/H5F.c b/src/H5F.c
index 5ae0435..a55ebea 100644
--- a/src/H5F.c
+++ b/src/H5F.c
@@ -1554,10 +1554,6 @@ H5F_new(H5F_file_t *shared, hid_t fcpl_id, hid_t fapl_id)
/* Create the file's "open object" information */
if(H5FO_create(f)<0)
HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, NULL, "unable to create open object TBBT")
-
- /* Create information needed for group nodes */
- if(H5G_node_init(f)<0)
- HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, NULL, "unable to create group node info")
} /* end else */
f->shared->nrefs++;
@@ -4671,7 +4667,7 @@ done:
/*-------------------------------------------------------------------------
- * Function: H5F_raw_page
+ * Function: H5F_rc_page
*
* Purpose: Replaced a macro to retrieve the raw B-tree page value
* now that the generic properties are being used to store
@@ -4690,15 +4686,15 @@ done:
*
*-------------------------------------------------------------------------
*/
-void *H5F_raw_page(const H5F_t *f)
+H5RC_t *H5F_rc_page(const H5F_t *f)
{
/* Use FUNC_ENTER_NOAPI_NOINIT_NOFUNC here to avoid performance issues */
- FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5F_raw_page)
+ FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5F_rc_page)
assert(f);
assert(f->shared);
- FUNC_LEAVE_NOAPI(f->shared->raw_page)
+ FUNC_LEAVE_NOAPI(f->shared->rc_page)
} /* end H5F_raw_page() */
@@ -4709,7 +4705,7 @@ void *H5F_raw_page(const H5F_t *f)
* is called after an existing file is opened in order
* to learn the true size of the underlying file.
*
- * Return: Success: File size
+ * Return: Success: Non-negative
* Failure: Negative
*
* Programmer: David Pitt
diff --git a/src/H5Fpkg.h b/src/H5Fpkg.h
index 34a2197..0fd35f1 100644
--- a/src/H5Fpkg.h
+++ b/src/H5Fpkg.h
@@ -37,6 +37,7 @@
#include "H5private.h" /* Generic Functions */
#include "H5FOprivate.h" /* File objects */
#include "H5Gprivate.h" /* Groups */
+#include "H5RCprivate.h" /* Reference counted object functions */
/*
* Feature: Define this constant to be non-zero if you want to enable code
@@ -126,7 +127,7 @@ typedef struct H5F_file_t {
struct H5HG_heap_t **cwfs; /* Global heap cache */
H5FO_t *open_objs; /* Open objects in file */
H5F_close_degree_t fc_degree; /* File close behavior degree */
- void *raw_page; /* Pointer to raw B-tree node buffer */
+ H5RC_t *rc_page; /* Pointer to ref-counted raw B-tree node buffer */
} H5F_file_t;
/* A record of the mount table */
diff --git a/src/H5Fprivate.h b/src/H5Fprivate.h
index a7ecc41..b160419 100644
--- a/src/H5Fprivate.h
+++ b/src/H5Fprivate.h
@@ -212,7 +212,7 @@ typedef struct H5F_t H5F_t;
/* Check for file driver feature enabled */
#define H5F_HAS_FEATURE(F,FL) ((F)->shared->lf->feature_flags&(FL))
/* B-tree node raw page */
-#define H5F_RAW_PAGE(F) ((F)->shared->raw_page)
+#define H5F_RC_PAGE(F) ((F)->shared->rc_page)
#else /* H5F_PACKAGE */
#define H5F_SIZEOF_ADDR(F) (H5F_sizeof_addr(F))
#define H5F_SIZEOF_SIZE(F) (H5F_sizeof_size(F))
@@ -222,7 +222,7 @@ typedef struct H5F_t H5F_t;
#define H5F_RDCC_NBYTES(F) (H5F_rdcc_nbytes(F))
#define H5F_RDCC_W0(F) (H5F_rdcc_w0(F))
#define H5F_HAS_FEATURE(F,FL) (H5F_has_feature(F,FL))
-#define H5F_RAW_PAGE(F) (H5F_raw_page(F))
+#define H5F_RC_PAGE(F) (H5F_rc_page(F))
#endif /* H5F_PACKAGE */
@@ -388,6 +388,7 @@ typedef struct H5F_t H5F_t;
/* Forward declarations for prototype arguments */
struct H5B_class_t;
+struct H5RC_t;
/* Private functions, not part of the publicly documented API */
H5_DLL herr_t H5F_init(void);
@@ -417,7 +418,7 @@ H5_DLL hbool_t H5F_has_feature(const H5F_t *f, unsigned feature);
H5_DLL size_t H5F_rdcc_nbytes(const H5F_t *f);
H5_DLL size_t H5F_rdcc_nelmts(const H5F_t *f);
H5_DLL double H5F_rdcc_w0(const H5F_t *f);
-H5_DLL void *H5F_raw_page(const H5F_t *f);
+H5_DLL struct H5RC_t *H5F_rc_page(const H5F_t *f);
/* Functions that operate on blocks of bytes wrt super block */
H5_DLL herr_t H5F_block_read(const H5F_t *f, H5FD_mem_t type, haddr_t addr,
diff --git a/src/H5G.c b/src/H5G.c
index ae638c4..8ab9c59 100644
--- a/src/H5G.c
+++ b/src/H5G.c
@@ -88,6 +88,10 @@
#define H5G_PACKAGE /*suppress error message about including H5Gpkg.h */
#define H5F_PACKAGE /*suppress error about including H5Fpkg */
+/* Pablo information */
+/* (Put before include files to avoid problems with inline functions) */
+#define PABLO_MASK H5G_mask
+
/* Packages needed by this file... */
#include "H5private.h" /* Generic Functions */
#include "H5Aprivate.h" /* Attributes */
@@ -117,8 +121,6 @@
#define H5G_TARGET_SLINK 0x0001
#define H5G_TARGET_MOUNT 0x0002
-#define PABLO_MASK H5G_mask
-
/* Interface initialization */
static int interface_initialize_g = 0;
#define INTERFACE_INIT H5G_init_interface
@@ -1064,8 +1066,8 @@ H5G_term_interface(void)
*
* Purpose: Register a new object type so H5G_get_type() can detect it.
* One should always register a general type before a more
- * specific type. For instance, any object that has a data type
- * message is a data type, but only some of those objects are
+ * specific type. For instance, any object that has a datatype
+ * message is a datatype, but only some of those objects are
* datasets.
*
* Return: Success: Non-negative
@@ -1686,6 +1688,10 @@ H5G_mkroot (H5F_t *f, hid_t dxpl_id, H5G_entry_t *ent)
if (f->shared->root_grp)
HGOTO_DONE(SUCCEED);
+ /* Create information needed for group nodes */
+ if(H5G_node_init(f)<0)
+ HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to create group node info")
+
/*
* If there is no root object then create one. The root group always has
* a hard link count of one since it's pointed to by the boot block.
@@ -1763,7 +1769,7 @@ static H5G_t *
H5G_create(H5G_entry_t *loc, const char *name, size_t size_hint, hid_t dxpl_id)
{
H5G_t *grp = NULL; /*new group */
- H5F_t *file=NULL; /* File new group will be in */
+ H5F_t *file = NULL; /* File new group will be in */
unsigned stab_init=0; /* Flag to indicate that the symbol stable was created successfully */
H5G_t *ret_value; /* Return value */
@@ -2312,11 +2318,11 @@ H5G_loc (hid_t loc_id)
if (NULL==(dt=H5I_object(loc_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "invalid type ID");
if (NULL==(ret_value=H5T_entof(dt)))
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "unable to get symbol table entry of data type");
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "unable to get symbol table entry of datatype");
break;
case H5I_DATASPACE:
- HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "unable to get symbol table entry of data space");
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "unable to get symbol table entry of dataspace");
case H5I_DATASET:
if (NULL==(dset=H5I_object(loc_id)))
@@ -2482,7 +2488,6 @@ done:
if(norm_new_name)
H5MM_xfree(norm_new_name);
-
FUNC_LEAVE_NOAPI(ret_value);
}
@@ -2586,7 +2591,6 @@ H5G_get_objinfo (H5G_entry_t *loc, const char *name, hbool_t follow_link,
statbuf->nlink = 0;
statbuf->type = H5G_LINK;
statbuf->mtime = 0;
-
} else {
/* Some other type of object */
statbuf->objno[0] = (unsigned long)(obj_ent.header);
@@ -3332,7 +3336,7 @@ H5G_replace_name(int type, H5G_entry_t *loc,
search_dataset=1;
break;
- /* Object is a named data type */
+ /* Object is a named datatype */
case H5G_TYPE:
/* Search and replace names through datatype IDs */
search_datatype=1;
diff --git a/src/H5Gnode.c b/src/H5Gnode.c
index 5458245..54786ee 100644
--- a/src/H5Gnode.c
+++ b/src/H5Gnode.c
@@ -63,6 +63,7 @@ typedef struct H5G_node_key_t {
/* PRIVATE PROTOTYPES */
static size_t H5G_node_size(H5F_t *f);
+static herr_t H5G_node_page_free (void *page);
/* Metadata cache callbacks */
static H5G_node_t *H5G_node_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, const void *_udata1,
@@ -197,7 +198,11 @@ H5G_node_get_page(H5F_t *f, const void UNUSED *_udata)
assert(f);
- FUNC_LEAVE_NOAPI(H5F_RAW_PAGE(f));
+ /* Increment reference count on B-tree node */
+ H5RC_INC(H5F_RC_PAGE(f));
+
+ /* Get the pointer to the ref-count object */
+ FUNC_LEAVE_NOAPI(H5F_RC_PAGE(f));
} /* end H5G_node_get_page() */
@@ -1512,8 +1517,9 @@ done:
herr_t
H5G_node_init(H5F_t *f)
{
- size_t sizeof_rkey; /* Single raw key size */
- size_t size; /* Raw B-tree node size */
+ size_t sizeof_rkey; /* Single raw key size */
+ size_t size; /* Raw B-tree node size */
+ void *page; /* Buffer for raw B-tree node */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_NOAPI(H5G_node_init, FAIL);
@@ -1526,9 +1532,13 @@ H5G_node_init(H5F_t *f)
assert(sizeof_rkey);
size = H5B_nodesize(f, H5B_SNODE, NULL, sizeof_rkey);
assert(size);
- if(NULL==(f->shared->raw_page=H5FL_BLK_MALLOC(grp_page,size)))
+ if(NULL==(page=H5FL_BLK_MALLOC(grp_page,size)))
HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for B-tree page")
+ /* Make page buffer reference counted */
+ if(NULL==(f->shared->rc_page=H5RC_create(page,H5G_node_page_free)))
+ HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't create ref-count wrapper for page")
+
done:
FUNC_LEAVE_NOAPI(ret_value);
} /* end H5G_node_init() */
@@ -1560,7 +1570,7 @@ H5G_node_close(const H5F_t *f)
assert(f);
/* Free the raw B-tree node buffer */
- H5FL_BLK_FREE(grp_page,f->shared->raw_page);
+ H5RC_DEC(f->shared->rc_page);
done:
FUNC_LEAVE_NOAPI(ret_value);
@@ -1568,6 +1578,32 @@ done:
/*-------------------------------------------------------------------------
+ * Function: H5G_node_page_free
+ *
+ * Purpose: Free a B-tree node
+ *
+ * Return: Non-negative on success/Negative on failure
+ *
+ * Programmer: Quincey Koziol
+ * Thursday, July 8, 2004
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5G_node_page_free (void *page)
+{
+ FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5G_node_page_free)
+
+ /* Free the raw B-tree node buffer */
+ H5FL_BLK_FREE(grp_page,page);
+
+ FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5G_node_page_free() */
+
+
+/*-------------------------------------------------------------------------
* Function: H5G_node_debug
*
* Purpose: Prints debugging information about a symbol table node
diff --git a/src/H5Oprivate.h b/src/H5Oprivate.h
index ec4d7da..a87e52d 100644
--- a/src/H5Oprivate.h
+++ b/src/H5Oprivate.h
@@ -37,6 +37,7 @@
/* Private headers needed by this file */
#include "H5private.h" /* Generic functions */
#include "H5HGprivate.h" /* Global heap functions */
+#include "H5RCprivate.h" /* Reference counted object functions */
#include "H5Tprivate.h" /* Datatype functions */
#include "H5Zprivate.h" /* I/O pipeline filters */
@@ -133,7 +134,7 @@ typedef struct H5O_layout_chunk_t {
unsigned ndims; /* Num dimensions in chunk */
size_t dim[H5O_LAYOUT_NDIMS]; /* Size of chunk in elements */
size_t size; /* Size of chunk in bytes */
- void *raw_page; /* Buffer for raw B-tree page */
+ H5RC_t *rc_page; /* Ref-counted buffer for raw B-tree page */
} H5O_layout_chunk_t;
typedef struct H5O_layout_compact_t {
diff --git a/src/H5RC.c b/src/H5RC.c
index 8ab1818..644ef3a 100644
--- a/src/H5RC.c
+++ b/src/H5RC.c
@@ -27,6 +27,10 @@
#include "H5FLprivate.h" /* Free lists */
#include "H5RCprivate.h" /* Reference-counted buffers */
+/* Interface initialization */
+static int interface_initialize_g = 0;
+#define INTERFACE_INIT NULL
+
/* Private typedefs & structs */
/* Declare a free list to manage the H5RC_t struct */
diff --git a/src/Makefile.in b/src/Makefile.in
index 551f708..f3cf5fe 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -39,13 +39,13 @@ LIB_SRC=H5.c H5A.c H5AC.c H5B.c H5D.c H5Dcontig.c H5Dcompact.c H5Dio.c \
H5MM.c H5O.c H5Oattr.c H5Obogus.c H5Ocont.c H5Odtype.c H5Oefl.c \
H5Ofill.c H5Olayout.c H5Omtime.c H5Oname.c H5Onull.c H5Opline.c \
H5Osdspace.c H5Oshared.c H5Ostab.c H5P.c H5Pdcpl.c H5Pdxpl.c \
- H5Pfapl.c H5Pfcpl.c H5Ptest.c H5R.c H5RS.c H5S.c H5Sall.c H5Shyper.c \
- H5Smpio.c H5Snone.c H5Spoint.c H5Sselect.c H5Stest.c H5ST.c H5T.c \
- H5Tarray.c H5Tbit.c H5Tcommit.c H5Tcompound.c H5Tconv.c H5Tcset.c \
- H5Tenum.c H5Tfields.c H5Tfixed.c H5Tfloat.c H5Tinit.c H5Tnative.c \
- H5Toffset.c H5Topaque.c H5Torder.c H5Tpad.c H5Tprecis.c H5Tstrpad.c \
- H5Tvlen.c H5TB.c H5TS.c H5V.c H5Z.c H5Zdeflate.c H5Zfletcher32.c \
- H5Zshuffle.c H5Zszip.c
+ H5Pfapl.c H5Pfcpl.c H5Ptest.c H5R.c H5RC.c H5RS.c H5S.c H5Sall.c \
+ H5Shyper.c H5Smpio.c H5Snone.c H5Spoint.c H5Sselect.c H5Stest.c \
+ H5ST.c H5T.c H5Tarray.c H5Tbit.c H5Tcommit.c H5Tcompound.c H5Tconv.c \
+ H5Tcset.c H5Tenum.c H5Tfields.c H5Tfixed.c H5Tfloat.c H5Tinit.c \
+ H5Tnative.c H5Toffset.c H5Topaque.c H5Torder.c H5Tpad.c H5Tprecis.c \
+ H5Tstrpad.c H5Tvlen.c H5TB.c H5TS.c H5V.c H5Z.c H5Zdeflate.c \
+ H5Zfletcher32.c H5Zshuffle.c H5Zszip.c
LIB_OBJ=$(LIB_SRC:.c=.lo)
@@ -67,7 +67,7 @@ PRIVATE_HDR=H5private.h H5Aprivate.h H5Apkg.h H5ACprivate.h H5Bprivate.h \
H5FOprivate.h H5FPprivate.h H5FSprivate.h H5Gprivate.h H5Gpkg.h \
H5HGprivate.h H5HLprivate.h H5HPprivate.h H5Iprivate.h H5MFprivate.h \
H5MMprivate.h H5Oprivate.h H5Opkg.h H5Pprivate.h H5Ppkg.h \
- H5Rprivate.h H5RSprivate.h H5Sprivate.h H5STprivate.h \
+ H5Rprivate.h H5RCprivate.h H5RSprivate.h H5Sprivate.h H5STprivate.h \
H5Tprivate.h H5TBprivate.h H5Tpkg.h H5TSprivate.h H5Vprivate.h \
H5Zprivate.h H5Zpkg.h H5config.h