summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--release_docs/RELEASE.txt31
-rw-r--r--src/H5Distore.c7
-rw-r--r--src/H5FD.c15
-rw-r--r--src/H5FLprivate.h4
-rw-r--r--src/H5Gnode.c3
-rw-r--r--src/H5HG.c35
-rw-r--r--src/H5HGdbg.c4
-rw-r--r--src/H5HGpkg.h2
8 files changed, 68 insertions, 33 deletions
diff --git a/release_docs/RELEASE.txt b/release_docs/RELEASE.txt
index 00b7050..89bd875 100644
--- a/release_docs/RELEASE.txt
+++ b/release_docs/RELEASE.txt
@@ -36,30 +36,35 @@ New Features
Configuration:
--------------
+ - Added some initial support for making purify (or similar memory
+ checking products) happier by initializing buffers to zero and
+ disabling the internal free list code. To take advantage of this,
+ define 'H5_USING_PURIFY' in your CFLAGS when building the library.
+ QAK - 2004/07/23
- Fixed the long compile time of H5detect.c when v7.x Intel Compiler
- is used with optimization NOT off. AKC - 2004/05/20
+ is used with optimization NOT off. AKC - 2004/05/20
- Fixed configure setting of C++ for OSF1 platform. AKC - 2004/01/06
- Prefix default is changed from /usr/local to `pwd`/hdf5.
- AKC - 2003/07/09
+ AKC - 2003/07/09
Library:
--------
- 4 new API functions, H5Tencode, H5Tdecode, H5Sencode, H5Sdecode were
- added to the library. Given object ID, these functions encode and
- decode HDF5 objects(data type and space) information into and from
- binary buffer. SLU - 2004/07/21
+ added to the library. Given object ID, these functions encode and
+ decode HDF5 objects(data type and space) information into and from
+ binary buffer. SLU - 2004/07/21
- Modified the way how HDF5 calculates 'pixels_per_scanline' parameter for
- SZIP compression. Now there is no restriction on the size and shape of the
- chunk except that the total number of elements in the chunk cannot be
- bigger than 'pixels_per_block' parameter provided by the user.
+ SZIP compression. Now there is no restriction on the size and shape of the
+ chunk except that the total number of elements in the chunk cannot be
+ bigger than 'pixels_per_block' parameter provided by the user.
EIP - 2004/07/21
- Added support for SZIP without encoder. Added H5Zget_filter_info
- and changed H5Pget_filter and H5Pget_filter_by_id to support this
- change. JL/NF - 2004/06/30
+ and changed H5Pget_filter and H5Pget_filter_by_id to support this
+ change. JL/NF - 2004/06/30
- SZIP always uses K13 compression. This flag no longer needs to
- be set when calling H5Pset_szip. If the flag for CHIP
- compression is set, it will be ignored (since the two are mutually
- exclusive). JL/NF - 2004/6/30
+ be set when calling H5Pset_szip. If the flag for CHIP
+ compression is set, it will be ignored (since the two are mutually
+ exclusive). JL/NF - 2004/6/30
- A new API function H5Fget_name was added. It returns the name
of the file by object(file, group, data set, named data type,
attribute) ID. SLU - 2004/06/29
diff --git a/src/H5Distore.c b/src/H5Distore.c
index da9776a..596350b 100644
--- a/src/H5Distore.c
+++ b/src/H5Distore.c
@@ -960,6 +960,9 @@ H5D_istore_init (H5F_t *f, H5D_t *dset)
assert(shared->sizeof_rnode);
if(NULL==(shared->page=H5FL_BLK_MALLOC(chunk_page,shared->sizeof_rnode)))
HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for B-tree page")
+#ifdef H5_USING_PURIFY
+HDmemset(shared->page,0,shared->sizeof_rnode);
+#endif /* H5_USING_PURIFY */
if(NULL==(shared->nkey=H5FL_SEQ_MALLOC(size_t,(size_t)(2*H5F_KVALUE(f,H5B_ISTORE)+1))))
HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for B-tree page")
@@ -1597,6 +1600,10 @@ H5D_istore_lock(H5F_t *f, const H5D_dxpl_cache_t *dxpl_cache, hid_t dxpl_id,
HDmemset (chunk, 0, chunk_size);
} /* end else */
} /* end if */
+#ifdef H5_USING_PURIFY
+else
+ HDmemset(ret_value,0,size);
+#endif /* H5_USING_PURIFY */
rdcc->ninits++;
} /* end else */
}
diff --git a/src/H5FD.c b/src/H5FD.c
index a5bbd9d..af58337 100644
--- a/src/H5FD.c
+++ b/src/H5FD.c
@@ -3357,6 +3357,9 @@ H5FD_write(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr, size_t si
/* Reallocate the metadata accumulator buffer */
if ((file->meta_accum=H5FL_BLK_REALLOC(meta_accum,file->meta_accum,file->accum_buf_size))==NULL)
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "unable to allocate metadata accumulator buffer")
+#ifdef H5_USING_PURIFY
+HDmemset(file->meta_accum+file->accum_size,0,(file->accum_buf_size-file->accum_size));
+#endif /* H5_USING_PURIFY */
} /* end if */
/* Move the existing metadata to the proper location */
@@ -3382,6 +3385,9 @@ H5FD_write(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr, size_t si
/* Reallocate the metadata accumulator buffer */
if ((file->meta_accum=H5FL_BLK_REALLOC(meta_accum,file->meta_accum,file->accum_buf_size))==NULL)
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "unable to allocate metadata accumulator buffer")
+#ifdef H5_USING_PURIFY
+HDmemset(file->meta_accum+file->accum_size,0,(file->accum_buf_size-file->accum_size));
+#endif /* H5_USING_PURIFY */
} /* end if */
/* Copy the new metadata to the end */
@@ -3414,6 +3420,9 @@ H5FD_write(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr, size_t si
/* Reallocate the metadata accumulator buffer */
if ((file->meta_accum=H5FL_BLK_REALLOC(meta_accum,file->meta_accum,file->accum_buf_size))==NULL)
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "unable to allocate metadata accumulator buffer")
+#ifdef H5_USING_PURIFY
+HDmemset(file->meta_accum+file->accum_size,0,(file->accum_buf_size-file->accum_size));
+#endif /* H5_USING_PURIFY */
} /* end if */
/* Calculate the proper offset of the existing metadata */
@@ -3445,6 +3454,9 @@ H5FD_write(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr, size_t si
/* Reallocate the metadata accumulator buffer */
if ((file->meta_accum=H5FL_BLK_REALLOC(meta_accum,file->meta_accum,file->accum_buf_size))==NULL)
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "unable to allocate metadata accumulator buffer")
+#ifdef H5_USING_PURIFY
+HDmemset(file->meta_accum+file->accum_size,0,(file->accum_buf_size-file->accum_size));
+#endif /* H5_USING_PURIFY */
} /* end if */
/* Copy the new metadata to the end */
@@ -3479,6 +3491,9 @@ H5FD_write(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr, size_t si
/* Note the new buffer size */
file->accum_buf_size=size;
+#ifdef H5_USING_PURIFY
+HDmemset(file->meta_accum+file->accum_size,0,(file->accum_buf_size-file->accum_size));
+#endif /* H5_USING_PURIFY */
} /* end if */
else {
/* Check if we should shrink the accumulator buffer */
diff --git a/src/H5FLprivate.h b/src/H5FLprivate.h
index efcee82..641a630 100644
--- a/src/H5FLprivate.h
+++ b/src/H5FLprivate.h
@@ -35,8 +35,8 @@
/* Private headers needed by this file */
/* Macros for turning off free lists in the library */
-/*#define H5_NO_FREE_LISTS*/
-#ifdef H5_NO_FREE_LISTS
+/* #define H5_NO_FREE_LISTS */
+#if defined H5_NO_FREE_LISTS || defined H5_USING_PURIFY
#define H5_NO_REG_FREE_LISTS
#define H5_NO_ARR_FREE_LISTS
#define H5_NO_SEQ_FREE_LISTS
diff --git a/src/H5Gnode.c b/src/H5Gnode.c
index 6743c7e..52194cc 100644
--- a/src/H5Gnode.c
+++ b/src/H5Gnode.c
@@ -1752,6 +1752,9 @@ H5G_node_init(H5F_t *f)
assert(shared->sizeof_rnode);
if(NULL==(shared->page=H5FL_BLK_MALLOC(grp_page,shared->sizeof_rnode)))
HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for B-tree page")
+#ifdef H5_USING_PURIFY
+HDmemset(shared->page,0,shared->sizeof_rnode);
+#endif /* H5_USING_PURIFY */
if(NULL==(shared->nkey=H5FL_SEQ_MALLOC(size_t,(size_t)(2*H5F_KVALUE(f,H5B_SNODE)+1))))
HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for B-tree page")
diff --git a/src/H5HG.c b/src/H5HG.c
index 6ccc0fe..252af88 100644
--- a/src/H5HG.c
+++ b/src/H5HG.c
@@ -218,8 +218,11 @@ H5HG_create (H5F_t *f, hid_t dxpl_id, size_t size)
if (NULL==(heap->chunk = H5FL_BLK_MALLOC (heap_chunk,size)))
HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, HADDR_UNDEF, \
"memory allocation failed");
+#ifdef H5_USING_PURIFY
+HDmemset(heap->chunk,0,size);
+#endif /* H5_USING_PURIFY */
heap->nalloc = H5HG_NOBJS (f, size);
- heap->next_idx = 1; /* skip index 0, which is used for the free object */
+ heap->nused = 1; /* account for index 0, which is used for the free object */
if (NULL==(heap->obj = H5FL_SEQ_MALLOC (H5HG_obj_t,heap->nalloc)))
HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, HADDR_UNDEF, \
"memory allocation failed");
@@ -444,9 +447,9 @@ H5HG_load (H5F_t *f, hid_t dxpl_id, haddr_t addr, const void UNUSED * udata1,
/* Set the next index value to use */
if(max_idx>0)
- heap->next_idx=max_idx+1;
+ heap->nused=max_idx+1;
else
- heap->next_idx=1;
+ heap->nused=1;
/*
* Add the new heap to the CWFS list, removing some other entry if
@@ -682,11 +685,10 @@ H5HG_alloc (H5F_t *f, H5HG_heap_t *heap, size_t size)
* Find an ID for the new object. ID zero is reserved for the free space
* object.
*/
- if(heap->next_idx<H5HG_MAXIDX) {
- idx=heap->next_idx++;
- } /* end if */
+ if(heap->nused<H5HG_MAXIDX)
+ idx=heap->nused++;
else {
- for (idx=1; idx<heap->nalloc; idx++)
+ for (idx=1; idx<heap->nused; idx++)
if (NULL==heap->obj[idx].begin)
break;
} /* end else */
@@ -707,7 +709,7 @@ H5HG_alloc (H5F_t *f, H5HG_heap_t *heap, size_t size)
/* Update heap information */
heap->nalloc=new_alloc;
heap->obj=new_obj;
- assert(heap->nalloc>heap->next_idx);
+ assert(heap->nalloc>heap->nused);
} /* end if */
/* Initialize the new object */
@@ -815,6 +817,9 @@ H5HG_extend (H5F_t *f, H5HG_heap_t *heap, size_t size)
/* Re-allocate the heap information in memory */
if (NULL==(new_chunk = H5FL_BLK_REALLOC (heap_chunk, heap->chunk, heap->size+need)))
HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, FAIL, "new heap allocation failed");
+#ifdef H5_USING_PURIFY
+HDmemset(new_chunk+heap->size,0,need);
+#endif /* H5_USING_PURIFY */
/* Adjust the size of the heap */
old_size=heap->size;
@@ -825,7 +830,7 @@ H5HG_extend (H5F_t *f, H5HG_heap_t *heap, size_t size)
H5F_ENCODE_LENGTH (f, p, heap->size);
/* Move the pointers to the existing objects to their new locations */
- for (u=0; u<heap->nalloc; u++)
+ for (u=0; u<heap->nused; u++)
if(heap->obj[u].begin)
heap->obj[u].begin = new_chunk + (heap->obj[u].begin - heap->chunk);
@@ -1081,7 +1086,7 @@ H5HG_peek (H5F_t *f, hid_t dxpl_id, H5HG_t *hobj)
if (NULL == (heap = H5AC_protect(f, dxpl_id, H5AC_GHEAP, hobj->addr, NULL, NULL, H5AC_READ)))
HGOTO_ERROR (H5E_HEAP, H5E_CANTLOAD, NULL, "unable to load heap");
- assert (hobj->idx>0 && hobj->idx<heap->nalloc);
+ assert (hobj->idx>0 && hobj->idx<heap->nused);
ret_value = heap->obj[hobj->idx].begin + H5HG_SIZEOF_OBJHDR (f);
assert (ret_value);
@@ -1148,7 +1153,7 @@ H5HG_read (H5F_t *f, hid_t dxpl_id, H5HG_t *hobj, void *object/*out*/)
if (NULL == (heap = H5AC_protect(f, dxpl_id, H5AC_GHEAP, hobj->addr, NULL, NULL, H5AC_READ)))
HGOTO_ERROR (H5E_HEAP, H5E_CANTLOAD, NULL, "unable to load heap");
- assert (hobj->idx>0 && hobj->idx<heap->nalloc);
+ assert (hobj->idx>0 && hobj->idx<heap->nused);
assert (heap->obj[hobj->idx].begin);
size = heap->obj[hobj->idx].size;
p = heap->obj[hobj->idx].begin + H5HG_SIZEOF_OBJHDR (f);
@@ -1222,7 +1227,7 @@ H5HG_link (H5F_t *f, hid_t dxpl_id, const H5HG_t *hobj, int adjust)
if (NULL == (heap = H5AC_protect(f, dxpl_id, H5AC_GHEAP, hobj->addr, NULL, NULL, H5AC_WRITE)))
HGOTO_ERROR(H5E_HEAP, H5E_CANTLOAD, FAIL, "unable to load heap");
- assert (hobj->idx>0 && hobj->idx<heap->nalloc);
+ assert (hobj->idx>0 && hobj->idx<heap->nused);
assert (heap->obj[hobj->idx].begin);
if (heap->obj[hobj->idx].nrefs+adjust<0)
HGOTO_ERROR (H5E_HEAP, H5E_BADRANGE, FAIL, "new link count would be out of range");
@@ -1280,14 +1285,14 @@ H5HG_remove (H5F_t *f, hid_t dxpl_id, H5HG_t *hobj)
if (NULL == (heap = H5AC_protect(f, dxpl_id, H5AC_GHEAP, hobj->addr, NULL, NULL, H5AC_WRITE)))
HGOTO_ERROR(H5E_HEAP, H5E_CANTLOAD, FAIL, "unable to load heap");
- assert (hobj->idx>0 && hobj->idx<heap->nalloc);
+ assert (hobj->idx>0 && hobj->idx<heap->nused);
assert (heap->obj[hobj->idx].begin);
obj_start = heap->obj[hobj->idx].begin;
/* Include object header size */
need = H5HG_ALIGN(heap->obj[hobj->idx].size)+H5HG_SIZEOF_OBJHDR(f);
/* Move the new free space to the end of the heap */
- for (u=0; u<heap->nalloc; u++) {
+ for (u=0; u<heap->nused; u++) {
if (heap->obj[u].begin > heap->obj[hobj->idx].begin)
heap->obj[u].begin -= need;
}
@@ -1331,7 +1336,7 @@ H5HG_remove (H5F_t *f, hid_t dxpl_id, H5HG_t *hobj)
f->shared->cwfs[i] = f->shared->cwfs[i-1];
f->shared->cwfs[i-1] = heap;
}
- break;
+ break;
}
}
if (i>=f->shared->ncwfs) {
diff --git a/src/H5HGdbg.c b/src/H5HGdbg.c
index dccdc54..68a3e85 100644
--- a/src/H5HGdbg.c
+++ b/src/H5HGdbg.c
@@ -80,7 +80,7 @@ H5HG_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent,
"Total collection size in file:",
(unsigned long)(h->size));
- for (u=1, nused=0, maxobj=0; u<h->nalloc; u++) {
+ for (u=1, nused=0, maxobj=0; u<h->nused; u++) {
if (h->obj[u].begin) {
nused++;
if (u>maxobj) maxobj = u;
@@ -95,7 +95,7 @@ H5HG_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent,
"Free space:",
(unsigned long)(h->obj[0].size));
- for (u=1; u<h->nalloc; u++) {
+ for (u=1; u<h->nused; u++) {
if (h->obj[u].begin) {
sprintf (buf, "Object %u", u);
fprintf (stream, "%*s%s\n", indent, "", buf);
diff --git a/src/H5HGpkg.h b/src/H5HGpkg.h
index 8eb56e6..de5bb77 100644
--- a/src/H5HGpkg.h
+++ b/src/H5HGpkg.h
@@ -81,7 +81,7 @@ struct H5HG_heap_t {
size_t size; /*total size of collection */
uint8_t *chunk; /*the collection, incl. header */
size_t nalloc; /*numb object slots allocated */
- size_t next_idx; /* Object index to use next */
+ size_t nused; /*number of slots used */
/* If this value is >65535 then all indices */
/* have been used at some time and the */
/* correct new index should be searched for */