From 64b7be4a52b14dfefc7729aaf8be6649fb668cc4 Mon Sep 17 00:00:00 2001
From: Quincey Koziol <koziol@hdfgroup.org>
Date: Tue, 18 Jun 2002 09:39:26 -0500
Subject: [svn-r5662] Purpose:     Bug fix.

Description:
    The chunking code was using internal allocation routines to put blocks on
    a free list for reuse, instead of using the system allocation routines (ie.
    malloc, free, etc.).  This causes problems when user filters attempt to
    allocate/free chunks for their algorithm's use.

Solution:
    Switched the chunking code back to using the system allocation routines,
    we can address performance issues with them if it becomes a real problem.

Platforms tested:
    Linux 2.2.x (eirene) && IRIX64 6.5 (modi4)
---
 release_docs/RELEASE.txt |   4 ++
 src/H5Distore.c          | 116 +++++------------------------------------------
 src/H5Fistore.c          | 116 +++++------------------------------------------
 src/H5Fprivate.h         |   5 --
 src/H5Zdeflate.c         |  12 ++---
 5 files changed, 32 insertions(+), 221 deletions(-)

diff --git a/release_docs/RELEASE.txt b/release_docs/RELEASE.txt
index 586d1e4..aa608a3 100644
--- a/release_docs/RELEASE.txt
+++ b/release_docs/RELEASE.txt
@@ -35,6 +35,10 @@ Bug Fixes since HDF5-1.4.0
 
 Library
 -------
+    * Fixed bug in chunking routines where they were using internal allocation
+      free routines, instead of malloc/free, preventing user filters from
+      working correctly.  Chunks are now allocated/freed with malloc/free and
+      so should the chunks in user filters.  QAK 2002/06/18
     * Fixed bug where regular hyperslab selection could get incorrectly
       transferred when the number of elements in a row did not fit evenly
       into the buffer provided.  QAK 2002/06/12
diff --git a/src/H5Distore.c b/src/H5Distore.c
index 03fd598..913bdf9 100644
--- a/src/H5Distore.c
+++ b/src/H5Distore.c
@@ -191,9 +191,6 @@ H5B_class_t H5B_ISTORE[1] = {{
 #define H5F_HASH(F,ADDR) H5F_addr_hash((ADDR/H5F_HASH_DIVISOR),(F)->shared->rdcc.nslots)
 
 
-/* Declare a free list to manage the chunk information */
-H5FL_BLK_DEFINE_STATIC(istore_chunk);
-
 /* Declare a free list to manage H5F_rdcc_ent_t objects */
 H5FL_DEFINE_STATIC(H5F_rdcc_ent_t);
 
@@ -202,97 +199,6 @@ H5FL_ARR_DEFINE_STATIC(H5F_rdcc_ent_ptr_t,-1);
 
 
 /*-------------------------------------------------------------------------
- * Function:	H5F_istore_chunk_alloc
- *
- * Purpose:	Allocates memory for a chunk of a dataset.  This routine is used
- *      instead of malloc because the chunks can be kept on a free list so
- *      they don't thrash malloc/free as much.
- *
- * Return:	Success:	valid pointer to the chunk
- *
- *		Failure:	NULL
- *
- * Programmer:	Quincey Koziol
- *		Tuesday, March  21, 2000
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-void *
-H5F_istore_chunk_alloc(size_t chunk_size)
-{
-    void *ret_value;                    /* Pointer to the chunk to return to the user */
-
-    FUNC_ENTER_NOAPI(H5F_istore_chunk_alloc, NULL);
-
-    ret_value=H5FL_BLK_ALLOC(istore_chunk,chunk_size,0);
-
-    FUNC_LEAVE(ret_value);
-} /* end H5F_istore_chunk_alloc() */
-
-
-/*-------------------------------------------------------------------------
- * Function:	H5F_istore_chunk_free
- *
- * Purpose:	Releases memory for a chunk of a dataset.  This routine is used
- *      instead of free because the chunks can be kept on a free list so
- *      they don't thrash malloc/free as much.
- *
- * Return:	Success:	NULL
- *
- *		Failure:	never fails
- *
- * Programmer:	Quincey Koziol
- *		Tuesday, March  21, 2000
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-void *
-H5F_istore_chunk_free(void *chunk)
-{
-    FUNC_ENTER_NOAPI(H5F_istore_chunk_free, NULL);
-
-    H5FL_BLK_FREE(istore_chunk,chunk);
-
-    FUNC_LEAVE(NULL);
-} /* end H5F_istore_chunk_free() */
-
-
-/*-------------------------------------------------------------------------
- * Function:	H5F_istore_chunk_realloc
- *
- * Purpose:	Resizes a chunk in chunking memory allocation system.  This
- *      does things the straightforward, simple way, not actually using
- *      realloc.
- *
- * Return:	Success:	NULL
- *
- *		Failure:	never fails
- *
- * Programmer:	Quincey Koziol
- *		Tuesday, March  21, 2000
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-void *
-H5F_istore_chunk_realloc(void *chunk, size_t new_size)
-{
-    void *ret_value=NULL;               /* Return value */
-
-    FUNC_ENTER_NOAPI(H5F_istore_chunk_realloc, NULL);
-
-    ret_value=H5FL_BLK_REALLOC(istore_chunk,chunk,new_size);
-
-    FUNC_LEAVE(ret_value);
-} /* end H5F_istore_chunk_realloc() */
-
-
-/*-------------------------------------------------------------------------
  * Function:	H5F_istore_sizeof_rkey
  *
  * Purpose:	Returns the size of a raw key for the specified UDATA.	The
@@ -1016,7 +922,7 @@ H5F_istore_flush_entry(H5F_t *f, H5F_rdcc_ent_t *ent, hbool_t reset)
                  * for later.
                  */
                 alloc = ent->chunk_size;
-                if (NULL==(buf = H5F_istore_chunk_alloc(alloc))) {
+                if (NULL==(buf = H5MM_malloc(alloc))) {
                     HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL,
                         "memory allocation failed for pipeline");
                 }
@@ -1060,7 +966,7 @@ H5F_istore_flush_entry(H5F_t *f, H5F_rdcc_ent_t *ent, hbool_t reset)
         ent->pline = H5O_free(H5O_PLINE, ent->pline);
         if (buf==ent->chunk) buf = NULL;
         if(ent->chunk!=NULL)
-            ent->chunk = H5F_istore_chunk_free(ent->chunk);
+            ent->chunk = H5MM_xfree(ent->chunk);
     }
     
     ret_value = SUCCEED;
@@ -1068,7 +974,7 @@ H5F_istore_flush_entry(H5F_t *f, H5F_rdcc_ent_t *ent, hbool_t reset)
 done:
     /* Free the temp buffer only if it's different than the entry chunk */
     if (buf!=ent->chunk)
-        H5F_istore_chunk_free(buf);
+        H5MM_xfree(buf);
     
     /*
      * If we reached the point of no return then we have no choice but to
@@ -1080,7 +986,7 @@ done:
         ent->layout = H5O_free(H5O_LAYOUT, ent->layout);
         ent->pline = H5O_free(H5O_PLINE, ent->pline);
         if(ent->chunk)
-            ent->chunk = H5F_istore_chunk_free(ent->chunk);
+            ent->chunk = H5MM_xfree(ent->chunk);
     }
     FUNC_LEAVE(ret_value);
 }
@@ -1131,7 +1037,7 @@ H5F_istore_preempt(H5F_t *f, H5F_rdcc_ent_t * ent, hbool_t flush)
 	ent->layout = H5O_free(H5O_LAYOUT, ent->layout);
 	ent->pline = H5O_free(H5O_PLINE, ent->pline);
 	if(ent->chunk != NULL)
-	    ent->chunk = H5F_istore_chunk_free(ent->chunk);
+	    ent->chunk = H5MM_xfree(ent->chunk);
 
     }
 
@@ -1467,7 +1373,7 @@ H5F_istore_lock(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout,
         }
         H5_ASSIGN_OVERFLOW(chunk_size,tempchunk_size,hsize_t,size_t);
         chunk_alloc = chunk_size;
-        if (NULL==(chunk=H5F_istore_chunk_alloc (chunk_alloc))) {
+        if (NULL==(chunk=H5MM_malloc (chunk_alloc))) {
             HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL,
                  "memory allocation failed for raw data chunk");
         }
@@ -1487,7 +1393,7 @@ H5F_istore_lock(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout,
         udata.addr = HADDR_UNDEF;
         status = H5B_find (f, H5B_ISTORE, layout->addr, &udata);
         H5E_clear ();
-        if (NULL==(chunk = H5F_istore_chunk_alloc (chunk_alloc))) {
+        if (NULL==(chunk = H5MM_malloc (chunk_alloc))) {
             HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL,
                  "memory allocation failed for raw data chunk");
         }
@@ -1645,7 +1551,7 @@ H5F_istore_lock(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout,
     
  done:
     if (!ret_value)
-        H5F_istore_chunk_free (chunk);
+        H5MM_xfree (chunk);
     FUNC_LEAVE (ret_value);
 }
 
@@ -1731,7 +1637,7 @@ H5F_istore_unlock(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout,
             H5F_istore_flush_entry (f, &x, TRUE);
         } else {
             if(chunk)
-                H5F_istore_chunk_free (chunk);
+                H5MM_xfree (chunk);
         }
     } else {
         /*
@@ -2490,7 +2396,7 @@ H5F_istore_allocate(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout,
     /* Check if fill values should be written to blocks */
     if(fill_time != H5D_FILL_TIME_NEVER) {
         /* Allocate chunk buffer for processes to use when writing fill values */
-        if (NULL==(chunk = H5F_istore_chunk_alloc(chunk_size)))
+        if (NULL==(chunk = H5MM_malloc(chunk_size)))
             HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for chunk");
 
         /* Fill the chunk with the proper values */
@@ -2569,7 +2475,7 @@ H5F_istore_allocate(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout,
 done:
     /* Free the chunk for fill values */
     if(chunk!=NULL)
-        H5F_istore_chunk_free(chunk);
+        H5MM_xfree(chunk);
 
     FUNC_LEAVE(ret_value);
 }
diff --git a/src/H5Fistore.c b/src/H5Fistore.c
index 03fd598..913bdf9 100644
--- a/src/H5Fistore.c
+++ b/src/H5Fistore.c
@@ -191,9 +191,6 @@ H5B_class_t H5B_ISTORE[1] = {{
 #define H5F_HASH(F,ADDR) H5F_addr_hash((ADDR/H5F_HASH_DIVISOR),(F)->shared->rdcc.nslots)
 
 
-/* Declare a free list to manage the chunk information */
-H5FL_BLK_DEFINE_STATIC(istore_chunk);
-
 /* Declare a free list to manage H5F_rdcc_ent_t objects */
 H5FL_DEFINE_STATIC(H5F_rdcc_ent_t);
 
@@ -202,97 +199,6 @@ H5FL_ARR_DEFINE_STATIC(H5F_rdcc_ent_ptr_t,-1);
 
 
 /*-------------------------------------------------------------------------
- * Function:	H5F_istore_chunk_alloc
- *
- * Purpose:	Allocates memory for a chunk of a dataset.  This routine is used
- *      instead of malloc because the chunks can be kept on a free list so
- *      they don't thrash malloc/free as much.
- *
- * Return:	Success:	valid pointer to the chunk
- *
- *		Failure:	NULL
- *
- * Programmer:	Quincey Koziol
- *		Tuesday, March  21, 2000
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-void *
-H5F_istore_chunk_alloc(size_t chunk_size)
-{
-    void *ret_value;                    /* Pointer to the chunk to return to the user */
-
-    FUNC_ENTER_NOAPI(H5F_istore_chunk_alloc, NULL);
-
-    ret_value=H5FL_BLK_ALLOC(istore_chunk,chunk_size,0);
-
-    FUNC_LEAVE(ret_value);
-} /* end H5F_istore_chunk_alloc() */
-
-
-/*-------------------------------------------------------------------------
- * Function:	H5F_istore_chunk_free
- *
- * Purpose:	Releases memory for a chunk of a dataset.  This routine is used
- *      instead of free because the chunks can be kept on a free list so
- *      they don't thrash malloc/free as much.
- *
- * Return:	Success:	NULL
- *
- *		Failure:	never fails
- *
- * Programmer:	Quincey Koziol
- *		Tuesday, March  21, 2000
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-void *
-H5F_istore_chunk_free(void *chunk)
-{
-    FUNC_ENTER_NOAPI(H5F_istore_chunk_free, NULL);
-
-    H5FL_BLK_FREE(istore_chunk,chunk);
-
-    FUNC_LEAVE(NULL);
-} /* end H5F_istore_chunk_free() */
-
-
-/*-------------------------------------------------------------------------
- * Function:	H5F_istore_chunk_realloc
- *
- * Purpose:	Resizes a chunk in chunking memory allocation system.  This
- *      does things the straightforward, simple way, not actually using
- *      realloc.
- *
- * Return:	Success:	NULL
- *
- *		Failure:	never fails
- *
- * Programmer:	Quincey Koziol
- *		Tuesday, March  21, 2000
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-void *
-H5F_istore_chunk_realloc(void *chunk, size_t new_size)
-{
-    void *ret_value=NULL;               /* Return value */
-
-    FUNC_ENTER_NOAPI(H5F_istore_chunk_realloc, NULL);
-
-    ret_value=H5FL_BLK_REALLOC(istore_chunk,chunk,new_size);
-
-    FUNC_LEAVE(ret_value);
-} /* end H5F_istore_chunk_realloc() */
-
-
-/*-------------------------------------------------------------------------
  * Function:	H5F_istore_sizeof_rkey
  *
  * Purpose:	Returns the size of a raw key for the specified UDATA.	The
@@ -1016,7 +922,7 @@ H5F_istore_flush_entry(H5F_t *f, H5F_rdcc_ent_t *ent, hbool_t reset)
                  * for later.
                  */
                 alloc = ent->chunk_size;
-                if (NULL==(buf = H5F_istore_chunk_alloc(alloc))) {
+                if (NULL==(buf = H5MM_malloc(alloc))) {
                     HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL,
                         "memory allocation failed for pipeline");
                 }
@@ -1060,7 +966,7 @@ H5F_istore_flush_entry(H5F_t *f, H5F_rdcc_ent_t *ent, hbool_t reset)
         ent->pline = H5O_free(H5O_PLINE, ent->pline);
         if (buf==ent->chunk) buf = NULL;
         if(ent->chunk!=NULL)
-            ent->chunk = H5F_istore_chunk_free(ent->chunk);
+            ent->chunk = H5MM_xfree(ent->chunk);
     }
     
     ret_value = SUCCEED;
@@ -1068,7 +974,7 @@ H5F_istore_flush_entry(H5F_t *f, H5F_rdcc_ent_t *ent, hbool_t reset)
 done:
     /* Free the temp buffer only if it's different than the entry chunk */
     if (buf!=ent->chunk)
-        H5F_istore_chunk_free(buf);
+        H5MM_xfree(buf);
     
     /*
      * If we reached the point of no return then we have no choice but to
@@ -1080,7 +986,7 @@ done:
         ent->layout = H5O_free(H5O_LAYOUT, ent->layout);
         ent->pline = H5O_free(H5O_PLINE, ent->pline);
         if(ent->chunk)
-            ent->chunk = H5F_istore_chunk_free(ent->chunk);
+            ent->chunk = H5MM_xfree(ent->chunk);
     }
     FUNC_LEAVE(ret_value);
 }
@@ -1131,7 +1037,7 @@ H5F_istore_preempt(H5F_t *f, H5F_rdcc_ent_t * ent, hbool_t flush)
 	ent->layout = H5O_free(H5O_LAYOUT, ent->layout);
 	ent->pline = H5O_free(H5O_PLINE, ent->pline);
 	if(ent->chunk != NULL)
-	    ent->chunk = H5F_istore_chunk_free(ent->chunk);
+	    ent->chunk = H5MM_xfree(ent->chunk);
 
     }
 
@@ -1467,7 +1373,7 @@ H5F_istore_lock(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout,
         }
         H5_ASSIGN_OVERFLOW(chunk_size,tempchunk_size,hsize_t,size_t);
         chunk_alloc = chunk_size;
-        if (NULL==(chunk=H5F_istore_chunk_alloc (chunk_alloc))) {
+        if (NULL==(chunk=H5MM_malloc (chunk_alloc))) {
             HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL,
                  "memory allocation failed for raw data chunk");
         }
@@ -1487,7 +1393,7 @@ H5F_istore_lock(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout,
         udata.addr = HADDR_UNDEF;
         status = H5B_find (f, H5B_ISTORE, layout->addr, &udata);
         H5E_clear ();
-        if (NULL==(chunk = H5F_istore_chunk_alloc (chunk_alloc))) {
+        if (NULL==(chunk = H5MM_malloc (chunk_alloc))) {
             HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL,
                  "memory allocation failed for raw data chunk");
         }
@@ -1645,7 +1551,7 @@ H5F_istore_lock(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout,
     
  done:
     if (!ret_value)
-        H5F_istore_chunk_free (chunk);
+        H5MM_xfree (chunk);
     FUNC_LEAVE (ret_value);
 }
 
@@ -1731,7 +1637,7 @@ H5F_istore_unlock(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout,
             H5F_istore_flush_entry (f, &x, TRUE);
         } else {
             if(chunk)
-                H5F_istore_chunk_free (chunk);
+                H5MM_xfree (chunk);
         }
     } else {
         /*
@@ -2490,7 +2396,7 @@ H5F_istore_allocate(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout,
     /* Check if fill values should be written to blocks */
     if(fill_time != H5D_FILL_TIME_NEVER) {
         /* Allocate chunk buffer for processes to use when writing fill values */
-        if (NULL==(chunk = H5F_istore_chunk_alloc(chunk_size)))
+        if (NULL==(chunk = H5MM_malloc(chunk_size)))
             HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for chunk");
 
         /* Fill the chunk with the proper values */
@@ -2569,7 +2475,7 @@ H5F_istore_allocate(H5F_t *f, hid_t dxpl_id, const H5O_layout_t *layout,
 done:
     /* Free the chunk for fill values */
     if(chunk!=NULL)
-        H5F_istore_chunk_free(chunk);
+        H5MM_xfree(chunk);
 
     FUNC_LEAVE(ret_value);
 }
diff --git a/src/H5Fprivate.h b/src/H5Fprivate.h
index c18c331..6c7e913 100644
--- a/src/H5Fprivate.h
+++ b/src/H5Fprivate.h
@@ -400,11 +400,6 @@ __DLL__ herr_t H5F_istore_initialize_by_extent( H5F_t *f,
         const struct H5O_layout_t *layout, struct H5P_genplist_t *dc_plist,
         const struct H5S_t *space );
 
-/* Functions for allocation/releasing chunks */
-__DLL__ void * H5F_istore_chunk_alloc(size_t chunk_size);
-__DLL__ void * H5F_istore_chunk_realloc(void *chunk, size_t new_size);
-__DLL__ void * H5F_istore_chunk_free(void *chunk);
-
 /* Address-related functions */
 __DLL__ void H5F_addr_encode(H5F_t *, uint8_t** /*in,out*/, haddr_t);
 __DLL__ void H5F_addr_decode(H5F_t *, const uint8_t** /*in,out*/,
diff --git a/src/H5Zdeflate.c b/src/H5Zdeflate.c
index 57cabb3..3f43310 100644
--- a/src/H5Zdeflate.c
+++ b/src/H5Zdeflate.c
@@ -72,7 +72,7 @@ H5Z_filter_deflate (unsigned UNUSED flags, size_t cd_nelmts,
 	z_stream	z_strm;
 	size_t		nalloc = *buf_size;
 
-	if (NULL==(outbuf = H5F_istore_chunk_alloc(nalloc))) {
+	if (NULL==(outbuf = H5MM_malloc(nalloc))) {
 	    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, 0,
 			"memory allocation failed for deflate uncompression");
 	}
@@ -93,7 +93,7 @@ H5Z_filter_deflate (unsigned UNUSED flags, size_t cd_nelmts,
 	    }
 	    if (Z_OK==status && 0==z_strm.avail_out) {
 		nalloc *= 2;
-		if (NULL==(outbuf = H5F_istore_chunk_realloc(outbuf, nalloc))) {
+		if (NULL==(outbuf = H5MM_realloc(outbuf, nalloc))) {
 		    inflateEnd(&z_strm);
 		    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, 0,
 				"memory allocation failed for deflate "
@@ -104,7 +104,7 @@ H5Z_filter_deflate (unsigned UNUSED flags, size_t cd_nelmts,
 	    }
 	}
 	
-	H5F_istore_chunk_free(*buf);
+	H5MM_xfree(*buf);
 	*buf = outbuf;
 	outbuf = NULL;
 	*buf_size = nalloc;
@@ -122,7 +122,7 @@ H5Z_filter_deflate (unsigned UNUSED flags, size_t cd_nelmts,
 	uLongf		z_dst_nbytes = (uLongf)nbytes;
 	uLong		z_src_nbytes = (uLong)nbytes;
 
-	if (NULL==(z_dst=outbuf=H5F_istore_chunk_alloc(nbytes))) {
+	if (NULL==(z_dst=outbuf=H5MM_malloc(nbytes))) {
 	    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, 0,
 			"unable to allocate deflate destination buffer");
 	}
@@ -135,7 +135,7 @@ H5Z_filter_deflate (unsigned UNUSED flags, size_t cd_nelmts,
 	} else if (Z_OK!=status) {
 	    HGOTO_ERROR (H5E_PLINE, H5E_CANTINIT, 0, "deflate error");
 	} else {
-	    H5F_istore_chunk_free(*buf);
+	    H5MM_xfree(*buf);
 	    *buf = outbuf;
 	    outbuf = NULL;
 	    *buf_size = nbytes;
@@ -149,6 +149,6 @@ H5Z_filter_deflate (unsigned UNUSED flags, size_t cd_nelmts,
 
 done:
     if(outbuf)
-        H5F_istore_chunk_free(outbuf);
+        H5MM_xfree(outbuf);
     FUNC_LEAVE (ret_value);
 }
-- 
cgit v0.12