First stage of moving H5DOread/write_chunk() to src/ and making
them H5D calls. * Moved H5DOread/write_chunk() to H5Dio.c and renamed to H5D*. * Moved the hl/test/test_dset_opt test to test/ and renamed to direct_chunk. * Moved the hl/test/dectris_hl_perf test to tools/test/perform and renamed to direct_write_perf. * Updated autotools and CMake files.
This commit is contained in:
223
hl/src/H5DO.c
223
hl/src/H5DO.c
@@ -22,163 +22,20 @@
|
||||
/* public LT prototypes */
|
||||
#include "H5DOpublic.h"
|
||||
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: H5DOwrite_chunk
|
||||
* Function: H5DOappend()
|
||||
*
|
||||
* Purpose: Writes an entire chunk to the file directly.
|
||||
* Purpose: To append elements to a dataset.
|
||||
*
|
||||
* Return: Non-negative on success/Negative on failure
|
||||
*
|
||||
* Programmer: Raymond Lu
|
||||
* 30 July 2012
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
herr_t
|
||||
H5DOwrite_chunk(hid_t dset_id, hid_t dxpl_id, uint32_t filters, const hsize_t *offset,
|
||||
size_t data_size, const void *buf)
|
||||
{
|
||||
hbool_t created_dxpl = FALSE; /* Whether we created a DXPL */
|
||||
hbool_t do_direct_write = TRUE; /* Flag for direct writes */
|
||||
uint32_t data_size_32; /* Chunk data size (limited to 32-bits currently) */
|
||||
herr_t ret_value = FAIL; /* Return value */
|
||||
|
||||
/* Check arguments */
|
||||
if(dset_id < 0)
|
||||
goto done;
|
||||
if(!buf)
|
||||
goto done;
|
||||
if(!offset)
|
||||
goto done;
|
||||
if(!data_size)
|
||||
goto done;
|
||||
data_size_32 = (uint32_t)data_size;
|
||||
if(data_size != (size_t)data_size_32)
|
||||
goto done;
|
||||
|
||||
/* If the user passed in a default DXPL, create one to pass to H5Dwrite() */
|
||||
if(H5P_DEFAULT == dxpl_id) {
|
||||
if((dxpl_id = H5Pcreate(H5P_DATASET_XFER)) < 0)
|
||||
goto done;
|
||||
created_dxpl = TRUE;
|
||||
} /* end if */
|
||||
|
||||
/* Set direct write parameters */
|
||||
if(H5Pset(dxpl_id, H5D_XFER_DIRECT_CHUNK_WRITE_FLAG_NAME, &do_direct_write) < 0)
|
||||
goto done;
|
||||
if(H5Pset(dxpl_id, H5D_XFER_DIRECT_CHUNK_WRITE_FILTERS_NAME, &filters) < 0)
|
||||
goto done;
|
||||
if(H5Pset(dxpl_id, H5D_XFER_DIRECT_CHUNK_WRITE_OFFSET_NAME, &offset) < 0)
|
||||
goto done;
|
||||
if(H5Pset(dxpl_id, H5D_XFER_DIRECT_CHUNK_WRITE_DATASIZE_NAME, &data_size_32) < 0)
|
||||
goto done;
|
||||
|
||||
/* Write chunk */
|
||||
if(H5Dwrite(dset_id, 0, H5S_ALL, H5S_ALL, dxpl_id, buf) < 0)
|
||||
goto done;
|
||||
|
||||
/* Indicate success */
|
||||
ret_value = SUCCEED;
|
||||
|
||||
done:
|
||||
if(created_dxpl) {
|
||||
if(H5Pclose(dxpl_id) < 0)
|
||||
ret_value = FAIL;
|
||||
} /* end if */
|
||||
else {
|
||||
/* Reset the direct write flag on user DXPL */
|
||||
do_direct_write = FALSE;
|
||||
if(H5Pset(dxpl_id, H5D_XFER_DIRECT_CHUNK_WRITE_FLAG_NAME, &do_direct_write) < 0)
|
||||
ret_value = FAIL;
|
||||
}
|
||||
|
||||
return ret_value;
|
||||
} /* end H5DOwrite_chunk() */
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: H5DOread_chunk
|
||||
*
|
||||
* Purpose: Reads an entire chunk from the file directly.
|
||||
* axis: the dataset dimension (zero-based) for the append
|
||||
* extension: the # of elements to append for the axis-th dimension
|
||||
* memtype: the datatype
|
||||
* buf: buffer with data for the append
|
||||
*
|
||||
* Return: Non-negative on success/Negative on failure
|
||||
*
|
||||
* Programmer: Matthew Strong (GE Healthcare)
|
||||
* 14 February 2016
|
||||
*
|
||||
*---------------------------------------------------------------------------
|
||||
*/
|
||||
herr_t
|
||||
H5DOread_chunk(hid_t dset_id, hid_t dxpl_id, const hsize_t *offset, uint32_t *filters,
|
||||
void *buf)
|
||||
{
|
||||
hbool_t created_dxpl = FALSE; /* Whether we created a DXPL */
|
||||
hbool_t do_direct_read = TRUE; /* Flag for direct writes */
|
||||
herr_t ret_value = FAIL; /* Return value */
|
||||
|
||||
/* Check arguments */
|
||||
if(dset_id < 0)
|
||||
goto done;
|
||||
if(!buf)
|
||||
goto done;
|
||||
if(!offset)
|
||||
goto done;
|
||||
if(!filters)
|
||||
goto done;
|
||||
|
||||
/* If the user passed in a default DXPL, create one to pass to H5Dwrite() */
|
||||
if(H5P_DEFAULT == dxpl_id) {
|
||||
if((dxpl_id = H5Pcreate(H5P_DATASET_XFER)) < 0)
|
||||
goto done;
|
||||
created_dxpl = TRUE;
|
||||
} /* end if */
|
||||
|
||||
/* Set direct write parameters */
|
||||
if(H5Pset(dxpl_id, H5D_XFER_DIRECT_CHUNK_READ_FLAG_NAME, &do_direct_read) < 0)
|
||||
goto done;
|
||||
if(H5Pset(dxpl_id, H5D_XFER_DIRECT_CHUNK_READ_OFFSET_NAME, &offset) < 0)
|
||||
goto done;
|
||||
|
||||
/* Read chunk */
|
||||
if(H5Dread(dset_id, 0, H5S_ALL, H5S_ALL, dxpl_id, buf) < 0)
|
||||
goto done;
|
||||
/* Get the filter mask */
|
||||
if(H5Pget(dxpl_id, H5D_XFER_DIRECT_CHUNK_READ_FILTERS_NAME, filters) < 0)
|
||||
goto done;
|
||||
|
||||
/* Indicate success */
|
||||
ret_value = SUCCEED;
|
||||
|
||||
done:
|
||||
if(created_dxpl) {
|
||||
if(H5Pclose(dxpl_id) < 0)
|
||||
ret_value = FAIL;
|
||||
} /* end if */
|
||||
else {
|
||||
/* Reset the direct read flag on user DXPL */
|
||||
do_direct_read = FALSE;
|
||||
if(H5Pset(dxpl_id, H5D_XFER_DIRECT_CHUNK_READ_FLAG_NAME, &do_direct_read) < 0)
|
||||
ret_value = FAIL;
|
||||
}
|
||||
|
||||
return ret_value;
|
||||
} /* end H5DOread_chunk() */
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: H5DOappend()
|
||||
*
|
||||
* Purpose: To append elements to a dataset.
|
||||
* axis: the dataset dimension (zero-based) for the append
|
||||
* extension: the # of elements to append for the axis-th dimension
|
||||
* memtype: the datatype
|
||||
* buf: buffer with data for the append
|
||||
*
|
||||
* Return: Non-negative on success/Negative on failure
|
||||
*
|
||||
* Programmer: Vailin Choi; Jan 2014
|
||||
* Programmer: Vailin Choi; Jan 2014
|
||||
*
|
||||
* Note:
|
||||
* This routine is copied from the fast forward feature branch: features/hdf5_ff
|
||||
@@ -227,7 +84,7 @@ H5DOappend(hid_t dset_id, hid_t dxpl_id, unsigned axis, size_t extension,
|
||||
|
||||
/* check arguments */
|
||||
if(H5I_DATASET != H5Iget_type(dset_id))
|
||||
goto done;
|
||||
goto done;
|
||||
|
||||
/* If the user passed in a default DXPL, create one to pass to H5Dwrite() */
|
||||
if(H5P_DEFAULT == dxpl_id) {
|
||||
@@ -236,35 +93,35 @@ H5DOappend(hid_t dset_id, hid_t dxpl_id, unsigned axis, size_t extension,
|
||||
created_dxpl = TRUE;
|
||||
} /* end if */
|
||||
else if(TRUE != H5Pisa_class(dxpl_id, H5P_DATASET_XFER))
|
||||
goto done;
|
||||
goto done;
|
||||
|
||||
/* Get the dataspace of the dataset */
|
||||
if(FAIL == (space_id = H5Dget_space(dset_id)))
|
||||
goto done;
|
||||
goto done;
|
||||
|
||||
/* Get the rank of this dataspace */
|
||||
if((sndims = H5Sget_simple_extent_ndims(space_id)) < 0)
|
||||
goto done;
|
||||
goto done;
|
||||
ndims = (unsigned)sndims;
|
||||
|
||||
/* Verify correct axis */
|
||||
if(axis >= ndims)
|
||||
goto done;
|
||||
goto done;
|
||||
|
||||
/* Get the dimensions sizes of the dataspace */
|
||||
if(H5Sget_simple_extent_dims(space_id, size, NULL) < 0)
|
||||
goto done;
|
||||
goto done;
|
||||
|
||||
/* Adjust the dimension size of the requested dimension,
|
||||
but first record the old dimension size */
|
||||
old_size = size[axis];
|
||||
size[axis] += extension;
|
||||
if(size[axis] < old_size)
|
||||
goto done;
|
||||
goto done;
|
||||
|
||||
/* Set the extent of the dataset to the new dimension */
|
||||
if(H5Dset_extent(dset_id, size) < 0)
|
||||
goto done;
|
||||
goto done;
|
||||
|
||||
/* Get the new dataspace of the dataset */
|
||||
if(FAIL == (new_space_id = H5Dget_space(dset_id)))
|
||||
@@ -282,51 +139,51 @@ H5DOappend(hid_t dset_id, hid_t dxpl_id, unsigned axis, size_t extension,
|
||||
} /* end if */
|
||||
} /* end for */
|
||||
if(FAIL == H5Sselect_hyperslab(new_space_id, H5S_SELECT_SET, start, stride, count, block))
|
||||
goto done;
|
||||
goto done;
|
||||
|
||||
/* The # of elemnts in the new extended dataspace */
|
||||
if((snelmts = H5Sget_select_npoints(new_space_id)) < 0)
|
||||
goto done;
|
||||
goto done;
|
||||
nelmts = (hsize_t)snelmts;
|
||||
|
||||
/* create a memory space */
|
||||
if(FAIL == (mem_space_id = H5Screate_simple(1, &nelmts, NULL)))
|
||||
goto done;
|
||||
goto done;
|
||||
|
||||
/* Write the data */
|
||||
if(H5Dwrite(dset_id, memtype, mem_space_id, new_space_id, dxpl_id, buf) < 0)
|
||||
goto done;
|
||||
goto done;
|
||||
|
||||
/* Obtain the dataset's access property list */
|
||||
if((dapl = H5Dget_access_plist(dset_id)) < 0)
|
||||
goto done;
|
||||
goto done;
|
||||
|
||||
/* Allocate the boundary array */
|
||||
boundary = (hsize_t *)HDmalloc(ndims * sizeof(hsize_t));
|
||||
|
||||
/* Retrieve the append flush property */
|
||||
if(H5Pget_append_flush(dapl, ndims, boundary, &append_cb, &udata) < 0)
|
||||
goto done;
|
||||
goto done;
|
||||
|
||||
/* No boundary for this axis */
|
||||
if(boundary[axis] != 0) {
|
||||
|
||||
/* Determine whether a boundary is hit or not */
|
||||
for(k = start[axis]; k < size[axis]; k++)
|
||||
if(!((k + 1) % boundary[axis])) {
|
||||
hit = TRUE;
|
||||
break;
|
||||
}
|
||||
/* Determine whether a boundary is hit or not */
|
||||
for(k = start[axis]; k < size[axis]; k++)
|
||||
if(!((k + 1) % boundary[axis])) {
|
||||
hit = TRUE;
|
||||
break;
|
||||
}
|
||||
|
||||
if(hit) { /* Hit the boundary */
|
||||
/* Invoke callback if there is one */
|
||||
if(append_cb && append_cb(dset_id, size, udata) < 0)
|
||||
goto done;
|
||||
if(hit) { /* Hit the boundary */
|
||||
/* Invoke callback if there is one */
|
||||
if(append_cb && append_cb(dset_id, size, udata) < 0)
|
||||
goto done;
|
||||
|
||||
/* Do a dataset flush */
|
||||
if(H5Dflush(dset_id) < 0)
|
||||
goto done;
|
||||
} /* end if */
|
||||
/* Do a dataset flush */
|
||||
if(H5Dflush(dset_id) < 0)
|
||||
goto done;
|
||||
} /* end if */
|
||||
} /* end if */
|
||||
|
||||
/* Indicate success */
|
||||
@@ -341,22 +198,22 @@ done:
|
||||
|
||||
/* Close old dataspace */
|
||||
if(space_id != FAIL && H5Sclose(space_id) < 0)
|
||||
ret_value = FAIL;
|
||||
ret_value = FAIL;
|
||||
|
||||
/* Close new dataspace */
|
||||
if(new_space_id != FAIL && H5Sclose(new_space_id) < 0)
|
||||
ret_value = FAIL;
|
||||
ret_value = FAIL;
|
||||
|
||||
/* Close memory dataspace */
|
||||
if(mem_space_id != FAIL && H5Sclose(mem_space_id) < 0)
|
||||
ret_value = FAIL;
|
||||
ret_value = FAIL;
|
||||
|
||||
/* Close the dataset access property list */
|
||||
if(dapl != FAIL && H5Pclose(dapl) < 0)
|
||||
ret_value = FAIL;
|
||||
ret_value = FAIL;
|
||||
|
||||
if(boundary)
|
||||
HDfree(boundary);
|
||||
HDfree(boundary);
|
||||
|
||||
return ret_value;
|
||||
} /* H5DOappend() */
|
||||
|
||||
@@ -25,15 +25,6 @@ extern "C" {
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
H5_HLDLL herr_t H5DOwrite_chunk(hid_t dset_id, hid_t dxpl_id, uint32_t filters,
|
||||
const hsize_t *offset, size_t data_size, const void *buf);
|
||||
|
||||
H5_HLDLL herr_t H5DOread_chunk(hid_t dset_id, /*in*/
|
||||
hid_t dxpl_id, /*in*/
|
||||
const hsize_t *offset, /*in*/
|
||||
uint32_t *filters, /*out*/
|
||||
void *buf); /*out*/
|
||||
|
||||
H5_HLDLL herr_t H5DOappend(hid_t dset_id, hid_t dxpl_id, unsigned axis,
|
||||
size_t extension, hid_t memtype, const void *buf);
|
||||
|
||||
|
||||
@@ -47,7 +47,6 @@ HL_ADD_EXE (test_image)
|
||||
HL_ADD_EXE (test_file_image)
|
||||
HL_ADD_EXE (test_table)
|
||||
HL_ADD_EXE (test_ds)
|
||||
HL_ADD_EXE (test_dset_opt)
|
||||
HL_ADD_EXE (test_ld)
|
||||
HL_ADD_EXE (test_dset_append)
|
||||
|
||||
|
||||
@@ -90,7 +90,6 @@ add_test (
|
||||
test_ds8.h5
|
||||
test_ds9.h5
|
||||
test_ds10.h5
|
||||
test_dectris.h5
|
||||
test_image1.h5
|
||||
test_image2.h5
|
||||
test_image3.h5
|
||||
@@ -115,7 +114,6 @@ HL_add_test (test_file_image)
|
||||
HL_add_test (test_table)
|
||||
HL_add_test (test_ds)
|
||||
HL_add_test (test_packet)
|
||||
HL_add_test (test_dset_opt)
|
||||
HL_add_test (test_ld)
|
||||
HL_add_test (test_dset_append)
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ LDADD=$(LIBH5_HL) $(LIBH5TEST) $(LIBHDF5)
|
||||
|
||||
# Test programs. These are our main targets. They should be listed in the
|
||||
# order to be executed, generally most specific tests to least specific tests.
|
||||
TEST_PROG=test_lite test_image test_file_image test_table test_ds test_packet test_dset_opt \
|
||||
TEST_PROG=test_lite test_image test_file_image test_table test_ds test_packet \
|
||||
test_ld test_dset_append
|
||||
check_PROGRAMS=$(TEST_PROG)
|
||||
|
||||
@@ -45,8 +45,7 @@ endif
|
||||
CHECK_CLEANFILES+=combine_tables[1-2].h5 test_ds[1-9].h5 test_ds10.h5 \
|
||||
test_image[1-3].h5 file_img[1-2].h5 test_lite[1-4].h5 test_table.h5 \
|
||||
test_packet_table.h5 test_packet_compress.h5 test_detach.h5 \
|
||||
test_packet_table_vlen.h5 testfl_packet_table_vlen.h5 \
|
||||
test_dectris.h5 test_append.h5
|
||||
test_packet_table_vlen.h5 testfl_packet_table_vlen.h5 test_append.h5
|
||||
|
||||
# Sources for test_packet executable
|
||||
test_packet_SOURCES=test_packet.c test_packet_vlen.c
|
||||
|
||||
155
src/H5Dio.c
155
src/H5Dio.c
@@ -125,12 +125,13 @@ H5Dread(hid_t dset_id, hid_t mem_type_id, hid_t mem_space_id,
|
||||
|
||||
/* check arguments */
|
||||
if(NULL == (dset = (H5D_t *)H5I_object_verify(dset_id, H5I_DATASET)))
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset")
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "dset_id is not a dataset ID")
|
||||
if(NULL == dset->oloc.file)
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset")
|
||||
|
||||
if(mem_space_id < 0 || file_space_id < 0)
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data space")
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "dataset is not associated with a file")
|
||||
if(mem_space_id < 0)
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid mem_space_id")
|
||||
if(file_space_id < 0)
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid file_space_id")
|
||||
|
||||
if(H5S_ALL != mem_space_id) {
|
||||
if(NULL == (mem_space = (const H5S_t *)H5I_object_verify(mem_space_id, H5I_DATASPACE)))
|
||||
@@ -213,6 +214,76 @@ done:
|
||||
FUNC_LEAVE_API(ret_value)
|
||||
} /* end H5Dread() */
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: H5Dread_chunk
|
||||
*
|
||||
* Purpose: Reads an entire chunk from the file directly.
|
||||
*
|
||||
* Return: Non-negative on success/Negative on failure
|
||||
*
|
||||
* Programmer: Matthew Strong (GE Healthcare)
|
||||
* 14 February 2016
|
||||
*
|
||||
*---------------------------------------------------------------------------
|
||||
*/
|
||||
herr_t
|
||||
H5Dread_chunk(hid_t dset_id, hid_t dxpl_id, const hsize_t *offset, uint32_t *filters,
|
||||
void *buf)
|
||||
{
|
||||
hbool_t created_dxpl = FALSE; /* Whether we created a DXPL */
|
||||
hbool_t do_direct_read = TRUE; /* Flag for direct writes */
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE5("e", "ii*h*Iu*x", dset_id, dxpl_id, offset, filters, buf);
|
||||
|
||||
/* Check arguments */
|
||||
if(dset_id < 0)
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid dataset ID")
|
||||
if(!buf)
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "buf cannot be NULL")
|
||||
if(!offset)
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "offset cannot be NULL")
|
||||
if(!filters)
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "filters cannot be NULL")
|
||||
|
||||
/* If the user passed in a default DXPL, create one to pass to H5Dwrite() */
|
||||
if(H5P_DEFAULT == dxpl_id) {
|
||||
if((dxpl_id = H5Pcreate(H5P_DATASET_XFER)) < 0)
|
||||
HGOTO_ERROR(H5E_PLIST, H5E_CANTCREATE, FAIL, "cannot create dxpl")
|
||||
created_dxpl = TRUE;
|
||||
} /* end if */
|
||||
|
||||
/* Set direct write parameters */
|
||||
if(H5Pset(dxpl_id, H5D_XFER_DIRECT_CHUNK_READ_FLAG_NAME, &do_direct_read) < 0)
|
||||
HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "cannot set direct read property")
|
||||
if(H5Pset(dxpl_id, H5D_XFER_DIRECT_CHUNK_READ_OFFSET_NAME, &offset) < 0)
|
||||
HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "cannot set offset property")
|
||||
|
||||
/* Read chunk */
|
||||
if(H5Dread(dset_id, 0, H5S_ALL, H5S_ALL, dxpl_id, buf) < 0)
|
||||
HGOTO_ERROR(H5E_DATASET, H5E_READERROR, FAIL, "cannot read from dataset")
|
||||
|
||||
/* Get the filter mask */
|
||||
if(H5Pget(dxpl_id, H5D_XFER_DIRECT_CHUNK_READ_FILTERS_NAME, filters) < 0)
|
||||
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "cannot get filter mask property")
|
||||
|
||||
done:
|
||||
if(created_dxpl) {
|
||||
if(H5Pclose(dxpl_id) < 0)
|
||||
HDONE_ERROR(H5E_PLIST, H5E_CANTRELEASE, FAIL, "unable to close dxpl")
|
||||
} /* end if */
|
||||
else {
|
||||
/* Reset the direct read flag on user DXPL */
|
||||
do_direct_read = FALSE;
|
||||
if(H5Pset(dxpl_id, H5D_XFER_DIRECT_CHUNK_READ_FLAG_NAME, &do_direct_read) < 0)
|
||||
HDONE_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "cannot reset direct write property")
|
||||
}
|
||||
|
||||
FUNC_LEAVE_API(ret_value)
|
||||
} /* end H5Dread_chunk() */
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: H5Dwrite
|
||||
@@ -309,6 +380,80 @@ done:
|
||||
FUNC_LEAVE_API(ret_value)
|
||||
} /* end H5Dwrite() */
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: H5Dwrite_chunk
|
||||
*
|
||||
* Purpose: Writes an entire chunk to the file directly.
|
||||
*
|
||||
* Return: Non-negative on success/Negative on failure
|
||||
*
|
||||
* Programmer: Raymond Lu
|
||||
* 30 July 2012
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
herr_t
|
||||
H5Dwrite_chunk(hid_t dset_id, hid_t dxpl_id, uint32_t filters, const hsize_t *offset,
|
||||
size_t data_size, const void *buf)
|
||||
{
|
||||
hbool_t created_dxpl = FALSE; /* Whether we created a DXPL */
|
||||
hbool_t do_direct_write = TRUE; /* Flag for direct writes */
|
||||
uint32_t data_size_32; /* Chunk data size (limited to 32-bits currently) */
|
||||
herr_t ret_value = SUCCEED; /* Return value */
|
||||
|
||||
FUNC_ENTER_API(FAIL)
|
||||
H5TRACE6("e", "iiIu*hz*x", dset_id, dxpl_id, filters, offset, data_size, buf);
|
||||
|
||||
/* Check arguments */
|
||||
if(dset_id < 0)
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid dataset ID")
|
||||
if(!buf)
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "buf cannot be NULL")
|
||||
if(!offset)
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "offset cannot be NULL")
|
||||
if(!data_size)
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "data_size cannot be NULL")
|
||||
data_size_32 = (uint32_t)data_size;
|
||||
if(data_size != (size_t)data_size_32)
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid data_size")
|
||||
|
||||
/* If the user passed in a default DXPL, create one to pass to H5Dwrite() */
|
||||
if(H5P_DEFAULT == dxpl_id) {
|
||||
if((dxpl_id = H5Pcreate(H5P_DATASET_XFER)) < 0)
|
||||
HGOTO_ERROR(H5E_PLIST, H5E_CANTCREATE, FAIL, "cannot create dxpl")
|
||||
created_dxpl = TRUE;
|
||||
} /* end if */
|
||||
|
||||
/* Set direct write parameters */
|
||||
if(H5Pset(dxpl_id, H5D_XFER_DIRECT_CHUNK_WRITE_FLAG_NAME, &do_direct_write) < 0)
|
||||
HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "cannot set direct read property")
|
||||
if(H5Pset(dxpl_id, H5D_XFER_DIRECT_CHUNK_WRITE_FILTERS_NAME, &filters) < 0)
|
||||
HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "cannot set filters property")
|
||||
if(H5Pset(dxpl_id, H5D_XFER_DIRECT_CHUNK_WRITE_OFFSET_NAME, &offset) < 0)
|
||||
HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "cannot set offset property")
|
||||
if(H5Pset(dxpl_id, H5D_XFER_DIRECT_CHUNK_WRITE_DATASIZE_NAME, &data_size_32) < 0)
|
||||
HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "cannot set data size property")
|
||||
|
||||
/* Write chunk */
|
||||
if(H5Dwrite(dset_id, 0, H5S_ALL, H5S_ALL, dxpl_id, buf) < 0)
|
||||
HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "cannot write to dataset")
|
||||
|
||||
done:
|
||||
if(created_dxpl) {
|
||||
if(H5Pclose(dxpl_id) < 0)
|
||||
HDONE_ERROR(H5E_PLIST, H5E_CANTRELEASE, FAIL, "unable to close dxpl")
|
||||
} /* end if */
|
||||
else {
|
||||
/* Reset the direct write flag on user DXPL */
|
||||
do_direct_write = FALSE;
|
||||
if(H5Pset(dxpl_id, H5D_XFER_DIRECT_CHUNK_WRITE_FLAG_NAME, &do_direct_write) < 0)
|
||||
HDONE_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "cannot reset direct write property")
|
||||
}
|
||||
|
||||
FUNC_LEAVE_API(ret_value)
|
||||
} /* end H5Dwrite_chunk() */
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: H5D__pre_write
|
||||
|
||||
@@ -157,6 +157,10 @@ H5_DLL herr_t H5Dread(hid_t dset_id, hid_t mem_type_id, hid_t mem_space_id,
|
||||
hid_t file_space_id, hid_t plist_id, void *buf/*out*/);
|
||||
H5_DLL herr_t H5Dwrite(hid_t dset_id, hid_t mem_type_id, hid_t mem_space_id,
|
||||
hid_t file_space_id, hid_t plist_id, const void *buf);
|
||||
H5_DLL herr_t H5Dwrite_chunk(hid_t dset_id, hid_t dxpl_id, uint32_t filters,
|
||||
const hsize_t *offset, size_t data_size, const void *buf);
|
||||
H5_DLL herr_t H5Dread_chunk(hid_t dset_id, hid_t dxpl_id,
|
||||
const hsize_t *offset, uint32_t *filters, void *buf);
|
||||
H5_DLL herr_t H5Diterate(void *buf, hid_t type_id, hid_t space_id,
|
||||
H5D_operator_t op, void *operator_data);
|
||||
H5_DLL herr_t H5Dvlen_reclaim(hid_t type_id, hid_t space_id, hid_t plist_id, void *buf);
|
||||
|
||||
@@ -214,6 +214,7 @@ set (H5_TESTS
|
||||
cmpd_dset
|
||||
filter_fail
|
||||
extend
|
||||
direct_chunk
|
||||
external
|
||||
efc
|
||||
objcopy
|
||||
|
||||
@@ -532,6 +532,7 @@ set (test_CLEANFILES
|
||||
vds_swmr.h5
|
||||
vds_swmr_src_*.h5
|
||||
tmp/vds_src_2.h5
|
||||
direct_chunk.h5
|
||||
)
|
||||
|
||||
# Remove any output file left over from previous test run
|
||||
|
||||
@@ -55,11 +55,12 @@ TEST_PROG= testhdf5 \
|
||||
cache cache_api cache_image cache_tagging lheap ohdr stab gheap \
|
||||
evict_on_close farray earray btree2 fheap \
|
||||
pool accum hyperslab istore bittests dt_arith page_buffer \
|
||||
dtypes dsets cmpd_dset filter_fail extend external efc objcopy links unlink \
|
||||
twriteorder big mtime fillval mount flush1 flush2 app_ref enum \
|
||||
set_extent ttsafe enc_dec_plist enc_dec_plist_cross_platform\
|
||||
getname vfd ntypes dangle dtransform reserved cross_read \
|
||||
freespace mf vds file_image unregister cache_logging cork swmr
|
||||
dtypes dsets cmpd_dset filter_fail extend direct_chunk external efc \
|
||||
objcopy links unlink twriteorder big mtime fillval mount \
|
||||
flush1 flush2 app_ref enum set_extent ttsafe enc_dec_plist \
|
||||
enc_dec_plist_cross_platform getname vfd ntypes dangle dtransform \
|
||||
reserved cross_read freespace mf vds file_image unregister \
|
||||
cache_logging cork swmr
|
||||
|
||||
# List programs to be built when testing here.
|
||||
# error_test and err_compat are built at the same time as the other tests, but executed by testerror.sh.
|
||||
@@ -190,7 +191,7 @@ CHECK_CLEANFILES+=accum.h5 cmpd_dset.h5 compact_dataset.h5 dataset.h5 dset_offse
|
||||
flushrefresh_VERIFICATION_DONE atomic_data accum_swmr_big.h5 ohdr_swmr.h5 \
|
||||
test_swmr*.h5 cache_logging.h5 cache_logging.out vds_swmr.h5 vds_swmr_src_*.h5 \
|
||||
swmr[0-2].h5 swmr_writer.out swmr_writer.log.* swmr_reader.out.* swmr_reader.log.* \
|
||||
tbogus.h5.copy cache_image_test.h5
|
||||
tbogus.h5.copy cache_image_test.h5 direct_chunk.h5
|
||||
|
||||
# Sources for testhdf5 executable
|
||||
testhdf5_SOURCES=testhdf5.c tarray.c tattr.c tchecksum.c tconfig.c tfile.c \
|
||||
|
||||
@@ -11,11 +11,7 @@
|
||||
* help@hdfgroup.org. *
|
||||
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "h5hltest.h"
|
||||
#include "H5DOpublic.h"
|
||||
#include <math.h>
|
||||
#include "h5test.h"
|
||||
|
||||
#if defined(H5_HAVE_ZLIB_H) && !defined(H5_ZLIB_HEADER)
|
||||
# define H5_ZLIB_HEADER "zlib.h"
|
||||
@@ -24,7 +20,7 @@
|
||||
# include H5_ZLIB_HEADER /* "zlib.h" */
|
||||
#endif
|
||||
|
||||
#define FILE_NAME "test_dectris.h5"
|
||||
#define FILE_NAME "direct_chunk.h5"
|
||||
|
||||
/* Datasets for Direct Write tests */
|
||||
#define DATASETNAME1 "direct_write"
|
||||
@@ -100,7 +96,7 @@ const H5Z_class2_t H5Z_BOGUS2[1] = {{
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: test_direct_chunk_write
|
||||
*
|
||||
* Purpose: Test the basic functionality of H5DOwrite_chunk
|
||||
* Purpose: Test the basic functionality of H5Dwrite_chunk
|
||||
*
|
||||
* Return: Success: 0
|
||||
* Failure: 1
|
||||
@@ -143,7 +139,7 @@ test_direct_chunk_write (hid_t file)
|
||||
hsize_t count[2]; /* Block count */
|
||||
hsize_t block[2]; /* Block sizes */
|
||||
|
||||
TESTING("basic functionality of H5DOwrite_chunk");
|
||||
TESTING("basic functionality of H5Dwrite_chunk");
|
||||
|
||||
/*
|
||||
* Create the data space with unlimited dimensions.
|
||||
@@ -184,7 +180,7 @@ test_direct_chunk_write (hid_t file)
|
||||
|
||||
/*
|
||||
* Write the data for the dataset. It should stay in the chunk cache.
|
||||
* It will be evicted from the cache by the H5DOwrite_chunk calls.
|
||||
* It will be evicted from the cache by the H5Dwrite_chunk calls.
|
||||
*/
|
||||
if((status = H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL,
|
||||
dxpl, data)) < 0)
|
||||
@@ -218,7 +214,7 @@ test_direct_chunk_write (hid_t file)
|
||||
* dataset, using the direct writing function. */
|
||||
for(i=0; i<NX/CHUNK_NX; i++) {
|
||||
for(j=0; j<NY/CHUNK_NY; j++) {
|
||||
status = H5DOwrite_chunk(dataset, dxpl, filter_mask, offset, z_dst_nbytes, outbuf);
|
||||
status = H5Dwrite_chunk(dataset, dxpl, filter_mask, offset, z_dst_nbytes, outbuf);
|
||||
offset[1] += CHUNK_NY;
|
||||
}
|
||||
offset[0] += CHUNK_NX;
|
||||
@@ -292,7 +288,7 @@ test_direct_chunk_write (hid_t file)
|
||||
offset[0] = offset[1] = 0;
|
||||
for(i=0; i<NX/CHUNK_NX; i++) {
|
||||
for(j=0; j<NY/CHUNK_NY; j++) {
|
||||
status = H5DOwrite_chunk(dataset, dxpl, filter_mask, offset, z_dst_nbytes, outbuf);
|
||||
status = H5Dwrite_chunk(dataset, dxpl, filter_mask, offset, z_dst_nbytes, outbuf);
|
||||
offset[1] += CHUNK_NY;
|
||||
}
|
||||
offset[0] += CHUNK_NX;
|
||||
@@ -389,7 +385,7 @@ test_direct_chunk_overwrite_data(hid_t fid)
|
||||
int16_t n;
|
||||
int16_t read_buf[OVERWRITE_CHUNK_NY][OVERWRITE_CHUNK_2NX];
|
||||
|
||||
TESTING("overwriting existing data with H5DOwrite_chunk");
|
||||
TESTING("overwriting existing data with H5Dwrite_chunk");
|
||||
|
||||
/* Create the dataset's data space */
|
||||
if ((sid = H5Screate_simple(OVERWRITE_NDIMS, dset_dims, dset_max_dims)) < 0)
|
||||
@@ -417,17 +413,17 @@ test_direct_chunk_overwrite_data(hid_t fid)
|
||||
}
|
||||
|
||||
/* Write chunk data using the direct write function. */
|
||||
if (H5DOwrite_chunk(did, H5P_DEFAULT, filter_mask, offset, buf_size, data_buf) < 0)
|
||||
if (H5Dwrite_chunk(did, H5P_DEFAULT, filter_mask, offset, buf_size, data_buf) < 0)
|
||||
FAIL_STACK_ERROR
|
||||
|
||||
/* Write second chunk. */
|
||||
offset[2] = OVERWRITE_CHUNK_NX;
|
||||
if (H5DOwrite_chunk(did, H5P_DEFAULT, filter_mask, offset, buf_size, data_buf) < 0)
|
||||
if (H5Dwrite_chunk(did, H5P_DEFAULT, filter_mask, offset, buf_size, data_buf) < 0)
|
||||
FAIL_STACK_ERROR
|
||||
|
||||
/* Overwrite first chunk. */
|
||||
offset[2] = 0;
|
||||
if (H5DOwrite_chunk(did, H5P_DEFAULT, filter_mask, offset, buf_size, overwrite_buf) < 0)
|
||||
if (H5Dwrite_chunk(did, H5P_DEFAULT, filter_mask, offset, buf_size, overwrite_buf) < 0)
|
||||
FAIL_STACK_ERROR
|
||||
|
||||
/* Read the data back out */
|
||||
@@ -504,7 +500,7 @@ test_skip_compress_write1(hid_t file)
|
||||
hsize_t count[2]; /* Block count */
|
||||
hsize_t block[2]; /* Block sizes */
|
||||
|
||||
TESTING("skipping compression filter for H5DOwrite_chunk/H5DOread_chunk");
|
||||
TESTING("skipping compression filter for H5Dwrite_chunk/H5Dread_chunk");
|
||||
|
||||
/*
|
||||
* Create the data space with unlimited dimensions.
|
||||
@@ -551,7 +547,7 @@ test_skip_compress_write1(hid_t file)
|
||||
|
||||
filter_mask = 0x00000001;
|
||||
|
||||
if((status = H5DOwrite_chunk(dataset, dxpl, filter_mask, offset, buf_size, direct_buf)) < 0)
|
||||
if((status = H5Dwrite_chunk(dataset, dxpl, filter_mask, offset, buf_size, direct_buf)) < 0)
|
||||
goto error;
|
||||
|
||||
if(H5Fflush(dataset, H5F_SCOPE_LOCAL) < 0)
|
||||
@@ -597,7 +593,7 @@ test_skip_compress_write1(hid_t file)
|
||||
|
||||
/* Read the raw chunk back */
|
||||
HDmemset(&read_direct_buf, 0, sizeof(read_direct_buf));
|
||||
if((status = H5DOread_chunk(dataset, H5P_DEFAULT, offset, &read_filter_mask, read_direct_buf)) < 0)
|
||||
if((status = H5Dread_chunk(dataset, H5P_DEFAULT, offset, &read_filter_mask, read_direct_buf)) < 0)
|
||||
goto error;
|
||||
if(read_filter_mask != filter_mask)
|
||||
goto error;
|
||||
@@ -822,7 +818,7 @@ test_skip_compress_write2(hid_t file)
|
||||
/* compression filter is the middle one to be skipped */
|
||||
filter_mask = 0x00000002;
|
||||
|
||||
if((status = H5DOwrite_chunk(dataset, dxpl, filter_mask, offset, buf_size, direct_buf)) < 0)
|
||||
if((status = H5Dwrite_chunk(dataset, dxpl, filter_mask, offset, buf_size, direct_buf)) < 0)
|
||||
goto error;
|
||||
|
||||
if(H5Fflush(dataset, H5F_SCOPE_LOCAL) < 0)
|
||||
@@ -868,7 +864,7 @@ test_skip_compress_write2(hid_t file)
|
||||
|
||||
/* Read the raw chunk back */
|
||||
HDmemset(&read_direct_buf, 0, sizeof(read_direct_buf));
|
||||
if((status = H5DOread_chunk(dataset, H5P_DEFAULT, offset, &read_filter_mask, read_direct_buf)) < 0)
|
||||
if((status = H5Dread_chunk(dataset, H5P_DEFAULT, offset, &read_filter_mask, read_direct_buf)) < 0)
|
||||
goto error;
|
||||
if(read_filter_mask != filter_mask)
|
||||
goto error;
|
||||
@@ -948,7 +944,7 @@ test_data_conv(hid_t file)
|
||||
unsigned filter_mask = 0;
|
||||
src_type_t direct_buf[CHUNK_NX][CHUNK_NY];
|
||||
dst_type_t check_chunk[CHUNK_NX][CHUNK_NY];
|
||||
src_type_t read_chunk[CHUNK_NX][CHUNK_NY]; /* For H5DOread_chunk */
|
||||
src_type_t read_chunk[CHUNK_NX][CHUNK_NY]; /* For H5Dread_chunk */
|
||||
|
||||
hsize_t offset[2] = {0, 0};
|
||||
size_t buf_size = CHUNK_NX*CHUNK_NY*sizeof(src_type_t);
|
||||
@@ -958,7 +954,7 @@ test_data_conv(hid_t file)
|
||||
hsize_t count[2]; /* Block count */
|
||||
hsize_t block[2]; /* Block sizes */
|
||||
|
||||
TESTING("data conversion for H5DOwrite_chunk/H5DOread_chunk");
|
||||
TESTING("data conversion for H5Dwrite_chunk/H5Dread_chunk");
|
||||
|
||||
/*
|
||||
* Create the data space with unlimited dimensions.
|
||||
@@ -1031,7 +1027,7 @@ test_data_conv(hid_t file)
|
||||
offset[0] = CHUNK_NX;
|
||||
offset[1] = CHUNK_NY;
|
||||
|
||||
if((status = H5DOwrite_chunk(dataset, dxpl, filter_mask, offset, buf_size, direct_buf)) < 0)
|
||||
if((status = H5Dwrite_chunk(dataset, dxpl, filter_mask, offset, buf_size, direct_buf)) < 0)
|
||||
goto error;
|
||||
|
||||
if(H5Fflush(dataset, H5F_SCOPE_LOCAL) < 0)
|
||||
@@ -1043,8 +1039,8 @@ test_data_conv(hid_t file)
|
||||
if((dataset = H5Dopen2(file, DATASETNAME4, H5P_DEFAULT)) < 0)
|
||||
goto error;
|
||||
|
||||
/* Use H5DOread_chunk() to read the uncompressed data */
|
||||
if((status = H5DOread_chunk(dataset, dxpl, offset, &filter_mask, read_chunk)) < 0)
|
||||
/* Use H5Dread_chunk() to read the uncompressed data */
|
||||
if((status = H5Dread_chunk(dataset, dxpl, offset, &filter_mask, read_chunk)) < 0)
|
||||
goto error;
|
||||
|
||||
/* Check that the values read are the same as the values written */
|
||||
@@ -1141,7 +1137,7 @@ error:
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: test_invalid_parameters
|
||||
*
|
||||
* Purpose: Test invalid parameters for H5DOwrite_chunk and H5DOread_chunk
|
||||
* Purpose: Test invalid parameters for H5Dwrite_chunk and H5Dread_chunk
|
||||
*
|
||||
* Return: Success: 0
|
||||
* Failure: 1
|
||||
@@ -1170,7 +1166,7 @@ test_invalid_parameters(hid_t file)
|
||||
|
||||
hsize_t chunk_nbytes; /* Chunk size */
|
||||
|
||||
TESTING("invalid parameters for H5DOwrite_chunk/H5DOread_chunk");
|
||||
TESTING("invalid parameters for H5Dwrite_chunk/H5Dread_chunk");
|
||||
|
||||
/*
|
||||
* Create the data space with unlimited dimensions.
|
||||
@@ -1188,7 +1184,7 @@ test_invalid_parameters(hid_t file)
|
||||
goto error;
|
||||
|
||||
/*
|
||||
* Create a new contiguous dataset to verify H5DOwrite_chunk/H5DOread_chunk doesn't work
|
||||
* Create a new contiguous dataset to verify H5Dwrite_chunk/H5Dread_chunk doesn't work
|
||||
*/
|
||||
if((dataset = H5Dcreate2(file, DATASETNAME5, H5T_NATIVE_INT, dataspace, H5P_DEFAULT,
|
||||
cparms, H5P_DEFAULT)) < 0)
|
||||
@@ -1208,7 +1204,7 @@ test_invalid_parameters(hid_t file)
|
||||
offset[1] = CHUNK_NY;
|
||||
|
||||
H5E_BEGIN_TRY {
|
||||
if((status = H5DOwrite_chunk(dataset, dxpl, filter_mask, offset, buf_size, direct_buf)) != FAIL)
|
||||
if((status = H5Dwrite_chunk(dataset, dxpl, filter_mask, offset, buf_size, direct_buf)) != FAIL)
|
||||
goto error;
|
||||
} H5E_END_TRY;
|
||||
|
||||
@@ -1218,9 +1214,9 @@ test_invalid_parameters(hid_t file)
|
||||
goto error;
|
||||
} H5E_END_TRY;
|
||||
|
||||
/* Try to H5DOread_chunk from the contiguous dataset. It should fail */
|
||||
/* Try to H5Dread_chunk from the contiguous dataset. It should fail */
|
||||
H5E_BEGIN_TRY {
|
||||
if((status = H5DOread_chunk(dataset, dxpl, offset, &filter_mask, direct_buf)) != FAIL)
|
||||
if((status = H5Dread_chunk(dataset, dxpl, offset, &filter_mask, direct_buf)) != FAIL)
|
||||
goto error;
|
||||
} H5E_END_TRY;
|
||||
|
||||
@@ -1243,83 +1239,83 @@ test_invalid_parameters(hid_t file)
|
||||
cparms, H5P_DEFAULT)) < 0)
|
||||
goto error;
|
||||
|
||||
/* Check invalid dataset ID for H5DOwrite_chunk and H5DOread_chunk */
|
||||
/* Check invalid dataset ID for H5Dwrite_chunk and H5Dread_chunk */
|
||||
H5E_BEGIN_TRY {
|
||||
if((status = H5DOwrite_chunk((hid_t)-1, dxpl, filter_mask, offset, buf_size, direct_buf)) != FAIL)
|
||||
if((status = H5Dwrite_chunk((hid_t)-1, dxpl, filter_mask, offset, buf_size, direct_buf)) != FAIL)
|
||||
goto error;
|
||||
} H5E_END_TRY;
|
||||
|
||||
H5E_BEGIN_TRY {
|
||||
if((status = H5DOread_chunk((hid_t)-1, dxpl, offset, &filter_mask, direct_buf)) != FAIL)
|
||||
if((status = H5Dread_chunk((hid_t)-1, dxpl, offset, &filter_mask, direct_buf)) != FAIL)
|
||||
goto error;
|
||||
} H5E_END_TRY;
|
||||
|
||||
/* Check invalid DXPL ID for H5DOwrite_chunk and H5DOread_chunk */
|
||||
/* Check invalid DXPL ID for H5Dwrite_chunk and H5Dread_chunk */
|
||||
H5E_BEGIN_TRY {
|
||||
if((status = H5DOwrite_chunk(dataset, (hid_t)-1, filter_mask, offset, buf_size, direct_buf)) != FAIL)
|
||||
if((status = H5Dwrite_chunk(dataset, (hid_t)-1, filter_mask, offset, buf_size, direct_buf)) != FAIL)
|
||||
goto error;
|
||||
} H5E_END_TRY;
|
||||
|
||||
H5E_BEGIN_TRY {
|
||||
if((status = H5DOread_chunk(dataset, (hid_t)-1, offset, &filter_mask, direct_buf)) != FAIL)
|
||||
if((status = H5Dread_chunk(dataset, (hid_t)-1, offset, &filter_mask, direct_buf)) != FAIL)
|
||||
goto error;
|
||||
} H5E_END_TRY;
|
||||
|
||||
/* Check invalid OFFSET for H5DOwrite_chunk and H5DOread_chunk */
|
||||
/* Check invalid OFFSET for H5Dwrite_chunk and H5Dread_chunk */
|
||||
H5E_BEGIN_TRY {
|
||||
if((status = H5DOwrite_chunk(dataset, dxpl, filter_mask, NULL, buf_size, direct_buf)) != FAIL)
|
||||
if((status = H5Dwrite_chunk(dataset, dxpl, filter_mask, NULL, buf_size, direct_buf)) != FAIL)
|
||||
goto error;
|
||||
} H5E_END_TRY;
|
||||
|
||||
H5E_BEGIN_TRY {
|
||||
if((status = H5DOread_chunk(dataset, dxpl, NULL, &filter_mask, direct_buf)) != FAIL)
|
||||
if((status = H5Dread_chunk(dataset, dxpl, NULL, &filter_mask, direct_buf)) != FAIL)
|
||||
goto error;
|
||||
} H5E_END_TRY;
|
||||
|
||||
/* Check when OFFSET is out of dataset range for H5DOwrite_chunk and H5DOread_chunk */
|
||||
/* Check when OFFSET is out of dataset range for H5Dwrite_chunk and H5Dread_chunk */
|
||||
offset[0] = NX + 1;
|
||||
offset[1] = NY;
|
||||
H5E_BEGIN_TRY {
|
||||
if((status = H5DOwrite_chunk(dataset, dxpl, filter_mask, offset, buf_size, direct_buf)) != FAIL)
|
||||
if((status = H5Dwrite_chunk(dataset, dxpl, filter_mask, offset, buf_size, direct_buf)) != FAIL)
|
||||
goto error;
|
||||
} H5E_END_TRY;
|
||||
|
||||
H5E_BEGIN_TRY {
|
||||
if((status = H5DOread_chunk(dataset, dxpl, offset, &filter_mask, direct_buf)) != FAIL)
|
||||
if((status = H5Dread_chunk(dataset, dxpl, offset, &filter_mask, direct_buf)) != FAIL)
|
||||
goto error;
|
||||
} H5E_END_TRY;
|
||||
|
||||
/* Check when OFFSET is not on chunk boundary for H5DOwrite_chunk and H5DOread_chunk */
|
||||
/* Check when OFFSET is not on chunk boundary for H5Dwrite_chunk and H5Dread_chunk */
|
||||
offset[0] = CHUNK_NX;
|
||||
offset[1] = CHUNK_NY + 1;
|
||||
H5E_BEGIN_TRY {
|
||||
if((status = H5DOwrite_chunk(dataset, dxpl, filter_mask, offset, buf_size, direct_buf)) != FAIL)
|
||||
if((status = H5Dwrite_chunk(dataset, dxpl, filter_mask, offset, buf_size, direct_buf)) != FAIL)
|
||||
goto error;
|
||||
} H5E_END_TRY;
|
||||
|
||||
H5E_BEGIN_TRY {
|
||||
if((status = H5DOread_chunk(dataset, dxpl, offset, &filter_mask, direct_buf)) != FAIL)
|
||||
if((status = H5Dread_chunk(dataset, dxpl, offset, &filter_mask, direct_buf)) != FAIL)
|
||||
goto error;
|
||||
} H5E_END_TRY;
|
||||
|
||||
/* Check invalid buffer size for H5DOwrite_chunk only */
|
||||
/* Check invalid buffer size for H5Dwrite_chunk only */
|
||||
offset[0] = CHUNK_NX;
|
||||
offset[1] = CHUNK_NY;
|
||||
buf_size = 0;
|
||||
H5E_BEGIN_TRY {
|
||||
if((status = H5DOwrite_chunk(dataset, dxpl, filter_mask, offset, buf_size, direct_buf)) != FAIL)
|
||||
if((status = H5Dwrite_chunk(dataset, dxpl, filter_mask, offset, buf_size, direct_buf)) != FAIL)
|
||||
goto error;
|
||||
} H5E_END_TRY;
|
||||
|
||||
/* Check invalid data buffer for H5DOwrite_chunk and H5DOread_chunk */
|
||||
/* Check invalid data buffer for H5Dwrite_chunk and H5Dread_chunk */
|
||||
buf_size = CHUNK_NX*CHUNK_NY*sizeof(int);
|
||||
H5E_BEGIN_TRY {
|
||||
if((status = H5DOwrite_chunk(dataset, dxpl, filter_mask, offset, buf_size, NULL)) != FAIL)
|
||||
if((status = H5Dwrite_chunk(dataset, dxpl, filter_mask, offset, buf_size, NULL)) != FAIL)
|
||||
goto error;
|
||||
} H5E_END_TRY;
|
||||
|
||||
H5E_BEGIN_TRY {
|
||||
if((status = H5DOread_chunk(dataset, dxpl, offset, &filter_mask, NULL)) != FAIL)
|
||||
if((status = H5Dread_chunk(dataset, dxpl, offset, &filter_mask, NULL)) != FAIL)
|
||||
goto error;
|
||||
} H5E_END_TRY;
|
||||
|
||||
@@ -1353,7 +1349,7 @@ error:
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: test_direct_chunk_read_no_cache
|
||||
*
|
||||
* Purpose: Test the basic functionality of H5DOread_chunk with the
|
||||
* Purpose: Test the basic functionality of H5Dread_chunk with the
|
||||
* chunk cache diabled.
|
||||
*
|
||||
* Return: Success: 0
|
||||
@@ -1379,10 +1375,10 @@ test_direct_chunk_read_no_cache (hid_t file)
|
||||
int data[NX][NY];
|
||||
int i, j, k, l, n; /* local index variables */
|
||||
|
||||
unsigned filter_mask = 0; /* filter mask returned from H5DOread_chunk */
|
||||
int direct_buf[CHUNK_NX][CHUNK_NY]; /* chunk read with H5DOread and manually decompressed */
|
||||
unsigned filter_mask = 0; /* filter mask returned from H5Dread_chunk */
|
||||
int direct_buf[CHUNK_NX][CHUNK_NY]; /* chunk read with H5Dread and manually decompressed */
|
||||
int check_chunk[CHUNK_NX][CHUNK_NY]; /* chunk read with H5Dread */
|
||||
hsize_t offset[2]; /* chunk offset used for H5DOread_chunk */
|
||||
hsize_t offset[2]; /* chunk offset used for H5Dread_chunk */
|
||||
size_t buf_size = CHUNK_NX*CHUNK_NY*sizeof(int);
|
||||
|
||||
Bytef *z_src = NULL; /* source buffer */
|
||||
@@ -1397,7 +1393,7 @@ test_direct_chunk_read_no_cache (hid_t file)
|
||||
hsize_t count[2]; /* Block count */
|
||||
hsize_t block[2]; /* Block sizes */
|
||||
|
||||
TESTING("basic functionality of H5DOread_chunk (chunk cache disabled)");
|
||||
TESTING("basic functionality of H5Dread_chunk (chunk cache disabled)");
|
||||
|
||||
/* Create the data space with unlimited dimensions. */
|
||||
if((dataspace = H5Screate_simple(RANK, dims, maxdims)) < 0)
|
||||
@@ -1442,7 +1438,7 @@ test_direct_chunk_read_no_cache (hid_t file)
|
||||
outbuf = HDmalloc(z_src_nbytes);
|
||||
z_src = (Bytef *)outbuf;
|
||||
|
||||
/* For each chunk in the dataset, compare the result of H5Dread and H5DOread_chunk. */
|
||||
/* For each chunk in the dataset, compare the result of H5Dread and H5Dread_chunk. */
|
||||
for(i=0; i<NX/CHUNK_NX; i++) {
|
||||
for(j=0; j<NY/CHUNK_NY; j++) {
|
||||
/* Select hyperslab for one chunk in the file */
|
||||
@@ -1461,7 +1457,7 @@ test_direct_chunk_read_no_cache (hid_t file)
|
||||
|
||||
offset[0] = (hsize_t)i * CHUNK_NX; offset[1] = (hsize_t)j * CHUNK_NY;
|
||||
/* Read the compressed chunk back using the direct read function. */
|
||||
if((status = H5DOread_chunk(dataset, dxpl, offset, &filter_mask, outbuf)) < 0)
|
||||
if((status = H5Dread_chunk(dataset, dxpl, offset, &filter_mask, outbuf)) < 0)
|
||||
goto error;
|
||||
|
||||
/* Check filter mask return value */
|
||||
@@ -1547,10 +1543,10 @@ test_direct_chunk_read_cache (hid_t file, hbool_t flush)
|
||||
int data[NX][NY];
|
||||
int i, j, k, l, n; /* local index variables */
|
||||
|
||||
unsigned filter_mask = 0; /* filter mask returned from H5DOread_chunk */
|
||||
int direct_buf[CHUNK_NX][CHUNK_NY]; /* chunk read with H5DOread and manually decompressed */
|
||||
unsigned filter_mask = 0; /* filter mask returned from H5Dread_chunk */
|
||||
int direct_buf[CHUNK_NX][CHUNK_NY]; /* chunk read with H5Dread and manually decompressed */
|
||||
int check_chunk[CHUNK_NX][CHUNK_NY]; /* chunk read with H5Dread */
|
||||
hsize_t offset[2]; /* chunk offset used for H5DOread_chunk */
|
||||
hsize_t offset[2]; /* chunk offset used for H5Dread_chunk */
|
||||
size_t buf_size = CHUNK_NX*CHUNK_NY*sizeof(int);
|
||||
|
||||
Bytef *z_src = NULL; /* source buffer */
|
||||
@@ -1567,9 +1563,9 @@ test_direct_chunk_read_cache (hid_t file, hbool_t flush)
|
||||
hsize_t block[2]; /* Block sizes */
|
||||
|
||||
if(flush) {
|
||||
TESTING("basic functionality of H5DOread_chunk (flush chunk cache)");
|
||||
TESTING("basic functionality of H5Dread_chunk (flush chunk cache)");
|
||||
} else {
|
||||
TESTING("basic functionality of H5DOread_chunk (does not flush chunk cache)");
|
||||
TESTING("basic functionality of H5Dread_chunk (does not flush chunk cache)");
|
||||
}
|
||||
|
||||
/* Create the data space with unlimited dimensions. */
|
||||
@@ -1615,7 +1611,7 @@ test_direct_chunk_read_cache (hid_t file, hbool_t flush)
|
||||
outbuf = HDmalloc(z_src_nbytes);
|
||||
z_src = (Bytef *)outbuf;
|
||||
|
||||
/* For each chunk in the dataset, compare the result of H5Dread and H5DOread_chunk. */
|
||||
/* For each chunk in the dataset, compare the result of H5Dread and H5Dread_chunk. */
|
||||
for(i=0; i<NX/CHUNK_NX; i++) {
|
||||
for(j=0; j<NY/CHUNK_NY; j++) {
|
||||
/* Select hyperslab for one chunk in the file */
|
||||
@@ -1641,7 +1637,7 @@ test_direct_chunk_read_cache (hid_t file, hbool_t flush)
|
||||
goto error;
|
||||
|
||||
/* Read the compressed chunk back using the direct read function. */
|
||||
if((status = H5DOread_chunk(dataset, dxpl, offset, &filter_mask, outbuf)) < 0)
|
||||
if((status = H5Dread_chunk(dataset, dxpl, offset, &filter_mask, outbuf)) < 0)
|
||||
goto error;
|
||||
|
||||
/* Check filter mask return value */
|
||||
@@ -1713,7 +1709,7 @@ error:
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: test_read_unfiltered_dset
|
||||
*
|
||||
* Purpose: Test the basic functionality of H5DOread_chunk on a dataset
|
||||
* Purpose: Test the basic functionality of H5Dread_chunk on a dataset
|
||||
* without no filters applied.
|
||||
*
|
||||
* Return: Success: 0
|
||||
@@ -1749,7 +1745,7 @@ test_read_unfiltered_dset(hid_t file)
|
||||
hsize_t count[2]; /* Block count */
|
||||
hsize_t block[2]; /* Block sizes */
|
||||
|
||||
TESTING("basic functionality of H5DOread_chunk on unfiltered datasets");
|
||||
TESTING("basic functionality of H5Dread_chunk on unfiltered datasets");
|
||||
|
||||
/* Create the data space with unlimited dimensions. */
|
||||
if((dataspace = H5Screate_simple(RANK, dims, maxdims)) < 0)
|
||||
@@ -1778,7 +1774,7 @@ test_read_unfiltered_dset(hid_t file)
|
||||
|
||||
/* Write the data for the dataset.
|
||||
* It should stay in the chunk cache and will be evicted/flushed by
|
||||
* the H5DOread_chunk function call. */
|
||||
* the H5Dread_chunk function call. */
|
||||
if((status = H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL,
|
||||
dxpl, data)) < 0)
|
||||
goto error;
|
||||
@@ -1786,7 +1782,7 @@ test_read_unfiltered_dset(hid_t file)
|
||||
if(H5Fflush(dataset, H5F_SCOPE_LOCAL) < 0)
|
||||
goto error;
|
||||
|
||||
/* For each chunk in the dataset, compare the result of H5Dread and H5DOread_chunk. */
|
||||
/* For each chunk in the dataset, compare the result of H5Dread and H5Dread_chunk. */
|
||||
for(i=0; i<NX/CHUNK_NX; i++) {
|
||||
for(j=0; j<NY/CHUNK_NY; j++) {
|
||||
/* Select hyperslab for one chunk in the file */
|
||||
@@ -1814,7 +1810,7 @@ test_read_unfiltered_dset(hid_t file)
|
||||
/* Read the raw chunk back */
|
||||
HDmemset(&direct_buf, 0, sizeof(direct_buf));
|
||||
filter_mask = UINT_MAX;
|
||||
if((status = H5DOread_chunk(dataset, dxpl, offset, &filter_mask, direct_buf)) < 0)
|
||||
if((status = H5Dread_chunk(dataset, dxpl, offset, &filter_mask, direct_buf)) < 0)
|
||||
goto error;
|
||||
|
||||
/* Check filter mask return value */
|
||||
@@ -1861,7 +1857,7 @@ error:
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: test_read_unallocated_chunk
|
||||
*
|
||||
* Purpose: Tests the H5DOread_chunk and H5Dget_chunk_storage_size with valid
|
||||
* Purpose: Tests the H5Dread_chunk and H5Dget_chunk_storage_size with valid
|
||||
* offets to chunks that have not been written to the dataset and are
|
||||
* not allocated in the chunk storage on disk.
|
||||
*
|
||||
@@ -1887,11 +1883,11 @@ test_read_unallocated_chunk (hid_t file)
|
||||
herr_t status; /* status from H5 function calls */
|
||||
hsize_t i, j; /* local index variables */
|
||||
|
||||
unsigned filter_mask = 0; /* filter mask returned from H5DOread_chunk */
|
||||
int direct_buf[CHUNK_NX][CHUNK_NY]; /* chunk read with H5DOread and manually decompressed */
|
||||
hsize_t offset[2]; /* chunk offset used for H5DOread_chunk */
|
||||
unsigned filter_mask = 0; /* filter mask returned from H5Dread_chunk */
|
||||
int direct_buf[CHUNK_NX][CHUNK_NY]; /* chunk read with H5Dread and manually decompressed */
|
||||
hsize_t offset[2]; /* chunk offset used for H5Dread_chunk */
|
||||
|
||||
TESTING("H5DOread_chunk with unallocated chunks");
|
||||
TESTING("H5Dread_chunk with unallocated chunks");
|
||||
|
||||
/* Create the data space with unlimited dimensions. */
|
||||
if((dataspace = H5Screate_simple(RANK, dims, maxdims)) < 0)
|
||||
@@ -1917,11 +1913,11 @@ test_read_unallocated_chunk (hid_t file)
|
||||
HDmemset(&chunk_dims, 0, sizeof(chunk_dims));
|
||||
offset[0] = 0; offset[1] = 0;
|
||||
|
||||
if(H5DOwrite_chunk(dataset, dxpl, filter_mask, offset, chunk_nbytes, &chunk_dims) < 0)
|
||||
if(H5Dwrite_chunk(dataset, dxpl, filter_mask, offset, chunk_nbytes, &chunk_dims) < 0)
|
||||
goto error;
|
||||
|
||||
/* Attempt to read each chunk in the dataset. Chunks are not allocated,
|
||||
* therefore we expect the result of H5DOread_chunk to fail. Chunk idx starts
|
||||
* therefore we expect the result of H5Dread_chunk to fail. Chunk idx starts
|
||||
* at 1, since one chunk was written to init the chunk storage. */
|
||||
for(i=1; i<NX/CHUNK_NX; i++) {
|
||||
for(j=0; j<NY/CHUNK_NY; j++) {
|
||||
@@ -1931,7 +1927,7 @@ test_read_unallocated_chunk (hid_t file)
|
||||
|
||||
/* Read a non-existant chunk using the direct read function. */
|
||||
H5E_BEGIN_TRY {
|
||||
status = H5DOread_chunk(dataset, dxpl, offset, &filter_mask, &direct_buf);
|
||||
status = H5Dread_chunk(dataset, dxpl, offset, &filter_mask, &direct_buf);
|
||||
} H5E_END_TRY;
|
||||
|
||||
/* Check that the chunk read call does not succeed. */
|
||||
@@ -2013,7 +2009,7 @@ test_single_chunk_latest(void)
|
||||
int rdata[DIM0][DIM1]; /* Read buffer */
|
||||
int i, j; /* Local index variable */
|
||||
|
||||
TESTING("H5DOwrite_chunk with single chunk and latest format");
|
||||
TESTING("H5Dwrite_chunk with single chunk and latest format");
|
||||
|
||||
/* Initialize data */
|
||||
for (i=0; i<DIM0; i++) {
|
||||
@@ -2044,7 +2040,7 @@ test_single_chunk_latest(void)
|
||||
goto error;
|
||||
|
||||
/* Write the data directly to the dataset */
|
||||
if(H5DOwrite_chunk(did, H5P_DEFAULT, 0, offset, CHUNK0*CHUNK1*4, (void *)wdata) < 0)
|
||||
if(H5Dwrite_chunk(did, H5P_DEFAULT, 0, offset, CHUNK0*CHUNK1*4, (void *)wdata) < 0)
|
||||
goto error;
|
||||
|
||||
/*
|
||||
@@ -2112,8 +2108,8 @@ error:
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: Main function
|
||||
*
|
||||
* Purpose: Test direct chunk write function H5DOwrite_chunk and
|
||||
* chunk direct read function H5DOread_chunk
|
||||
* Purpose: Test direct chunk write function H5Dwrite_chunk and
|
||||
* chunk direct read function H5Dread_chunk
|
||||
*
|
||||
* Return: Success: 0
|
||||
* Failure: 1
|
||||
@@ -12,11 +12,11 @@
|
||||
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||
|
||||
/*
|
||||
* This test is for the DECTRIS project to the H5DOwrite_chunk function
|
||||
* This tests the performance of the H5Dwrite_chunk() function.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "hdf5_hl.h"
|
||||
#include "hdf5.h"
|
||||
|
||||
#ifdef H5_HAVE_FILTER_DEFLATE
|
||||
#include <zlib.h>
|
||||
@@ -51,7 +51,7 @@
|
||||
#endif
|
||||
|
||||
const char *FILENAME[] = {
|
||||
"dectris_perf",
|
||||
"direct_write",
|
||||
"unix.raw",
|
||||
NULL
|
||||
};
|
||||
@@ -285,7 +285,7 @@ test_direct_write_uncompressed_data(hid_t fapl_id)
|
||||
|
||||
struct timeval timeval_start;
|
||||
|
||||
TESTING("H5DOwrite_chunk for uncompressed data");
|
||||
TESTING("H5Dwrite_chunk for uncompressed data");
|
||||
|
||||
if((dxpl = H5Pcreate(H5P_DATASET_XFER)) < 0)
|
||||
TEST_ERROR;
|
||||
@@ -304,7 +304,7 @@ test_direct_write_uncompressed_data(hid_t fapl_id)
|
||||
/* Write the compressed chunk data repeatedly to cover all the chunks in the
|
||||
* dataset, using the direct writing function. */
|
||||
for(i=0; i<NX; i++) {
|
||||
status = H5DOwrite_chunk(dataset, dxpl, filter_mask, offset, CHUNK_NY*CHUNK_NZ*sizeof(unsigned int), direct_buf[i]);
|
||||
status = H5Dwrite_chunk(dataset, dxpl, filter_mask, offset, CHUNK_NY*CHUNK_NZ*sizeof(unsigned int), direct_buf[i]);
|
||||
(offset[0])++;
|
||||
}
|
||||
|
||||
@@ -369,7 +369,7 @@ test_direct_write_compressed_data(hid_t fapl_id)
|
||||
/* Write the compressed chunk data repeatedly to cover all the chunks in the
|
||||
* dataset, using the direct writing function. */
|
||||
for(i=0; i<NX; i++) {
|
||||
status = H5DOwrite_chunk(dataset, dxpl, filter_mask, offset, data_size[i], outbuf[i]);
|
||||
status = H5Dwrite_chunk(dataset, dxpl, filter_mask, offset, data_size[i], outbuf[i]);
|
||||
(offset[0])++;
|
||||
}
|
||||
|
||||
@@ -637,12 +637,6 @@ main (void)
|
||||
hid_t fapl = H5P_DEFAULT;
|
||||
int i;
|
||||
|
||||
/* Testing setup */
|
||||
/* h5_reset();
|
||||
fapl = h5_fileaccess();
|
||||
|
||||
h5_fixname(FILENAME[0], fapl, filename, sizeof filename);*/
|
||||
|
||||
sprintf(filename, "%s.h5", FILENAME[0]);
|
||||
|
||||
create_file(fapl);
|
||||
@@ -657,7 +651,6 @@ main (void)
|
||||
free(direct_buf[i]);
|
||||
}
|
||||
|
||||
/* h5_cleanup(FILENAME, fapl);*/
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user