[svn-r12769] Description:

Move object header creation past several internal possibilities for
errors, making the routine more resistant to errors encountered.

    Also, various formatting/compiler warning cleanups.

Tested on:
    Linux/32 2.6 (chicago)
    Linux/64 2.6 (chicago2)
This commit is contained in:
Quincey Koziol 2006-10-16 18:02:03 -05:00
parent 16a95636a3
commit a504b0dcc3

103
src/H5D.c
View File

@ -1413,9 +1413,8 @@ H5Dopen(hid_t loc_id, const char *name)
HGOTO_ERROR(H5E_DATASET, H5E_BADTYPE, FAIL, "not a dataset") HGOTO_ERROR(H5E_DATASET, H5E_BADTYPE, FAIL, "not a dataset")
/* Open the dataset */ /* Open the dataset */
if((dset = H5D_open(&dset_loc, dxpl_id)) == NULL) { if((dset = H5D_open(&dset_loc, dxpl_id)) == NULL)
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't open dataset") HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't open dataset")
} /* end if */
/* Register an atom for the dataset */ /* Register an atom for the dataset */
if((ret_value = H5I_register(H5I_DATASET, dset)) < 0) if((ret_value = H5I_register(H5I_DATASET, dset)) < 0)
@ -1499,9 +1498,8 @@ H5Dopen_expand(hid_t loc_id, const char *name, hid_t dapl_id)
HGOTO_ERROR(H5E_DATASET, H5E_BADTYPE, FAIL, "not a dataset") HGOTO_ERROR(H5E_DATASET, H5E_BADTYPE, FAIL, "not a dataset")
/* Open the dataset */ /* Open the dataset */
if((dset = H5D_open(&dset_loc, dxpl_id)) == NULL) { if((dset = H5D_open(&dset_loc, dxpl_id)) == NULL)
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't open dataset") HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't open dataset")
} /* end if */
/* Register an atom for the dataset */ /* Register an atom for the dataset */
if((ret_value = H5I_register(H5I_DATASET, dset)) < 0) if((ret_value = H5I_register(H5I_DATASET, dset)) < 0)
@ -1901,7 +1899,8 @@ H5D_new(hid_t dcpl_id, hbool_t creating, hbool_t vl_type)
FUNC_ENTER_NOAPI_NOINIT(H5D_new) FUNC_ENTER_NOAPI_NOINIT(H5D_new)
if (NULL==(new_dset = H5FL_MALLOC(H5D_shared_t))) /* Allocate new shared dataset structure */
if(NULL == (new_dset = H5FL_MALLOC(H5D_shared_t)))
HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed") HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
/* If we are using the default dataset creation property list, during creation /* If we are using the default dataset creation property list, during creation
@ -1909,37 +1908,36 @@ H5D_new(hid_t dcpl_id, hbool_t creating, hbool_t vl_type)
*/ */
if(!vl_type && creating && dcpl_id == H5P_DATASET_CREATE_DEFAULT) { if(!vl_type && creating && dcpl_id == H5P_DATASET_CREATE_DEFAULT) {
/* Copy the default dataset information */ /* Copy the default dataset information */
HDmemcpy(new_dset,&H5D_def_dset,sizeof(H5D_shared_t)); HDmemcpy(new_dset, &H5D_def_dset, sizeof(H5D_shared_t));
if(H5I_inc_ref(dcpl_id)<0) if(H5I_inc_ref(dcpl_id) < 0)
HGOTO_ERROR (H5E_DATASET, H5E_CANTINC, NULL, "Can't increment default DCPL ID") HGOTO_ERROR (H5E_DATASET, H5E_CANTINC, NULL, "Can't increment default DCPL ID")
new_dset->dcpl_id = dcpl_id; new_dset->dcpl_id = dcpl_id;
} /* end if */ } /* end if */
else { else {
/* Reset the dataset information */ /* Reset the dataset information */
HDmemset(new_dset,0,sizeof(H5D_shared_t)); HDmemset(new_dset, 0, sizeof(H5D_shared_t));
/* Get the property list */ /* Get the property list */
if (NULL == (plist = H5I_object(dcpl_id))) if(NULL == (plist = H5I_object(dcpl_id)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a property list") HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a property list")
new_dset->dcpl_id = H5P_copy_plist(plist); new_dset->dcpl_id = H5P_copy_plist(plist);
} /* end else */ } /* end else */
/* Set return value */ /* Set return value */
ret_value=new_dset; ret_value = new_dset;
done: done:
if(ret_value==NULL) { if(ret_value == NULL)
if(new_dset!=NULL) { if(new_dset != NULL) {
if(new_dset->dcpl_id!=0) if(new_dset->dcpl_id != 0)
(void)H5I_dec_ref(new_dset->dcpl_id); (void)H5I_dec_ref(new_dset->dcpl_id);
H5FL_FREE(H5D_shared_t,new_dset); H5FL_FREE(H5D_shared_t, new_dset);
} /* end if */ } /* end if */
} /* end if */
FUNC_LEAVE_NOAPI(ret_value) FUNC_LEAVE_NOAPI(ret_value)
} } /* end H5D_new() */
/*------------------------------------------------------------------------- /*-------------------------------------------------------------------------
@ -2042,11 +2040,9 @@ H5D_update_entry_info(H5F_t *file, hid_t dxpl_id, H5D_t *dset, H5P_genplist_t *p
H5O_fill_new_t fill = { NULL, 0, NULL, H5D_ALLOC_TIME_LATE, H5D_FILL_TIME_ALLOC, TRUE }; H5O_fill_new_t fill = { NULL, 0, NULL, H5D_ALLOC_TIME_LATE, H5D_FILL_TIME_ALLOC, TRUE };
H5D_fill_value_t fill_status; H5D_fill_value_t fill_status;
struct H5O_t *oh=NULL; /* Pointer to dataset's object header */ struct H5O_t *oh = NULL; /* Pointer to dataset's object header */
unsigned oh_flags = H5AC__DIRTIED_FLAG; unsigned oh_flags = H5AC__DIRTIED_FLAG;
herr_t ret_value = SUCCEED; /* Return value */
/* return code */
herr_t ret_value = SUCCEED;
FUNC_ENTER_NOAPI(H5D_update_entry_info, FAIL) FUNC_ENTER_NOAPI(H5D_update_entry_info, FAIL)
@ -2065,18 +2061,6 @@ H5D_update_entry_info(H5F_t *file, hid_t dxpl_id, H5D_t *dset, H5P_genplist_t *p
/* Get the file's 'use the latest version of the format' flag */ /* Get the file's 'use the latest version of the format' flag */
use_latest_format = H5F_USE_LATEST_FORMAT(file); use_latest_format = H5F_USE_LATEST_FORMAT(file);
/* Add the dataset's raw data size to the size of the header, if the raw data will be stored as compact */
if(layout->type == H5D_COMPACT)
ohdr_size += layout->u.compact.size;
/* Create (open for write access) an object header */
if(H5O_create(file, dxpl_id, ohdr_size, oloc) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to create dataset object header")
/* Get a pointer to the object header itself */
if((oh = H5O_protect(oloc, dxpl_id)) == NULL)
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to protect dataset object header")
/* Point at dataset's copy, to cache it for later */ /* Point at dataset's copy, to cache it for later */
fill_prop = &dset->shared->fill; fill_prop = &dset->shared->fill;
fill_time = dset->shared->fill_time; fill_time = dset->shared->fill_time;
@ -2096,31 +2080,31 @@ H5D_update_entry_info(H5F_t *file, hid_t dxpl_id, H5D_t *dset, H5P_genplist_t *p
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't retrieve fill value") HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't retrieve fill value")
} /* end if */ } /* end if */
if (H5P_is_fill_value_defined(fill_prop, &fill_status) < 0) if(H5P_is_fill_value_defined(fill_prop, &fill_status) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't tell if fill value defined") HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't tell if fill value defined")
/* Special case handling for variable-length types */ /* Special case handling for variable-length types */
if(H5T_detect_class(type, H5T_VLEN)) { if(H5T_detect_class(type, H5T_VLEN)) {
/* If the default fill value is chosen for variable-length types, always write it */ /* If the default fill value is chosen for variable-length types, always write it */
if(fill_time==H5D_FILL_TIME_IFSET && fill_status==H5D_FILL_VALUE_DEFAULT) { if(fill_time == H5D_FILL_TIME_IFSET && fill_status == H5D_FILL_VALUE_DEFAULT) {
dset->shared->fill_time=fill_time=H5D_FILL_TIME_ALLOC; dset->shared->fill_time = fill_time = H5D_FILL_TIME_ALLOC;
/* Update dataset creation property */ /* Update dataset creation property */
assert(dset->shared->dcpl_id!=H5P_DATASET_CREATE_DEFAULT); HDassert(dset->shared->dcpl_id != H5P_DATASET_CREATE_DEFAULT);
if (H5P_set(plist, H5D_CRT_FILL_TIME_NAME, &fill_time) < 0) if(H5P_set(plist, H5D_CRT_FILL_TIME_NAME, &fill_time) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set fill time") HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set fill time")
} /* end if */ } /* end if */
/* Don't allow never writing fill values with variable-length types */ /* Don't allow never writing fill values with variable-length types */
if(fill_time==H5D_FILL_TIME_NEVER) if(fill_time == H5D_FILL_TIME_NEVER)
HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, FAIL, "Dataset doesn't support VL datatype when fill value is not defined") HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, FAIL, "Dataset doesn't support VL datatype when fill value is not defined")
} /* end if */ } /* end if */
if (fill_status == H5D_FILL_VALUE_DEFAULT || fill_status == H5D_FILL_VALUE_USER_DEFINED) { if(fill_status == H5D_FILL_VALUE_DEFAULT || fill_status == H5D_FILL_VALUE_USER_DEFINED) {
if (H5O_copy(H5O_FILL_ID, fill_prop, &fill) == NULL) if(H5O_copy(H5O_FILL_ID, fill_prop, &fill) == NULL)
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT,FAIL, "unable to copy fill value") HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT,FAIL, "unable to copy fill value")
if (fill_prop->buf && fill_prop->size > 0 && H5O_fill_convert(&fill, type, dxpl_id) < 0) if(fill_prop->buf && fill_prop->size > 0 && H5O_fill_convert(&fill, type, dxpl_id) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to convert fill value to dataset type") HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to convert fill value to dataset type")
fill.fill_defined = TRUE; fill.fill_defined = TRUE;
@ -2134,11 +2118,24 @@ H5D_update_entry_info(H5F_t *file, hid_t dxpl_id, H5D_t *dset, H5P_genplist_t *p
fill.alloc_time = alloc_time; fill.alloc_time = alloc_time;
fill.fill_time = fill_time; fill.fill_time = fill_time;
if (fill.fill_defined == FALSE && fill_time == H5D_FILL_TIME_ALLOC) /* Check for invalid fill & allocation time setting */
if(fill.fill_defined == FALSE && fill_time == H5D_FILL_TIME_ALLOC)
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT,FAIL, "unable to create dataset") HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT,FAIL, "unable to create dataset")
/* Add the dataset's raw data size to the size of the header, if the raw data will be stored as compact */
if(layout->type == H5D_COMPACT)
ohdr_size += layout->u.compact.size;
/* Create (open for write access) an object header */
if(H5O_create(file, dxpl_id, ohdr_size, oloc) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to create dataset object header")
/* Get a pointer to the object header itself */
if((oh = H5O_protect(oloc, dxpl_id)) == NULL)
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to protect dataset object header")
/* Write new fill value message */ /* Write new fill value message */
if (H5O_append(file, dxpl_id, oh, H5O_FILL_NEW_ID, H5O_FLAG_CONSTANT, &fill, &oh_flags) < 0) if(H5O_append(file, dxpl_id, oh, H5O_FILL_NEW_ID, H5O_FLAG_CONSTANT, &fill, &oh_flags) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to update fill value header message") HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to update fill value header message")
/* If there is valid information for the old fill value struct, update it */ /* If there is valid information for the old fill value struct, update it */
@ -2153,28 +2150,28 @@ H5D_update_entry_info(H5F_t *file, hid_t dxpl_id, H5D_t *dset, H5P_genplist_t *p
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT,FAIL,"unable to copy fill value") HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT,FAIL,"unable to copy fill value")
/* Write old fill value */ /* Write old fill value */
if (fill_prop->buf && H5O_append(file, dxpl_id, oh, H5O_FILL_ID, H5O_FLAG_CONSTANT, fill_prop, &oh_flags) < 0) if(fill_prop->buf && H5O_append(file, dxpl_id, oh, H5O_FILL_ID, H5O_FLAG_CONSTANT, fill_prop, &oh_flags) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to update fill value header message") HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to update fill value header message")
/* Update dataset creation property */ /* Update dataset creation property */
assert(dset->shared->dcpl_id!=H5P_DATASET_CREATE_DEFAULT); HDassert(dset->shared->dcpl_id!=H5P_DATASET_CREATE_DEFAULT);
if (H5P_set(plist, H5D_CRT_FILL_VALUE_NAME, fill_prop) < 0) if(H5P_set(plist, H5D_CRT_FILL_VALUE_NAME, fill_prop) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set fill value") HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set fill value")
} /* end if */ } /* end if */
/* Update the type and space header messages */ /* Update the type and space header messages */
if (H5O_append(file, dxpl_id, oh, H5O_DTYPE_ID, H5O_FLAG_CONSTANT | H5O_FLAG_SHARED, type, &oh_flags) < 0 || if(H5O_append(file, dxpl_id, oh, H5O_DTYPE_ID, H5O_FLAG_CONSTANT | H5O_FLAG_SHARED, type, &oh_flags) < 0 ||
H5S_append(file, dxpl_id, oh, space, &oh_flags) < 0) H5S_append(file, dxpl_id, oh, space, &oh_flags) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to update type or space header messages") HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to update type or space header messages")
/* Update the filters message, if this is a chunked dataset */ /* Update the filters message, if this is a chunked dataset */
if(layout->type==H5D_CHUNKED) { if(layout->type == H5D_CHUNKED) {
H5O_pline_t pline; /* Chunked data I/O pipeline info */ H5O_pline_t pline; /* Chunked data I/O pipeline info */
if (H5P_get(plist, H5D_CRT_DATA_PIPELINE_NAME, &pline) < 0) if(H5P_get(plist, H5D_CRT_DATA_PIPELINE_NAME, &pline) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "Can't retrieve pipeline filter") HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "Can't retrieve pipeline filter")
if (pline.nused > 0 && H5O_append(file, dxpl_id, oh, H5O_PLINE_ID, H5O_FLAG_CONSTANT, &pline, &oh_flags) < 0) if(pline.nused > 0 && H5O_append(file, dxpl_id, oh, H5O_PLINE_ID, H5O_FLAG_CONSTANT, &pline, &oh_flags) < 0)
HGOTO_ERROR (H5E_DATASET, H5E_CANTINIT, FAIL, "unable to update filter header message") HGOTO_ERROR (H5E_DATASET, H5E_CANTINIT, FAIL, "unable to update filter header message")
} /* end if */ } /* end if */
@ -2234,7 +2231,7 @@ H5D_update_entry_info(H5F_t *file, hid_t dxpl_id, H5D_t *dset, H5P_genplist_t *p
done: done:
/* Release fill value information */ /* Release fill value information */
if (H5O_reset(H5O_FILL_ID, &fill) <0) if(H5O_reset(H5O_FILL_ID, &fill) < 0)
HDONE_ERROR(H5E_DATASET, H5E_CANTRELEASE, FAIL, "unable to release fill-value info") HDONE_ERROR(H5E_DATASET, H5E_CANTRELEASE, FAIL, "unable to release fill-value info")
/* Release pointer to object header itself */ /* Release pointer to object header itself */
@ -2707,13 +2704,13 @@ H5D_open_oid(H5D_t *dataset, hid_t dxpl_id)
H5P_genplist_t *plist; /* Property list */ H5P_genplist_t *plist; /* Property list */
herr_t ret_value = SUCCEED; /* Return value */ herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_NOAPI(H5D_open_oid, FAIL) FUNC_ENTER_NOAPI_NOINIT(H5D_open_oid)
/* check args */ /* check args */
HDassert(dataset); HDassert(dataset);
/* (Set the 'vl_type' parameter to FALSE since it doesn't matter from here) */ /* (Set the 'vl_type' parameter to FALSE since it doesn't matter from here) */
if(NULL==(dataset->shared = H5D_new(H5P_DATASET_CREATE_DEFAULT,FALSE,FALSE))) if(NULL == (dataset->shared = H5D_new(H5P_DATASET_CREATE_DEFAULT, FALSE, FALSE)))
HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed") HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
/* Open the dataset object */ /* Open the dataset object */