From 7a07c6cc133e62f5f00e6a4baf214c9011657800 Mon Sep 17 00:00:00 2001 From: Quincey Koziol Date: Sun, 25 Jul 2004 23:41:48 -0500 Subject: [svn-r8946] Purpose: Code cleanup, sorta Description: Added ifdef sections for "H5_USING_PURIFY" in various places in the code, which are designed to reduce the spurious "uninitialized memory read" warnings from purify which are actually OK. Note that this macro will have to be turned on by adding it to the CFLAGS for the build - I didn't think it was important enough to add a configure flag for. Also, the changes in H5HG.c optimize the walks through the objects in a heap to only look at the 'used' entries instead of all the 'allocated' entries. Platforms tested: Solaris 2.7 (arabica) w/purify Not tested by h5committest --- release_docs/RELEASE.txt | 31 ++++++++++++++++++------------- src/H5Distore.c | 7 +++++++ src/H5FD.c | 15 +++++++++++++++ src/H5FLprivate.h | 4 ++-- src/H5Gnode.c | 3 +++ src/H5HG.c | 35 ++++++++++++++++++++--------------- src/H5HGdbg.c | 4 ++-- src/H5HGpkg.h | 2 +- 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_idxnext_idx++; - } /* end if */ + if(heap->nusednused++; else { - for (idx=1; idxnalloc; idx++) + for (idx=1; idxnused; 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; unalloc; u++) + for (u=0; unused; 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->idxnalloc); + assert (hobj->idx>0 && hobj->idxnused); 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->idxnalloc); + assert (hobj->idx>0 && hobj->idxnused); 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->idxnalloc); + assert (hobj->idx>0 && hobj->idxnused); 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->idxnalloc); + assert (hobj->idx>0 && hobj->idxnused); 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; unalloc; u++) { + for (u=0; unused; 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; unalloc; u++) { + for (u=1, nused=0, maxobj=0; unused; 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; unalloc; u++) { + for (u=1; unused; 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 */ -- cgit v0.12