summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/H5AC.c21
-rw-r--r--src/H5ACprivate.h13
-rw-r--r--src/H5B.c37
-rw-r--r--src/H5D.c2
-rw-r--r--src/H5F.c1
-rw-r--r--src/H5G.c124
-rw-r--r--src/H5Gnode.c14
-rw-r--r--src/H5Gprivate.h20
-rw-r--r--src/H5H.c48
-rw-r--r--src/H5Hprivate.h1
-rw-r--r--src/H5Ocont.c2
-rw-r--r--src/H5Onull.c2
-rw-r--r--src/H5Oprivate.h6
-rw-r--r--src/H5Ostab.c26
-rw-r--r--src/debug.c8
-rw-r--r--src/hdf5.h1
-rw-r--r--src/hdf5pabl.h2
-rw-r--r--src/hdf5plat.h4
18 files changed, 217 insertions, 115 deletions
diff --git a/src/H5AC.c b/src/H5AC.c
index 2adbafb..41e2f88 100644
--- a/src/H5AC.c
+++ b/src/H5AC.c
@@ -28,7 +28,6 @@
#include "H5MMprivate.h"
#define PABLO_MASK H5AC_mask
-#define HASH(addr) ((unsigned)(addr) % H5AC_NSLOTS)
static int interface_initialize_g = FALSE; /*initialized?*/
@@ -99,7 +98,7 @@ H5AC_dest (hdf5_file_t *f)
/*-------------------------------------------------------------------------
- * Function: H5AC_find
+ * Function: H5AC_find_f
*
* Purpose: Given an object type and the address at which that object
* is located in the file, return a pointer to the object.
@@ -127,10 +126,10 @@ H5AC_dest (hdf5_file_t *f)
*-------------------------------------------------------------------------
*/
void *
-H5AC_find (hdf5_file_t *f, const H5AC_class_t *type, haddr_t addr,
- const void *udata)
+H5AC_find_f (hdf5_file_t *f, const H5AC_class_t *type, haddr_t addr,
+ const void *udata)
{
- unsigned idx = HASH(addr);
+ unsigned idx = H5AC_HASH(addr);
herr_t status;
void *thing = NULL;
herr_t (*flush)(hdf5_file_t*,hbool_t,haddr_t,void*)=NULL;
@@ -159,6 +158,10 @@ H5AC_find (hdf5_file_t *f, const H5AC_class_t *type, haddr_t addr,
HRETURN_ERROR (H5E_CACHE, H5E_BADTYPE, NULL);
}
+#ifdef DO_NOT_CACHE
+ H5AC_flush (f, NULL, 0, TRUE);
+#endif
+
/*
* Load a new thing. If it can't be loaded, then return an error
* without preempting anything.
@@ -220,7 +223,7 @@ herr_t
H5AC_flush (hdf5_file_t *f, const H5AC_class_t *type, haddr_t addr,
hbool_t destroy)
{
- uintn i = HASH(addr);
+ uintn i = H5AC_HASH(addr);
herr_t status;
herr_t (*flush)(hdf5_file_t*,hbool_t,haddr_t,void*)=NULL;
@@ -287,7 +290,7 @@ herr_t
H5AC_set (hdf5_file_t *f, const H5AC_class_t *type, haddr_t addr, void *thing)
{
herr_t status;
- uintn idx = HASH (addr);
+ uintn idx = H5AC_HASH (addr);
herr_t (*flush)(hdf5_file_t*,hbool_t,haddr_t,void*)=NULL;
FUNC_ENTER (H5AC_set, NULL, FAIL);
@@ -337,8 +340,8 @@ herr_t
H5AC_rename (hdf5_file_t *f, const H5AC_class_t *type,
haddr_t old_addr, haddr_t new_addr)
{
- uintn old_idx = HASH (old_addr);
- uintn new_idx = HASH (new_addr);
+ uintn old_idx = H5AC_HASH (old_addr);
+ uintn new_idx = H5AC_HASH (new_addr);
herr_t (*flush)(hdf5_file_t*, hbool_t, haddr_t, void*);
herr_t status;
diff --git a/src/H5ACprivate.h b/src/H5ACprivate.h
index d5c8cad..7bee4b6 100644
--- a/src/H5ACprivate.h
+++ b/src/H5ACprivate.h
@@ -47,7 +47,8 @@ typedef struct H5AC_class_t {
* cache entry by hashing the object's file address. Each file has its
* own cache, an array of slots.
*/
-#define H5AC_NSLOTS 1033 /*prime number tend to work best */
+#define H5AC_NSLOTS 10330 /*prime number tend to work best */
+#define H5AC_HASH(ADDR) ((unsigned)(ADDR) % H5AC_NSLOTS)
typedef struct H5AC_cache_t {
const H5AC_class_t *type; /*type of object stored here */
@@ -59,8 +60,8 @@ typedef struct H5AC_cache_t {
* Library prototypes.
*/
herr_t H5AC_dest (hdf5_file_t *f);
-void *H5AC_find (hdf5_file_t *f, const H5AC_class_t *type, haddr_t addr,
- const void *udata);
+void *H5AC_find_f (hdf5_file_t *f, const H5AC_class_t *type, haddr_t addr,
+ const void *udata);
herr_t H5AC_flush (hdf5_file_t *f, const H5AC_class_t *type, haddr_t addr,
hbool_t destroy);
herr_t H5AC_new (hdf5_file_t *f);
@@ -69,4 +70,10 @@ herr_t H5AC_rename (hdf5_file_t *f, const H5AC_class_t *type,
herr_t H5AC_set (hdf5_file_t *f, const H5AC_class_t *type, haddr_t addr,
void *thing);
+#define H5AC_find(F,TYPE,ADDR,UDATA) \
+ (((F)->cache[H5AC_HASH(ADDR)].type==(TYPE) && \
+ (F)->cache[H5AC_HASH(ADDR)].addr==(ADDR)) ? \
+ (F)->cache[H5AC_HASH(ADDR)].thing : \
+ H5AC_find_f (F, TYPE, ADDR, UDATA))
+
#endif /* !_H5ACprivate_H */
diff --git a/src/H5B.c b/src/H5B.c
index 0ffdc61..7182f10 100644
--- a/src/H5B.c
+++ b/src/H5B.c
@@ -583,6 +583,7 @@ H5B_split (hdf5_file_t *f, const H5B_class_t *type, haddr_t addr, intn anchor)
if (NULL==(old=H5AC_find (f, H5AC_BT, addr, type))) {
HRETURN_ERROR (H5E_BTREE, H5E_CANTLOAD, FAIL);
}
+ assert (old->nchildren == 2*type->k);
bt = H5MM_xmalloc (sizeof(H5B_t));
recsize = old->sizeof_rkey + H5F_SIZEOF_OFFSET(f);
@@ -591,11 +592,12 @@ H5B_split (hdf5_file_t *f, const H5B_class_t *type, haddr_t addr, intn anchor)
*/
size = H5B_nodesize (f, type, &total_nkey_size, old->sizeof_rkey);
bt->dirty = 1;
+ bt->sizeof_rkey = old->sizeof_rkey;
bt->ndirty = BOUND (0, old->ndirty-delta, type->k);
bt->type = type;
bt->level = old->level;
bt->nchildren = type->k;
- bt->page = H5MM_xmalloc (size);
+ bt->page = H5MM_xcalloc (size, 1); /*use calloc() to keep file clean*/
bt->native = H5MM_xmalloc (total_nkey_size);
bt->child = H5MM_xmalloc (2*type->k * sizeof(haddr_t));
bt->key = H5MM_xmalloc ((2*type->k+1) * sizeof(H5B_key_t));
@@ -615,7 +617,7 @@ H5B_split (hdf5_file_t *f, const H5B_class_t *type, haddr_t addr, intn anchor)
/* key */
if (i<=type->k) {
bt->key[i].dirty = old->key[delta+i].dirty;
- bt->key[i].rkey = bt->native + offset;
+ bt->key[i].rkey = bt->page + offset;
if (old->key[delta+i].nkey) {
bt->key[i].nkey = bt->native + i*type->sizeof_nkey;
} else {
@@ -957,6 +959,11 @@ H5B_insert_child (hdf5_file_t *f, const H5B_class_t *type, haddr_t addr,
for (i=bt->nchildren; i>=idx; --i) {
bt->key[i+1].dirty = bt->key[i].dirty;
+ if (bt->key[i].nkey) {
+ bt->key[i+1].nkey = bt->native + (i+1) * type->sizeof_nkey;
+ } else {
+ bt->key[i+1].nkey = NULL;
+ }
}
bt->key[idx].dirty = 1;
bt->key[idx].nkey = bt->native + idx * type->sizeof_nkey;
@@ -978,10 +985,14 @@ H5B_insert_child (hdf5_file_t *f, const H5B_class_t *type, haddr_t addr,
for (i=bt->nchildren; i>idx; --i) {
bt->key[i+1].dirty = bt->key[i].dirty;
+ if (bt->key[i].nkey) {
+ bt->key[i+1].nkey = bt->native + (i+1) * type->sizeof_nkey;
+ } else {
+ bt->key[i+1].nkey = NULL;
+ }
}
bt->key[idx+1].dirty = 1;
- bt->key[idx+1].nkey = bt->native +
- (idx+1) * type->sizeof_nkey;
+ bt->key[idx+1].nkey = bt->native + (idx+1) * type->sizeof_nkey;
memcpy (bt->key[idx+1].nkey, md_key, type->sizeof_nkey);
}
@@ -1411,6 +1422,7 @@ H5B_debug (hdf5_file_t *f, haddr_t addr, FILE *stream, intn indent,
intn fwidth, const H5B_class_t *type)
{
H5B_t *bt = NULL;
+ int i;
FUNC_ENTER (H5B_debug, NULL, FAIL);
@@ -1455,9 +1467,20 @@ H5B_debug (hdf5_file_t *f, haddr_t addr, FILE *stream, intn indent,
fprintf (stream, "%*s%-*s %lu\n", indent, "", fwidth,
"Address of right sibling:",
(unsigned long)(bt->right));
- fprintf (stream, "%*s%-*s %d\n", indent, "", fwidth,
- "Number of children:",
- (int)(bt->nchildren));
+ fprintf (stream, "%*s%-*s %d (%d)\n", indent, "", fwidth,
+ "Number of children (max):",
+ (int)(bt->nchildren),
+ (int)(2*type->k));
+
+ /*
+ * Print the child addresses
+ */
+ for (i=0; i<bt->nchildren; i++) {
+ fprintf (stream, "%*sChild %d...\n", indent, "", i);
+ fprintf (stream, "%*s%-*s %lu\n", indent+3, "", MAX(0,fwidth-3),
+ "Address:",
+ (unsigned long)(bt->child[i]));
+ }
FUNC_LEAVE (SUCCEED);
}
diff --git a/src/H5D.c b/src/H5D.c
index a2d086d..2ff5582 100644
--- a/src/H5D.c
+++ b/src/H5D.c
@@ -196,7 +196,7 @@ herr_t H5Dwrite(hatom_t oid, hatom_t did, VOIDP buf)
uintn towrite; /* number of bytes to write out */
herr_t ret_value = SUCCEED;
- FUNC_ENTER(H5Dset_info, H5D_init_interface, FAIL);
+ FUNC_ENTER(H5Dwrite, H5D_init_interface, FAIL);
/* Clear errors and check args and all the boring stuff. */
H5ECLEAR;
diff --git a/src/H5F.c b/src/H5F.c
index 145e4a7..b6b530b 100644
--- a/src/H5F.c
+++ b/src/H5F.c
@@ -369,6 +369,7 @@ H5F_dest (hdf5_file_t *f)
H5AC_dest (f);
f->dir = H5MM_xfree (f->dir);
f->filename = H5MM_xfree (f->filename);
+ f->root_sym = H5MM_xfree (f->root_sym);
H5MM_xfree (f);
}
return NULL;
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);
}
diff --git a/src/H5Gnode.c b/src/H5Gnode.c
index 9e66188..11950f2 100644
--- a/src/H5Gnode.c
+++ b/src/H5Gnode.c
@@ -237,8 +237,6 @@ H5G_node_new (hdf5_file_t *f, void *_lt_key, void *_udata, void *_rt_key)
* Check arguments.
*/
assert (f);
- assert (lt_key);
- assert (rt_key);
sym = H5MM_xcalloc (1, sizeof(H5G_node_t));
size = H5G_node_size (f);
@@ -320,9 +318,9 @@ H5G_node_flush (hdf5_file_t *f, hbool_t destroy, haddr_t addr, H5G_node_t *sym)
/* entries */
H5G_encode_vec (f, &p, sym->entry, sym->nsyms);
-
+ memset (p, 0, size - (p-buf));
- status = H5F_block_write (f, addr, p-buf, buf);
+ status = H5F_block_write (f, addr, size, buf);
buf = H5MM_xfree (buf);
if (status<0) HRETURN_ERROR (H5E_SYM, H5E_WRITEERROR, FAIL);
}
@@ -855,12 +853,13 @@ H5G_node_list (hdf5_file_t *f, haddr_t addr, void *_udata)
*/
herr_t
H5G_node_debug (hdf5_file_t *f, haddr_t addr, FILE *stream, intn indent,
- intn fwidth)
+ intn fwidth, haddr_t heap)
{
int i, j;
char buf[64];
H5G_node_t *sn = NULL;
herr_t status;
+ const char *s;
FUNC_ENTER (H5G_node_debug, NULL, FAIL);
@@ -897,6 +896,11 @@ H5G_node_debug (hdf5_file_t *f, haddr_t addr, FILE *stream, intn indent,
fwidth = MAX (0, fwidth-3);
for (i=0; i<sn->nsyms; i++) {
fprintf (stream, "%*sSymbol %d:\n", indent-3, "", i);
+ if (heap>0 && (s = H5H_peek (f, heap, sn->entry[i].name_off))) {
+ fprintf (stream, "%*s%-*s `%s'\n", indent, "", fwidth,
+ "Name:",
+ s);
+ }
fprintf (stream, "%*s%-*s %lu\n", indent, "", fwidth,
"Name offset into private heap:",
(unsigned long)(sn->entry[i].name_off));
diff --git a/src/H5Gprivate.h b/src/H5Gprivate.h
index fdfa10c..0e4057d 100644
--- a/src/H5Gprivate.h
+++ b/src/H5Gprivate.h
@@ -134,16 +134,16 @@ extern const H5B_class_t H5B_SNODE[1];
* Library prototypes...
*/
herr_t H5G_node_debug (hdf5_file_t *f, haddr_t addr, FILE *stream, intn indent,
- intn fwidth);
-haddr_t 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);
-herr_t 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);
-intn H5G_list (hdf5_file_t *f, haddr_t addr, int maxentries,
- char *names[], H5G_entry_t entries[]);
+ intn fwidth, haddr_t heap);
+haddr_t H5G_stab_new (hdf5_file_t *f, H5G_entry_t *self, size_t init);
+haddr_t H5G_stab_find (hdf5_file_t *f, H5G_entry_t *self, const char *name,
+ H5G_entry_t *ent);
+herr_t H5G_stab_modify (hdf5_file_t *f, H5G_entry_t *self, const char *name,
+ H5G_entry_t *ent);
+herr_t H5G_stab_insert (hdf5_file_t *f, H5G_entry_t *self, const char *name,
+ H5G_entry_t *ent);
+intn H5G_stab_list (hdf5_file_t *f, H5G_entry_t *self, intn maxentries,
+ char *names[], H5G_entry_t entries[]);
herr_t H5G_decode (hdf5_file_t *f, uint8 **pp, H5G_entry_t *ent);
herr_t H5G_decode_vec (hdf5_file_t *f, uint8 **pp, H5G_entry_t *ent, intn n);
herr_t H5G_encode (hdf5_file_t *f, uint8 **pp, H5G_entry_t *ent);
diff --git a/src/H5H.c b/src/H5H.c
index 8a58f2a..2a92dee 100644
--- a/src/H5H.c
+++ b/src/H5H.c
@@ -132,7 +132,7 @@ H5H_new (hdf5_file_t *f, H5H_type_t heap_type, size_t size_hint)
heap->addr = addr + H5H_SIZEOF_HDR(f);
heap->disk_alloc = size_hint;
heap->mem_alloc = size_hint;
- heap->chunk = H5MM_xmalloc (H5H_SIZEOF_HDR(f) + size_hint);
+ heap->chunk = H5MM_xcalloc (1, H5H_SIZEOF_HDR(f)+size_hint);
/* free list */
if (size_hint) {
@@ -179,7 +179,7 @@ H5H_load (hdf5_file_t *f, haddr_t addr, const void *udata)
uint8 hdr[20], *p;
H5H_t *heap=NULL;
H5H_free_t *fl=NULL, *tail=NULL;
- haddr_t free_block;
+ haddr_t free_block=H5H_FREE_NULL;
FUNC_ENTER (H5H_load, NULL, NULL);
@@ -211,7 +211,7 @@ H5H_load (hdf5_file_t *f, haddr_t addr, const void *udata)
/* data */
H5F_decode_offset (f, p, heap->addr);
- heap->chunk = H5MM_xmalloc (H5H_SIZEOF_HDR(f) + heap->mem_alloc);
+ heap->chunk = H5MM_xcalloc (1, H5H_SIZEOF_HDR(f) + heap->mem_alloc);
if (heap->disk_alloc &&
H5F_block_read (f, heap->addr, heap->disk_alloc,
heap->chunk + H5H_SIZEOF_HDR(f))<0) {
@@ -517,12 +517,12 @@ H5H_remove_free (H5H_t *heap, H5H_free_t *fl)
*-------------------------------------------------------------------------
*/
off_t
-H5H_insert (hdf5_file_t *f, haddr_t addr, size_t size, const void *buf)
+H5H_insert (hdf5_file_t *f, haddr_t addr, size_t buf_size, const void *buf)
{
H5H_t *heap=NULL;
H5H_free_t *fl=NULL, *max_fl=NULL;
off_t offset = -1;
- size_t need_more;
+ size_t need, old_size, need_more;
#ifndef NDEBUG
static nmessages = 0;
#endif
@@ -533,9 +533,13 @@ H5H_insert (hdf5_file_t *f, haddr_t addr, size_t size, const void *buf)
assert (f);
if (H5H_GLOBAL==addr) addr = f->smallobj_off;
assert (addr>0);
- assert (size>0);
+ assert (buf_size>0);
assert (buf);
+ /* allocate aligned file memory */
+ need = buf_size;
+ H5H_ALIGN (need);
+
if (NULL==(heap=H5AC_find (f, H5AC_HEAP, addr, NULL))) {
HRETURN_ERROR (H5E_HEAP, H5E_CANTLOAD, FAIL);
}
@@ -546,12 +550,12 @@ H5H_insert (hdf5_file_t *f, haddr_t addr, size_t size, const void *buf)
* leave zero or at least H5G_SIZEOF_FREE bytes left over.
*/
for (fl=heap->freelist; fl; fl=fl->next) {
- if (fl->size>size && fl->size-size>=H5H_SIZEOF_FREE(f)) {
+ if (fl->size>need && fl->size-need>=H5H_SIZEOF_FREE(f)) {
offset = fl->offset;
- fl->offset += size;
- fl->size -= size;
+ fl->offset += need;
+ fl->size -= need;
break;
- } else if (fl->size==size) {
+ } else if (fl->size==need) {
offset = fl->offset;
H5H_remove_free (heap, fl);
break;
@@ -570,15 +574,15 @@ H5H_insert (hdf5_file_t *f, haddr_t addr, size_t size, const void *buf)
if (offset<0) {
need_more = MAX (2*heap->mem_alloc, H5H_SIZEOF_FREE(f));
- need_more = MAX (need_more, size);
+ need_more = MAX (need_more, need);
if (max_fl && max_fl->offset+max_fl->size==heap->mem_alloc) {
/*
* Increase the size of the maximum free block.
*/
offset = max_fl->offset;
- max_fl->offset += size;
- max_fl->size += need_more - size;
+ max_fl->offset += need;
+ max_fl->size += need_more - need;
if (max_fl->size < H5H_SIZEOF_FREE(f)) {
#ifndef NDEBUG
@@ -600,18 +604,18 @@ H5H_insert (hdf5_file_t *f, haddr_t addr, size_t size, const void *buf)
* take some space out of it right away.
*/
offset = heap->mem_alloc;
- if (need_more-size >= H5H_SIZEOF_FREE(f)) {
+ if (need_more-need >= H5H_SIZEOF_FREE(f)) {
fl = H5MM_xmalloc (sizeof(H5H_free_t));
- fl->offset = heap->mem_alloc + size;
- fl->size = need_more - size;
+ fl->offset = heap->mem_alloc + need;
+ fl->size = need_more - need;
fl->prev = NULL;
fl->next = heap->freelist;
if (heap->freelist) heap->freelist->prev = fl;
heap->freelist = fl;
#ifndef NDEBUG
- } else if (need_more>size) {
+ } else if (need_more>need) {
fprintf (stderr, "H5H_insert: lost %d bytes at line %d\n",
- need_more-size, __LINE__);
+ need_more-need, __LINE__);
if (0==nmessages++) {
fprintf (stderr, "Messages from H5H_insert() will go away "
"when assertions are turned off.\n");
@@ -629,15 +633,19 @@ H5H_insert (hdf5_file_t *f, haddr_t addr, size_t size, const void *buf)
"when assertions are turned off.\n");
}
#endif
+ old_size = heap->mem_alloc;
heap->mem_alloc += need_more;
heap->chunk = H5MM_xrealloc (heap->chunk,
H5H_SIZEOF_HDR(f)+heap->mem_alloc);
+
+ /* clear new section so junk doesn't appear in the file */
+ memset (heap->chunk+H5H_SIZEOF_HDR(f)+old_size, 0, need_more);
}
/*
* Copy the data into the heap
*/
- HDmemcpy (heap->chunk + H5H_SIZEOF_HDR(f) + offset, buf, size);
+ HDmemcpy (heap->chunk + H5H_SIZEOF_HDR(f) + offset, buf, buf_size);
FUNC_LEAVE (offset);
}
@@ -796,7 +804,7 @@ H5H_remove (hdf5_file_t *f, haddr_t addr, off_t offset, size_t size)
* lost.
*/
if (size < H5H_SIZEOF_FREE(f)) {
-#ifndef NDEUBG
+#ifndef NDEBUG
fprintf (stderr, "H5H_remove: lost %d bytes\n", size);
if (0==nmessages++) {
fprintf (stderr, "Messages from H5H_remove() will go away "
diff --git a/src/H5Hprivate.h b/src/H5Hprivate.h
index dc5318f..6a05049 100644
--- a/src/H5Hprivate.h
+++ b/src/H5Hprivate.h
@@ -22,6 +22,7 @@
#define H5H_MAGIC "HEAP" /*heap magic number */
#define H5H_SIZEOF_MAGIC 4
+#define H5H_ALIGN(X) ((X)=((X)+1) & ~0x01)
typedef enum H5H_type_t {
H5H_LOCAL =0, /*local symtab name heap */
diff --git a/src/H5Ocont.c b/src/H5Ocont.c
index 068a768..7b184cb 100644
--- a/src/H5Ocont.c
+++ b/src/H5Ocont.c
@@ -23,6 +23,8 @@
#include "H5MMprivate.h"
#include "H5Oprivate.h"
+#define PABLO_MASK H5O_cont_mask
+
/* PRIVATE PROTOTYPES */
static void *H5O_cont_decode (hdf5_file_t *f, const uint8 *p);
static herr_t H5O_cont_encode (hdf5_file_t *f, size_t size, uint8 *p,
diff --git a/src/H5Onull.c b/src/H5Onull.c
index 97e1ff7..965266d 100644
--- a/src/H5Onull.c
+++ b/src/H5Onull.c
@@ -18,6 +18,8 @@
#include "H5private.h"
#include "H5Oprivate.h"
+#define PABLO_MASK H5O_null_mask
+
/* This message derives from H5O */
const H5O_class_t H5O_NULL[1] = {{
H5O_NULL_ID, /*message id number */
diff --git a/src/H5Oprivate.h b/src/H5Oprivate.h
index dfaa5b5..40d4a36 100644
--- a/src/H5Oprivate.h
+++ b/src/H5Oprivate.h
@@ -21,9 +21,9 @@
#include "H5Fprivate.h"
#include "H5Gprivate.h"
-#define H5O_MIN_SIZE 64 /*min obj header data size */
-#define H5O_NMESGS 64 /*initial number of messages */
-#define H5O_NCHUNKS 64 /*initial number of chunks */
+#define H5O_MIN_SIZE 16 /*min obj header data size */
+#define H5O_NMESGS 32 /*initial number of messages */
+#define H5O_NCHUNKS 8 /*initial number of chunks */
#define H5O_NEW_MESG (-1) /*new message */
#define H5O_NO_ADDR (-1) /*no disk address yet */
diff --git a/src/H5Ostab.c b/src/H5Ostab.c
index ec6dd61..d2c1394 100644
--- a/src/H5Ostab.c
+++ b/src/H5Ostab.c
@@ -23,6 +23,8 @@
#include "H5MMprivate.h"
#include "H5Oprivate.h"
+#define PABLO_MASK H5O_stab_mask
+
/* PRIVATE PROTOTYPES */
static void *H5O_stab_decode (hdf5_file_t *f, const uint8 *p);
static herr_t H5O_stab_encode (hdf5_file_t *f, size_t size, uint8 *p,
@@ -200,20 +202,26 @@ H5O_stab_cache (H5G_entry_t *ent, const void *_mesg)
assert (ent);
assert (stab);
- /* cache */
+ /*
+ * We do this in two steps so Purify doesn't complain about
+ * uninitialized memory reads even though they don't bother
+ * anything.
+ */
if (H5G_CACHED_STAB != ent->type) {
modified = TRUE;
ent->type = H5G_CACHED_STAB;
- }
-
- if (ent->cache.stab.btree != stab->btree) {
- modified = TRUE;
ent->cache.stab.btree = stab->btree;
- }
-
- if (ent->cache.stab.heap != stab->heap) {
- modified = TRUE;
ent->cache.stab.heap = stab->heap;
+ } else {
+ if (ent->cache.stab.btree != stab->btree) {
+ modified = TRUE;
+ ent->cache.stab.btree = stab->btree;
+ }
+
+ if (ent->cache.stab.heap != stab->heap) {
+ modified = TRUE;
+ ent->cache.stab.heap = stab->heap;
+ }
}
FUNC_LEAVE (modified);
diff --git a/src/debug.c b/src/debug.c
index d07b2cb..220b461 100644
--- a/src/debug.c
+++ b/src/debug.c
@@ -53,6 +53,7 @@ main (int argc, char *argv[])
uint8 sig[16];
intn i;
herr_t status = SUCCEED;
+ haddr_t extra = 0;
/*
* Parse command arguments.
@@ -61,6 +62,9 @@ main (int argc, char *argv[])
printf ("New address: %s\n", argv[2]);
addr = strtol (argv[2], NULL, 0);
}
+ if (argc>3) {
+ extra = strtol (argv[3], NULL, 0);
+ }
/*
* Open the file and get the file descriptor.
@@ -99,7 +103,7 @@ main (int argc, char *argv[])
/*
* Debug a symbol table node.
*/
- status = H5G_node_debug (f, addr, stdout, 0, VCOL);
+ status = H5G_node_debug (f, addr, stdout, 0, VCOL, extra);
} else if (!memcmp (sig, H5B_MAGIC, H5B_SIZEOF_MAGIC)) {
/*
@@ -110,7 +114,7 @@ main (int argc, char *argv[])
H5B_subid_t subtype = sig[H5B_SIZEOF_MAGIC];
switch (subtype) {
case H5B_SUBTYPE_SNODE:
- status = H5G_node_debug (f, addr, stdout, 0, VCOL);
+ status = H5G_node_debug (f, addr, stdout, 0, VCOL, extra);
break;
default:
diff --git a/src/hdf5.h b/src/hdf5.h
index 6f3c9bc..6252fc1 100644
--- a/src/hdf5.h
+++ b/src/hdf5.h
@@ -33,6 +33,7 @@
#include "ProcIDs.h"
#endif /* HAVE_PABLO */
+
/* Determine the system and set up basic info. */
#include "hdf5plat.h" /* Platform/OS/CPU detection header file (should be first header included) */
diff --git a/src/hdf5pabl.h b/src/hdf5pabl.h
index 008a265..6fa3922 100644
--- a/src/hdf5pabl.h
+++ b/src/hdf5pabl.h
@@ -20,7 +20,7 @@
#define HDF5PABL_H
#ifdef HAVE_PABLO
-#define PABLO_SAVE(func_id) int pablo_func_id = func_id
+#define PABLO_SAVE(func_id) intn pablo_func_id = func_id
#define PABLO_TRACE_ON(m, f) TRACE_ON(m,f)
#define PABLO_TRACE_OFF(m, f) TRACE_OFF(m,f)
#else /* no Pablo tracing enabled */
diff --git a/src/hdf5plat.h b/src/hdf5plat.h
index 25d89cb..d73e7e6 100644
--- a/src/hdf5plat.h
+++ b/src/hdf5plat.h
@@ -332,6 +332,10 @@ typedef float float32;
typedef double float64;
typedef int intf; /* size of INTEGERs in Fortran compiler */
+#define HDF5_HAVE_NATIVE_INT64
+typedef __int64_t int64;
+typedef __uint64_t uint64;
+
/* Fortran compatibility macros */
#define FNAME_POST_UNDERSCORE /* Fortran function names require trailing underscore */
#define _fcdtocp(desc) (desc) /* Macro to convert from Fortran character descriptor to C 'char *' */