[svn-r5603] Purpose:

Bug fix

Description:
    I/O on "Regular" hyperslab selections could fail to transfer correctly
    if the number of elements in the selection's row did now fit "evenly"
    into the buffer being used for the transfer.

Solution:
    Correct the calculation of the block & count offsets within the optimized
    "regular" hyperslab routines.

Platforms tested:
    FreeBSD 4.5 (sleipnir)
This commit is contained in:
Quincey Koziol 2002-06-12 12:01:01 -05:00
parent 3bbc9285cf
commit bdefbb5cba
3 changed files with 44 additions and 16 deletions

View File

@ -35,6 +35,9 @@ Bug Fixes since HDF5-1.4.0
Library
-------
* 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
* Fixed bug (#499) which allowed an "empty" compound or enumerated datatype
(one with no members) to be used to create a dataset or committed to a
file. QAK - 2002/06/11
@ -302,9 +305,9 @@ New Features
7 and contains the sizes of the data buffer dimensions.
- F90 subroutines h5dwrite_f, h5dread_f, h5awrite_f and h5aread_f were
overloaded with "dims" argument to be assumed size array of type
INTEGER(HSIZE_T). We recommend to use the subroutines with the new type.
Module subroutines that accept "dims" as INTEGER array of size 7 will be
depricated in 1.6 release.
INTEGER(HSIZE_T). We recommend to use the subroutines with the new
type. Module subroutines that accept "dims" as INTEGER array of size
7 will be deprecated in 1.6 release.
EIP - 2002/05/06
* C++ API:
- Added two new member functions: Exception::getFuncName() and

View File

@ -968,8 +968,14 @@ H5S_hyper_fread_opt (H5F_t *f, const struct H5O_layout_t *layout,
/* Compute the current "counts" for this location */
for(i=0; i<ndims; i++) {
tmp_count[i] = (file_iter->hyp.off[i]-file_space->select.sel_info.hslab.diminfo[i].start)%file_space->select.sel_info.hslab.diminfo[i].stride;
tmp_block[i] = (file_iter->hyp.off[i]-file_space->select.sel_info.hslab.diminfo[i].start)/file_space->select.sel_info.hslab.diminfo[i].stride;
if(file_space->select.sel_info.hslab.diminfo[i].stride==1) {
tmp_count[i] = 0;
tmp_block[i] = file_iter->hyp.off[i]-file_space->select.sel_info.hslab.diminfo[i].start;
} /* end if */
else {
tmp_count[i] = (file_iter->hyp.off[i]-file_space->select.sel_info.hslab.diminfo[i].start)/file_space->select.sel_info.hslab.diminfo[i].stride;
tmp_block[i] = (file_iter->hyp.off[i]-file_space->select.sel_info.hslab.diminfo[i].start)%file_space->select.sel_info.hslab.diminfo[i].stride;
} /* end else */
} /* end for */
/* Compute the initial buffer offset */
@ -1993,8 +1999,14 @@ H5S_hyper_fwrite_opt (H5F_t *f, const struct H5O_layout_t *layout,
/* Compute the current "counts" for this location */
for(i=0; i<ndims; i++) {
tmp_count[i] = (file_iter->hyp.off[i]-file_space->select.sel_info.hslab.diminfo[i].start)%file_space->select.sel_info.hslab.diminfo[i].stride;
tmp_block[i] = (file_iter->hyp.off[i]-file_space->select.sel_info.hslab.diminfo[i].start)/file_space->select.sel_info.hslab.diminfo[i].stride;
if(file_space->select.sel_info.hslab.diminfo[i].stride==1) {
tmp_count[i] = 0;
tmp_block[i] = file_iter->hyp.off[i]-file_space->select.sel_info.hslab.diminfo[i].start;
} /* end if */
else {
tmp_count[i] = (file_iter->hyp.off[i]-file_space->select.sel_info.hslab.diminfo[i].start)/file_space->select.sel_info.hslab.diminfo[i].stride;
tmp_block[i] = (file_iter->hyp.off[i]-file_space->select.sel_info.hslab.diminfo[i].start)%file_space->select.sel_info.hslab.diminfo[i].stride;
} /* end else */
} /* end for */
/* Compute the initial buffer offset */
@ -2923,8 +2935,14 @@ H5S_hyper_mread_opt (const void *_buf, size_t elmt_size,
/* Compute the current "counts" for this location */
for(i=0; i<ndims; i++) {
tmp_count[i] = (mem_iter->hyp.off[i]-mem_space->select.sel_info.hslab.diminfo[i].start)%mem_space->select.sel_info.hslab.diminfo[i].stride;
tmp_block[i] = (mem_iter->hyp.off[i]-mem_space->select.sel_info.hslab.diminfo[i].start)/mem_space->select.sel_info.hslab.diminfo[i].stride;
if(mem_space->select.sel_info.hslab.diminfo[i].stride==1) {
tmp_count[i] = 0;
tmp_block[i] = mem_iter->hyp.off[i]-mem_space->select.sel_info.hslab.diminfo[i].start;
} /* end if */
else {
tmp_count[i] = (mem_iter->hyp.off[i]-mem_space->select.sel_info.hslab.diminfo[i].start)/mem_space->select.sel_info.hslab.diminfo[i].stride;
tmp_block[i] = (mem_iter->hyp.off[i]-mem_space->select.sel_info.hslab.diminfo[i].start)%mem_space->select.sel_info.hslab.diminfo[i].stride;
} /* end else */
} /* end for */
/* Compute the initial buffer offset */
@ -3752,8 +3770,14 @@ H5S_hyper_mwrite_opt (const void *_tconv_buf, size_t elmt_size,
/* Compute the current "counts" for this location */
for(i=0; i<ndims; i++) {
tmp_count[i] = (mem_iter->hyp.off[i]-mem_space->select.sel_info.hslab.diminfo[i].start)%mem_space->select.sel_info.hslab.diminfo[i].stride;
tmp_block[i] = (mem_iter->hyp.off[i]-mem_space->select.sel_info.hslab.diminfo[i].start)/mem_space->select.sel_info.hslab.diminfo[i].stride;
if(mem_space->select.sel_info.hslab.diminfo[i].stride==1) {
tmp_count[i] = 0;
tmp_block[i] = mem_iter->hyp.off[i]-mem_space->select.sel_info.hslab.diminfo[i].start;
} /* end if */
else {
tmp_count[i] = (mem_iter->hyp.off[i]-mem_space->select.sel_info.hslab.diminfo[i].start)/mem_space->select.sel_info.hslab.diminfo[i].stride;
tmp_block[i] = (mem_iter->hyp.off[i]-mem_space->select.sel_info.hslab.diminfo[i].start)%mem_space->select.sel_info.hslab.diminfo[i].stride;
} /* end else */
} /* end for */
/* Compute the initial buffer offset */

View File

@ -939,7 +939,7 @@ compare_size_t(const void *s1, const void *s2)
**
****************************************************************/
static void
test_select_hyper_stride(void)
test_select_hyper_stride(hid_t xfer_plist)
{
hid_t fid1; /* HDF5 File IDs */
hid_t dataset; /* Dataset ID */
@ -1026,7 +1026,7 @@ test_select_hyper_stride(void)
dataset=H5Dcreate(fid1,"Dataset1",H5T_STD_U16LE,sid1,H5P_DEFAULT);
/* Write selection to disk */
ret=H5Dwrite(dataset,H5T_NATIVE_USHORT,sid2,sid1,H5P_DEFAULT,wbuf);
ret=H5Dwrite(dataset,H5T_NATIVE_USHORT,sid2,sid1,xfer_plist,wbuf);
CHECK(ret, FAIL, "H5Dwrite");
/* Close memory dataspace */
@ -1046,7 +1046,7 @@ test_select_hyper_stride(void)
CHECK(ret, FAIL, "H5Sselect_hyperslab");
/* Read selection from disk */
ret=H5Dread(dataset,H5T_NATIVE_USHORT,sid2,sid1,H5P_DEFAULT,rbuf);
ret=H5Dread(dataset,H5T_NATIVE_USHORT,sid2,sid1,xfer_plist,rbuf);
CHECK(ret, FAIL, "H5Dread");
/* Sort the locations into the proper order */
@ -4996,7 +4996,7 @@ test_select(void)
CHECK(plist_id, FAIL, "H5Pcreate");
/* test I/O with a very small buffer for reads */
ret=H5Pset_buffer(plist_id,128,NULL,NULL);
ret=H5Pset_buffer(plist_id,59,NULL,NULL);
CHECK(ret, FAIL, "H5Pset_buffer");
/* These next tests use the same file */
@ -5011,7 +5011,8 @@ test_select(void)
/* These next tests use the same file */
test_select_combo(); /* Test combined hyperslab & element selection code */
test_select_hyper_stride(); /* Test strided hyperslab selection code */
test_select_hyper_stride(H5P_DEFAULT); /* Test strided hyperslab selection code */
test_select_hyper_stride(plist_id); /* Test strided hyperslab selection code */
test_select_hyper_contig(H5T_STD_U16LE,H5P_DEFAULT); /* Test contiguous hyperslab selection code */
test_select_hyper_contig(H5T_STD_U16LE,plist_id); /* Test contiguous hyperslab selection code */
test_select_hyper_contig(H5T_STD_U16BE,H5P_DEFAULT); /* Test contiguous hyperslab selection code */