summaryrefslogtreecommitdiffstats
path: root/src/H5G.c
diff options
context:
space:
mode:
authorRobb Matzke <matzke@llnl.gov>1997-08-09 16:45:59 (GMT)
committerRobb Matzke <matzke@llnl.gov>1997-08-09 16:45:59 (GMT)
commita260c7849c1ca59bd32cde9d12380e89afd70770 (patch)
treea4d791e5df2d17b3fd6988ca84e363560b1c87cf /src/H5G.c
parent0d050fcd579bf1db6db2d8a1d3fec617114bfd1f (diff)
downloadhdf5-a260c7849c1ca59bd32cde9d12380e89afd70770.zip
hdf5-a260c7849c1ca59bd32cde9d12380e89afd70770.tar.gz
hdf5-a260c7849c1ca59bd32cde9d12380e89afd70770.tar.bz2
[svn-r17] ./src/H5AC.c
Renamed H5AC_find() to H5AC_find_f() which is invoked from the H5AC_find() macro. Changed HASH() to H5AC_HASH(). ./src/H5ACprivate.h Increased the number of cache slots from 1033 to 10330 to see how it affects performance. This should probably be changeable on a per-file basis. ./src/H5B.c Fixed some bugs now that symbol tables are actually using the stuff. Improved debugging a little. Fixed uninitialized memory appearing in the file. ./src/H5D.c Changed a FUNC_ENTER() argument from H5Dset_info to H5Dwrite. ./src/H5F.c Plugged a memory leak in H5F_dest(). ./src/H5G.c ./src/H5Gprivate.h Many of these functions take a symbol table entry which describes the symbol table rather than just the symbol table address. Moved some functions to make room for the ones that understand directory names: H5G_new() -> H5G_stab_new() H5G_find() -> H5G_stab_find() H5G_modify() -> H5G_stab_modify() H5G_insert() -> H5G_stab_insert() H5G_list() -> H5G_stab_list() ./src/H5Gnode.c Added more assertions. Zero new memory so junk doesn't appear in the data file. This is a problem when one tries to declassify a classified data file. H5G_node_debug() can take an extra argument which is the address of the heap for the symbol table. If supplied, the symbol names are printed along with the heap offsets. ./src/H5H.c ./src/H5Hprivate.h Fixed a bug with the free blocks by forcing things to align on even boundaries. It's still possible to lose heap memory if the hole is smaller than the free list header. The alternative is to align heap objects on 12 or 20 byte boundaries, but this tends to waste to much space. Zero new memory like with H5Gnode.c. Fixed a "mispeling" of NDEBUG. ./src/H5Ocont.c ./src/H5Onull.c Added the pablo mask defn. ./src/H5Ostab.c Added the pablo mask defn. Fixed a read from uninitialized memory. ./src/H5Oprivate.h Tuned some parameters to see how they affect performance. ./src/debug.c An optional third argument can be supplied which is the address of a heap to use to display names in a symbol table. ./src/hdf5pabl.h Changed `int' to `intn'.
Diffstat (limited to 'src/H5G.c')
-rw-r--r--src/H5G.c124
1 files changed, 79 insertions, 45 deletions
diff --git a/src/H5G.c b/src/H5G.c
index 19ba355..172b946 100644
--- a/src/H5G.c
+++ b/src/H5G.c
@@ -8,7 +8,17 @@
* Jul 18 1997
* Robb Matzke <matzke@llnl.gov>
*
- * Purpose:
+ * Purpose: Symbol table functions. The functions that
+ * begin with `H5G_stab_' don't understand the
+ * directory hierarchy; they operate on a single
+ * symbol table at a time.
+ *
+ * The functions that begin with `H5G_node_' operate
+ * on the leaf nodes of a symbol table B-tree. They
+ * should be defined in the H5Gnode.c file.
+ *
+ * The remaining functions know about the directory
+ * hierarchy.
*
* Modifications:
*
@@ -37,10 +47,9 @@
/* Is the interface initialized? */
static intn interface_initialize_g = FALSE;
-
/*-------------------------------------------------------------------------
- * Function: H5G_new
+ * Function: H5G_stab_new
*
* Purpose: Creates a new empty symbol table (object header, name heap,
* and B-tree). The caller can specify an initial size for the
@@ -54,7 +63,10 @@ static intn interface_initialize_g = FALSE;
* item in the heap is the empty string, and must appear at
* heap offset zero.
*
- * Return: Success: Address of new symbol table.
+ * Return: Success: Address of new symbol table header. If
+ * the caller supplies a symbol table entry
+ * SELF then it will be initialized to point to
+ * this symbol table.
*
* Failure: FAIL
*
@@ -67,13 +79,13 @@ static intn interface_initialize_g = FALSE;
*-------------------------------------------------------------------------
*/
haddr_t
-H5G_new (hdf5_file_t *f, size_t init)
+H5G_stab_new (hdf5_file_t *f, H5G_entry_t *self, size_t init)
{
off_t name; /*offset of "" name */
haddr_t addr; /*object header address */
H5O_stab_t stab; /*symbol table message */
- FUNC_ENTER (H5G_new, NULL, FAIL);
+ FUNC_ENTER (H5G_stab_new, NULL, FAIL);
/*
* Check arguments.
@@ -102,11 +114,18 @@ H5G_new (hdf5_file_t *f, size_t init)
/* The B-tree is created on demand later */
stab.btree = 0;
- /* Create symbol table object header */
- if ((addr = H5O_new (f, 0, 4+2*H5F_SIZEOF_OFFSET(f)))<0) {
+ /* Create symbol table object header with a single link */
+ if ((addr = H5O_new (f, 1, 4+2*H5F_SIZEOF_OFFSET(f)))<0) {
HRETURN_ERROR (H5E_SYM, H5E_CANTINIT, FAIL);
}
- if (H5O_modify(f, addr, NULL, NULL, H5O_STAB, H5O_NEW_MESG, &stab)<0) {
+ if (self) {
+ self->name_off = 0;
+ self->header = addr;
+ self->type = H5G_NOTHING_CACHED;
+ }
+
+ /* insert the symbol table message */
+ if (H5O_modify(f, addr, self, NULL, H5O_STAB, H5O_NEW_MESG, &stab)<0) {
HRETURN_ERROR (H5E_SYM, H5E_CANTINIT, FAIL);
}
@@ -115,11 +134,11 @@ H5G_new (hdf5_file_t *f, size_t init)
/*-------------------------------------------------------------------------
- * Function: H5G_find
+ * Function: H5G_stab_find
*
- * Purpose: Finds a symbol named NAME in the symbol table whose address
- * is ADDR and returns a copy of the symbol table entry through
- * the ENTRY argument.
+ * Purpose: Finds a symbol named NAME in the symbol table whose
+ * description is stored in SELF in file F and returns a
+ * copy of the symbol table entry through the ENT argument.
*
* Return: Success: Address corresponding to the name.
*
@@ -134,21 +153,22 @@ H5G_new (hdf5_file_t *f, size_t init)
*-------------------------------------------------------------------------
*/
haddr_t
-H5G_find (hdf5_file_t *f, haddr_t addr, const char *name, H5G_entry_t *entry)
+H5G_stab_find (hdf5_file_t *f, H5G_entry_t *self, const char *name,
+ H5G_entry_t *ent)
{
H5G_node_ud1_t udata; /*data to pass through B-tree */
H5O_stab_t stab; /*symbol table message */
- FUNC_ENTER (H5G_find, NULL, FAIL);
+ FUNC_ENTER (H5G_stab_find, NULL, FAIL);
/* Check arguments */
assert (f);
- assert (addr>=0);
+ assert (self && self->header>=0);
assert (name && *name);
- assert (entry);
+ assert (ent);
/* set up the udata */
- if (NULL==H5O_read (f, addr, NULL, H5O_STAB, 0, &stab)) {
+ if (NULL==H5O_read (f, self->header, self, H5O_STAB, 0, &stab)) {
HRETURN_ERROR (H5E_SYM, H5E_BADMESG, FAIL);
}
if (stab.btree<=0 || stab.heap<=0) {
@@ -164,17 +184,17 @@ H5G_find (hdf5_file_t *f, haddr_t addr, const char *name, H5G_entry_t *entry)
}
/* return the result */
- if (entry) *entry = udata.entry;
+ if (ent) *ent = udata.entry;
FUNC_LEAVE (udata.entry.header);
}
/*-------------------------------------------------------------------------
- * Function: H5G_modify
+ * Function: H5G_stab_modify
*
* Purpose: Modifies the entry for an existing symbol. The name of the
- * symbol is NAME in the symbol table whose address is ADDR in
- * file F. ENTRY is the new symbol table entry to use for the
+ * symbol is NAME in the symbol table described by SELF in
+ * file F. ENT is the new symbol table entry to use for the
* symbol.
*
* Return: Success: SUCCEED
@@ -190,21 +210,22 @@ H5G_find (hdf5_file_t *f, haddr_t addr, const char *name, H5G_entry_t *entry)
*-------------------------------------------------------------------------
*/
herr_t
-H5G_modify (hdf5_file_t *f, haddr_t addr, const char *name, H5G_entry_t *entry)
+H5G_stab_modify (hdf5_file_t *f, H5G_entry_t *self, const char *name,
+ H5G_entry_t *ent)
{
H5G_node_ud1_t udata; /*data to pass through B-tree */
H5O_stab_t stab; /*symbol table message */
- FUNC_ENTER (H5G_modify, NULL, FAIL);
+ FUNC_ENTER (H5G_stab_modify, NULL, FAIL);
/* check arguments */
assert (f);
- assert (addr>=0);
+ assert (self && self->header>=0);
assert (name && *name);
- assert (entry);
+ assert (ent);
/* set up the udata */
- if (NULL==H5O_read (f, addr, NULL, H5O_STAB, 0, &stab)) {
+ if (NULL==H5O_read (f, self->header, self, H5O_STAB, 0, &stab)) {
HRETURN_ERROR (H5E_SYM, H5E_BADMESG, FAIL);
}
if (stab.btree<=0 || stab.heap<=0) {
@@ -213,7 +234,7 @@ H5G_modify (hdf5_file_t *f, haddr_t addr, const char *name, H5G_entry_t *entry)
udata.operation = H5G_OPER_MODIFY;
udata.name = name;
udata.heap = stab.heap;
- udata.entry = *entry;
+ udata.entry = *ent;
/* search and modify the B-tree */
if (H5B_find (f, H5B_SNODE, stab.btree, &udata)<0) {
@@ -225,11 +246,11 @@ H5G_modify (hdf5_file_t *f, haddr_t addr, const char *name, H5G_entry_t *entry)
/*-------------------------------------------------------------------------
- * Function: H5G_insert
+ * Function: H5G_stab_insert
*
- * Purpose: Insert a new symbol into the table whose address is ADDR in
+ * Purpose: Insert a new symbol into the table described by SELF in
* file F. The name of the new symbol is NAME and its symbol
- * table entry is ENTRY.
+ * table entry is ENT.
*
* Return: Success: SUCCEED
*
@@ -244,22 +265,23 @@ H5G_modify (hdf5_file_t *f, haddr_t addr, const char *name, H5G_entry_t *entry)
*-------------------------------------------------------------------------
*/
herr_t
-H5G_insert (hdf5_file_t *f, haddr_t addr, const char *name, H5G_entry_t *entry)
+H5G_stab_insert (hdf5_file_t *f, H5G_entry_t *self, const char *name,
+ H5G_entry_t *ent)
{
H5O_stab_t stab; /*symbol table message */
H5G_node_ud1_t udata; /*data to pass through B-tree */
off_t offset; /*offset of name within heap */
- FUNC_ENTER (H5G_insert, NULL, FAIL);
+ FUNC_ENTER (H5G_stab_insert, NULL, FAIL);
/* check arguments */
assert (f);
- assert (addr>=0);
+ assert (self && self->header>=0);
assert (name && *name);
- assert (entry);
+ assert (ent);
/* make sure we have a B-tree and a heap */
- if (NULL==H5O_read (f, addr, NULL, H5O_STAB, 0, &stab)) {
+ if (NULL==H5O_read (f, self->header, self, H5O_STAB, 0, &stab)) {
HRETURN_ERROR (H5E_SYM, H5E_BADMESG, FAIL);
}
if (stab.btree<=0 || stab.heap<=0) {
@@ -277,7 +299,7 @@ H5G_insert (hdf5_file_t *f, haddr_t addr, const char *name, H5G_entry_t *entry)
HRETURN_ERROR (H5E_INTERNAL, H5E_CANTINIT, FAIL);
}
}
- if (H5O_modify (f, addr, NULL, NULL, H5O_STAB, 0, &stab)<0) {
+ if (H5O_modify (f, self->header, self, NULL, H5O_STAB, 0, &stab)<0) {
HRETURN_ERROR (H5E_SYM, H5E_CANTINIT, FAIL);
}
}
@@ -285,7 +307,7 @@ H5G_insert (hdf5_file_t *f, haddr_t addr, const char *name, H5G_entry_t *entry)
/* initialize data to pass through B-tree */
udata.name = name;
udata.heap = stab.heap;
- udata.entry = *entry;
+ udata.entry = *ent;
if (H5B_insert (f, H5B_SNODE, stab.btree, &udata)<0) {
HRETURN_ERROR (H5E_SYM, H5E_CANTINSERT, FAIL);
}
@@ -295,7 +317,7 @@ H5G_insert (hdf5_file_t *f, haddr_t addr, const char *name, H5G_entry_t *entry)
/*-------------------------------------------------------------------------
- * Function: H5G_list
+ * Function: H5G_stab_list
*
* Purpose: Returns a list of all the symbols in a symbol table.
* The caller allocates an array of pointers which this
@@ -322,16 +344,21 @@ H5G_insert (hdf5_file_t *f, haddr_t addr, const char *name, H5G_entry_t *entry)
*-------------------------------------------------------------------------
*/
intn
-H5G_list (hdf5_file_t *f, haddr_t addr, int maxentries,
- char *names[], H5G_entry_t entries[])
+H5G_stab_list (hdf5_file_t *f, H5G_entry_t *self, intn maxentries,
+ char *names[], H5G_entry_t entries[])
{
H5G_node_list_t udata;
H5O_stab_t stab;
intn i;
- FUNC_ENTER (H5G_list, NULL, FAIL);
+ FUNC_ENTER (H5G_stab_list, NULL, FAIL);
+
+ /* check args */
+ assert (f);
+ assert (self && self->header>=0);
+ assert (maxentries>=0);
- if (NULL==H5O_read (f, addr, NULL, H5O_STAB, 0, &stab)) {
+ if (NULL==H5O_read (f, self->header, self, H5O_STAB, 0, &stab)) {
HRETURN_ERROR (H5E_SYM, H5E_BADMESG, FAIL);
}
if (stab.btree<=0 || stab.heap<=0) HRETURN (0); /*empty directory*/
@@ -520,12 +547,16 @@ H5G_encode_vec (hdf5_file_t *f, uint8 **pp, H5G_entry_t *ent, intn n)
*
* Modifications:
*
+ * Robb Matzke, 8 Aug 1997
+ * Writes zeros for the bytes that aren't used so the file doesn't
+ * contain junk.
+ *
*-------------------------------------------------------------------------
*/
herr_t
H5G_encode (hdf5_file_t *f, uint8 **pp, H5G_entry_t *ent)
{
- uint8 *p_ret = *pp;
+ uint8 *p_ret = *pp + H5G_SIZEOF_ENTRY(f);
FUNC_ENTER (H5G_encode, NULL, FAIL);
@@ -562,7 +593,10 @@ H5G_encode (hdf5_file_t *f, uint8 **pp, H5G_entry_t *ent)
abort();
}
- *pp = p_ret + H5G_SIZEOF_ENTRY(f);
+ /* fill with zero */
+ while (*pp<p_ret) *(*pp)++ = 0;
+
+ *pp = p_ret;
FUNC_LEAVE (SUCCEED);
}