[svn-r4329] Purpose:

Bug Fix
Description:
    The datatype conversion buffer size was only halfway converted from hsize_t
    to size_t and was causing problems.  Also, the H5P_peek_<foo> routines have
    a bunch of identical code.
Solution:
    Finished converting the datatype conversion buffer size to size_t and
    cleaned up the implementation of the H5P_peek_<foo> routines to call a
    common routine instead of reimplementing a bunch of code.
Platforms tested:
    Solaris 2.7 (arabica)
This commit is contained in:
Quincey Koziol 2001-08-11 22:56:45 -05:00
parent 80c02cc6f1
commit 9cb6f1ae5d
5 changed files with 60 additions and 168 deletions

View File

@ -140,7 +140,7 @@ static herr_t
H5D_init_interface(void)
{
H5P_genclass_t *pclass; /* Property list class to modify */
hsize_t def_max_temp_buf=H5D_XFER_MAX_TEMP_BUF_DEF; /* Default value for maximum temp buffer size */
size_t def_max_temp_buf=H5D_XFER_MAX_TEMP_BUF_DEF; /* Default value for maximum temp buffer size */
void *def_tconv_buf=H5D_XFER_TCONV_BUF_DEF; /* Default value for type conversion buffer */
void *def_bkgr_buf=H5D_XFER_BKGR_BUF_DEF; /* Default value for background buffer */
H5T_bkg_t def_bkgr_buf_type=H5D_XFER_BKGR_BUF_TYPE_DEF; /* Default value for background buffer type */
@ -1956,7 +1956,7 @@ printf("%s: check 1.2, \n",FUNC);
src_type_size = H5T_get_size(dataset->type);
dst_type_size = H5T_get_size(mem_type);
target_size = H5P_peek_hsize_t(dxpl_id,H5D_XFER_MAX_TEMP_BUF_NAME);
target_size = H5P_peek_size_t(dxpl_id,H5D_XFER_MAX_TEMP_BUF_NAME);
#ifdef QAK
printf("%s: check 2.0, src_type_size=%d, dst_type_size=%d, target_size=%d\n",FUNC,(int)src_type_size,(int)dst_type_size,(int)target_size);
#endif /* QAK */
@ -2432,7 +2432,7 @@ H5D_write(H5D_t *dataset, const H5T_t *mem_type, const H5S_t *mem_space,
src_type_size = H5T_get_size(mem_type);
dst_type_size = H5T_get_size(dataset->type);
target_size = H5P_peek_hsize_t(dxpl_id,H5D_XFER_MAX_TEMP_BUF_NAME);
target_size = H5P_peek_size_t(dxpl_id,H5D_XFER_MAX_TEMP_BUF_NAME);
#ifdef QAK
printf("%s: check 2.0, src_type_size=%d, dst_type_size=%d, target_size=%d\n",FUNC,(int)src_type_size,(int)dst_type_size,(int)target_size);
#endif /* QAK */

View File

@ -54,7 +54,7 @@ typedef struct H5D_create_t {
/* Data transfer properties */
/* Definitions for maximum temp buffer size property */
#define H5D_XFER_MAX_TEMP_BUF_NAME "max_temp_buf"
#define H5D_XFER_MAX_TEMP_BUF_SIZE sizeof(hsize_t)
#define H5D_XFER_MAX_TEMP_BUF_SIZE sizeof(size_t)
#define H5D_XFER_MAX_TEMP_BUF_DEF (1024*1024)
/* Definitions for type conversion buffer property */
#define H5D_XFER_TCONV_BUF_NAME "tconv_buf"

217
src/H5P.c
View File

@ -2278,7 +2278,7 @@ H5Pset_buffer(hid_t plist_id, size_t size, void *tconv, void *bkg)
*
*-------------------------------------------------------------------------
*/
hsize_t
size_t
H5Pget_buffer(hid_t plist_id, void **tconv/*out*/, void **bkg/*out*/)
{
size_t size; /* Type conversion buffer size */
@ -5088,6 +5088,7 @@ herr_t H5Pset(hid_t plist_id, const char *name, void *value)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalied property value");
/* Create the new property list class */
printf("%s: name, value=%u\n",FUNC,name,*(size_t *)(value));
if ((ret_value=H5P_set(plist_id,name,value))<0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTREGISTER, FAIL, "unable to set value in plist");
@ -6375,52 +6376,14 @@ done:
--------------------------------------------------------------------------*/
uintn H5P_peek_uintn(hid_t plist_id, const char *name)
{
H5P_genplist_t *plist; /* Property list pointer */
H5P_genprop_t *prop; /* Temporary property pointer */
uintn ret_value; /* return value */
FUNC_ENTER (H5P_peek_uintn, UFAIL);
assert(name);
/* Check arguments. */
if (H5I_GENPROP_LST != H5I_get_type(plist_id) || NULL == (plist = H5I_object(plist_id)))
assert(0 && "not a property list");
/* Find property */
if((prop=H5P_find_prop(plist->props,plist->pclass->hashsize,name))==NULL)
assert(0 && "property doesn't exist");
/* Check for property size >0 */
if(prop->size==0)
assert(0 && "property has zero size");
/* Check for property size not the same as the return type */
if(prop->size!=sizeof(uintn))
assert(0 && "property has incorrect size");
/* Make a copy of the value and pass to 'get' callback */
if(prop->get!=NULL) {
void *tmp_value; /* Temporary value for property */
/* Make a copy of the current value, in case the callback fails */
if (NULL==(tmp_value=H5MM_malloc(prop->size)))
assert(0 && "memory allocation failed temporary property value");
HDmemcpy(tmp_value,prop->value,prop->size);
/* Call user's callback */
if((*(prop->get))(plist_id,name,prop->size,tmp_value)<0)
assert(0 && "can't get property value");
/* Copy new [possibly unchanged] value into return value */
HDmemcpy(&ret_value,tmp_value,sizeof(uintn));
/* Free the temporary value buffer */
H5MM_xfree(tmp_value);
} /* end if */
/* No 'get' callback, just copy value */
else
HDmemcpy(&ret_value,prop->value,sizeof(uintn));
/* Get the value to return, don't worry about the return value, we can't return it */
H5P_get(plist_id,name,&ret_value);
FUNC_LEAVE (ret_value);
} /* H5P_peek_uintn() */
@ -6455,52 +6418,14 @@ uintn H5P_peek_uintn(hid_t plist_id, const char *name)
--------------------------------------------------------------------------*/
hid_t H5P_peek_hid_t(hid_t plist_id, const char *name)
{
H5P_genplist_t *plist; /* Property list pointer */
H5P_genprop_t *prop; /* Temporary property pointer */
hid_t ret_value; /* return value */
FUNC_ENTER (H5P_peek_hid_t, FAIL);
assert(name);
/* Check arguments. */
if (H5I_GENPROP_LST != H5I_get_type(plist_id) || NULL == (plist = H5I_object(plist_id)))
assert(0 && "not a property list");
/* Find property */
if((prop=H5P_find_prop(plist->props,plist->pclass->hashsize,name))==NULL)
assert(0 && "property doesn't exist");
/* Check for property size >0 */
if(prop->size==0)
assert(0 && "property has zero size");
/* Check for property size not the same as the return type */
if(prop->size!=sizeof(hid_t))
assert(0 && "property has incorrect size");
/* Make a copy of the value and pass to 'get' callback */
if(prop->get!=NULL) {
void *tmp_value; /* Temporary value for property */
/* Make a copy of the current value, in case the callback fails */
if (NULL==(tmp_value=H5MM_malloc(prop->size)))
assert(0 && "memory allocation failed temporary property value");
HDmemcpy(tmp_value,prop->value,prop->size);
/* Call user's callback */
if((*(prop->get))(plist_id,name,prop->size,tmp_value)<0)
assert(0 && "can't get property value");
/* Copy new [possibly unchanged] value into return value */
HDmemcpy(&ret_value,tmp_value,sizeof(hid_t));
/* Free the temporary value buffer */
H5MM_xfree(tmp_value);
} /* end if */
/* No 'get' callback, just copy value */
else
HDmemcpy(&ret_value,prop->value,sizeof(hid_t));
/* Get the value to return, don't worry about the return value, we can't return it */
H5P_get(plist_id,name,&ret_value);
FUNC_LEAVE (ret_value);
} /* H5P_peek_hid_t() */
@ -6535,52 +6460,14 @@ hid_t H5P_peek_hid_t(hid_t plist_id, const char *name)
--------------------------------------------------------------------------*/
void *H5P_peek_voidp(hid_t plist_id, const char *name)
{
H5P_genplist_t *plist; /* Property list pointer */
H5P_genprop_t *prop; /* Temporary property pointer */
void * ret_value; /* return value */
FUNC_ENTER (H5P_peek_hid_t, NULL);
FUNC_ENTER (H5P_peek_voidp_t, NULL);
assert(name);
/* Check arguments. */
if (H5I_GENPROP_LST != H5I_get_type(plist_id) || NULL == (plist = H5I_object(plist_id)))
assert(0 && "not a property list");
/* Find property */
if((prop=H5P_find_prop(plist->props,plist->pclass->hashsize,name))==NULL)
assert(0 && "property doesn't exist");
/* Check for property size >0 */
if(prop->size==0)
assert(0 && "property has zero size");
/* Check for property size not the same as the return type */
if(prop->size!=sizeof(void *))
assert(0 && "property has incorrect size");
/* Make a copy of the value and pass to 'get' callback */
if(prop->get!=NULL) {
void *tmp_value; /* Temporary value for property */
/* Make a copy of the current value, in case the callback fails */
if (NULL==(tmp_value=H5MM_malloc(prop->size)))
assert(0 && "memory allocation failed temporary property value");
HDmemcpy(tmp_value,prop->value,prop->size);
/* Call user's callback */
if((*(prop->get))(plist_id,name,prop->size,tmp_value)<0)
assert(0 && "can't get property value");
/* Copy new [possibly unchanged] value into return value */
HDmemcpy(&ret_value,tmp_value,sizeof(void *));
/* Free the temporary value buffer */
H5MM_xfree(tmp_value);
} /* end if */
/* No 'get' callback, just copy value */
else
HDmemcpy(&ret_value,prop->value,sizeof(void *));
/* Get the value to return, don't worry about the return value, we can't return it */
H5P_get(plist_id,name,&ret_value);
FUNC_LEAVE (ret_value);
} /* H5P_peek_voidp() */
@ -6615,56 +6502,60 @@ void *H5P_peek_voidp(hid_t plist_id, const char *name)
--------------------------------------------------------------------------*/
hsize_t H5P_peek_hsize_t(hid_t plist_id, const char *name)
{
H5P_genplist_t *plist; /* Property list pointer */
H5P_genprop_t *prop; /* Temporary property pointer */
hsize_t ret_value; /* return value */
FUNC_ENTER (H5P_peek_hid_t, UFAIL);
FUNC_ENTER (H5P_peek_hsize_t, UFAIL);
assert(name);
/* Check arguments. */
if (H5I_GENPROP_LST != H5I_get_type(plist_id) || NULL == (plist = H5I_object(plist_id)))
assert(0 && "not a property list");
/* Find property */
if((prop=H5P_find_prop(plist->props,plist->pclass->hashsize,name))==NULL)
assert(0 && "property doesn't exist");
/* Check for property size >0 */
if(prop->size==0)
assert(0 && "property has zero size");
/* Check for property size not the same as the return type */
if(prop->size!=sizeof(hsize_t))
assert(0 && "property has incorrect size");
/* Make a copy of the value and pass to 'get' callback */
if(prop->get!=NULL) {
void *tmp_value; /* Temporary value for property */
/* Make a copy of the current value, in case the callback fails */
if (NULL==(tmp_value=H5MM_malloc(prop->size)))
assert(0 && "memory allocation failed temporary property value");
HDmemcpy(tmp_value,prop->value,prop->size);
/* Call user's callback */
if((*(prop->get))(plist_id,name,prop->size,tmp_value)<0)
assert(0 && "can't get property value");
/* Copy new [possibly unchanged] value into return value */
HDmemcpy(&ret_value,tmp_value,sizeof(hsize_t));
/* Free the temporary value buffer */
H5MM_xfree(tmp_value);
} /* end if */
/* No 'get' callback, just copy value */
else
HDmemcpy(&ret_value,prop->value,sizeof(hsize_t));
/* Get the value to return, don't worry about the return value, we can't return it */
H5P_get(plist_id,name,&ret_value);
FUNC_LEAVE (ret_value);
} /* H5P_peek_hsize_t() */
/*--------------------------------------------------------------------------
NAME
H5P_peek_size_t
PURPOSE
Internal routine to quickly retrieve the value of a property in a property list.
USAGE
hsize_t H5P_peek_size_t(plist_id, name)
hid_t plist_id; IN: Property list to check
const char *name; IN: Name of property to query
RETURNS
Directly returns the value of the property in the list
DESCRIPTION
This function directly returns the value of a property in a property
list. Because this function is only able to just copy a particular property
value to the return value, there is no way to check for errors. We attempt
to make certain that bad things don't happen by validating that the size of
the property is the same as the size of the return type, but that can't
catch all errors.
This function does call the user's 'get' callback routine still.
GLOBAL VARIABLES
COMMENTS, BUGS, ASSUMPTIONS
No error checking!
Use with caution!
EXAMPLES
REVISION LOG
--------------------------------------------------------------------------*/
size_t H5P_peek_size_t(hid_t plist_id, const char *name)
{
size_t ret_value; /* return value */
FUNC_ENTER (H5P_peek_size_t, UFAIL);
assert(name);
/* Get the value to return, don't worry about the return value, we can't return it */
H5P_get(plist_id,name,&ret_value);
FUNC_LEAVE (ret_value);
} /* H5P_peek_size_t() */
/*--------------------------------------------------------------------------
NAME

View File

@ -120,5 +120,6 @@ __DLL__ uintn H5P_peek_uintn(hid_t plist_id, const char *name);
__DLL__ hid_t H5P_peek_hid_t(hid_t plist_id, const char *name);
__DLL__ void *H5P_peek_voidp(hid_t plist_id, const char *name);
__DLL__ hsize_t H5P_peek_hsize_t(hid_t plist_id, const char *name);
__DLL__ size_t H5P_peek_size_t(hid_t plist_id, const char *name);
#endif

View File

@ -182,7 +182,7 @@ __DLL__ hid_t H5Pget_driver(hid_t plist_id);
__DLL__ void *H5Pget_driver_info(hid_t plist_id);
__DLL__ herr_t H5Pset_buffer(hid_t plist_id, size_t size, void *tconv,
void *bkg);
__DLL__ hsize_t H5Pget_buffer(hid_t plist_id, void **tconv/*out*/,
__DLL__ size_t H5Pget_buffer(hid_t plist_id, void **tconv/*out*/,
void **bkg/*out*/);
__DLL__ herr_t H5Pset_preserve(hid_t plist_id, hbool_t status);
__DLL__ int H5Pget_preserve(hid_t plist_id);