From 41cddd12585a1608fdfb55d96ea1cfd542db1f9f Mon Sep 17 00:00:00 2001 From: Quincey Koziol Date: Tue, 19 Jun 2007 10:21:13 -0500 Subject: [svn-r13878] Description: Improve efficiency of writing VL-datatype fill values. Tested on: Mac OS X/32 10.4.9 (amazon) Linux/32 2.6 (chicago) Linux/64 2.6 (chicago2) --- src/H5Dcontig.c | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/src/H5Dcontig.c b/src/H5Dcontig.c index e4329ff..2f41572 100644 --- a/src/H5Dcontig.c +++ b/src/H5Dcontig.c @@ -238,18 +238,23 @@ H5D_contig_fill(H5D_t *dset, hid_t dxpl_id) if(NULL == (fill_to_mem_tpath = H5T_path_find(dset->shared->type, mem_type, NULL, NULL, dxpl_id, FALSE))) HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to convert between src and dst datatypes") - /* Allocate a background buffer, if necessary */ - bkg_buf_size = ptsperbuf * elmt_size; - if(H5T_path_bkg(fill_to_mem_tpath) && NULL == (bkg_buf = H5FL_BLK_MALLOC(type_conv, bkg_buf_size))) - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed") - /* Get the inverse datatype conversion path for this operation */ if(NULL == (mem_to_dset_tpath = H5T_path_find(mem_type, dset->shared->type, NULL, NULL, dxpl_id, FALSE))) HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to convert between src and dst datatypes") - /* Allocate the background buffer, if necessary */ - if(H5T_path_bkg(mem_to_dset_tpath) && NULL == (bkg_buf = H5FL_BLK_MALLOC(type_conv, bkg_buf_size))) - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed") + /* Check if we need to allocate a background buffer */ + if(H5T_path_bkg(fill_to_mem_tpath) || H5T_path_bkg(mem_to_dset_tpath)) { + /* Check for inverse datatype conversion needing a background buffer */ + /* (do this first, since it needs a larger buffer) */ + if(H5T_path_bkg(mem_to_dset_tpath)) + bkg_buf_size = ptsperbuf * elmt_size; + else + bkg_buf_size = elmt_size; + + /* Allocate the background buffer */ + if(NULL == (bkg_buf = H5FL_BLK_MALLOC(type_conv, bkg_buf_size))) + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed") + } /* end if */ } /* end if */ else { /* If fill value is not library default, use it to set the element size */ @@ -313,9 +318,9 @@ H5D_contig_fill(H5D_t *dset, hid_t dxpl_id) /* Make a copy of the (disk-based) fill value into the buffer */ HDmemcpy(buf, dset->shared->dcpl_cache.fill.buf, file_type_size); - /* Reset the background buffer, if necessary */ + /* Reset first element of background buffer, if necessary */ if(H5T_path_bkg(fill_to_mem_tpath)) - HDmemset(bkg_buf, 0, bkg_buf_size); + HDmemset(bkg_buf, 0, elmt_size); /* Type convert the dataset buffer, to copy any VL components */ if(H5T_convert(fill_to_mem_tpath, dset->shared->type_id, mem_tid, (size_t)1, (size_t)0, (size_t)0, buf, bkg_buf, dxpl_id) < 0) @@ -324,7 +329,7 @@ H5D_contig_fill(H5D_t *dset, hid_t dxpl_id) /* Replicate the fill value into the cached buffer */ H5V_array_fill(buf, buf, mem_type_size, curr_points); - /* Reset the background buffer, if necessary */ + /* Reset the entire background buffer, if necessary */ if(H5T_path_bkg(mem_to_dset_tpath)) HDmemset(bkg_buf, 0, bkg_buf_size); -- cgit v0.12