2
0
mirror of https://github.com/HDFGroup/hdf5.git synced 2025-04-24 17:51:25 +08:00

[svn-r6030] Purpose:

Another Oops
Description:
    I accidentally checked in the H5D.c module when I shouldn't have.
Solution:
    Rolled back to 1.281 version
Platforms tested:
    Linux
This commit is contained in:
Bill Wendling 2002-10-23 17:13:00 -05:00
parent d1f3de3a58
commit d77d7e04c5

414
src/H5D.c

@ -1,16 +1,14 @@
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Copyright by the Board of Trustees of the University of Illinois. *
* All rights reserved. *
* *
* This file is part of HDF5. The full HDF5 copyright notice, including *
* terms governing use, modification, and redistribution, is contained in *
* the files COPYING and Copyright.html. COPYING can be found at the root *
* of the source code distribution tree; Copyright.html can be found at the *
* root level of an installed copy of the electronic HDF5 document set and *
* is linked from the top-level documents page. It can also be found at *
* http://hdf.ncsa.uiuc.edu/HDF5/doc/Copyright.html. If you do not have *
* access to either file, you may request a copy from hdfhelp@ncsa.uiuc.edu. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/****************************************************************************
* NCSA HDF *
* Software Development Group *
* National Center for Supercomputing Applications *
* University of Illinois at Urbana-Champaign *
* 605 E. Springfield, Champaign IL 61820 *
* *
* For conditions of distribution and use, see the accompanying *
* hdf/COPYING file. *
* *
****************************************************************************/
/* $Id$ */
@ -1461,396 +1459,6 @@ done:
FUNC_LEAVE(ret_value);
}
H5D_t *
H5D_create_cache_update(H5G_entry_t *loc, const char *name, const H5T_t *type,
const H5S_t *space, const H5P_genplist_t *plist)
{
H5D_t *new_dset = NULL;
H5D_t *ret_value = NULL;
int i, ndims;
hsize_t comp_data_size;
unsigned u;
hsize_t max_dim[H5O_LAYOUT_NDIMS] = { 0 };
H5O_efl_t efl;
H5F_t *f = NULL;
H5O_pline_t dcpl_pline;
H5D_layout_t dcpl_layout;
int chunk_ndims = 0;
hsize_t chunk_size[32] = { 0 };
H5D_alloc_time_t alloc_time;
H5D_fill_time_t fill_time;
H5O_fill_t fill_prop = { NULL, 0, NULL };
H5O_fill_new_t fill = { NULL, 0, NULL, H5D_ALLOC_TIME_LATE, H5D_FILL_TIME_ALLOC, TRUE };
H5D_fill_value_t fill_status;
H5P_genplist_t *new_plist; /* New Property list */
size_t ohdr_size = H5D_MINHDR_SIZE; /* Size of dataset's object header */
FUNC_ENTER_NOAPI(H5D_create_cache_update, NULL);
/* check args */
assert (loc);
assert (name && *name);
assert (type);
assert (space);
if (H5P_get(plist, H5D_CRT_DATA_PIPELINE_NAME, &dcpl_pline) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't retrieve pipeline filter");
if (H5P_get(plist, H5D_CRT_LAYOUT_NAME, &dcpl_layout) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't retrieve layout");
if (dcpl_pline.nfilters > 0 && H5D_CHUNKED != dcpl_layout)
HGOTO_ERROR(H5E_DATASET, H5E_BADVALUE, NULL,
"filters can only be used with chunked layout");
if (H5P_get(plist, H5D_CRT_ALLOC_TIME_NAME, &alloc_time) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't retrieve space allocation time");
/* Check if the alloc_time is the default and set it accordingly */
if (alloc_time == H5D_ALLOC_TIME_DEFAULT)
switch (dcpl_layout) {
case H5D_COMPACT:
alloc_time = H5D_ALLOC_TIME_EARLY;
break;
case H5D_CONTIGUOUS:
alloc_time = H5D_ALLOC_TIME_LATE;
break;
case H5D_CHUNKED:
alloc_time = H5D_ALLOC_TIME_INCR;
break;
default:
HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, NULL, "not implemented yet");
}
/* Don't allow compact datasets to allocate space later */
if (dcpl_layout == H5D_COMPACT && alloc_time != H5D_ALLOC_TIME_EARLY)
HGOTO_ERROR(H5E_DATASET, H5E_BADVALUE, NULL,
"compact dataset doesn't support late space allocation");
/* What file is the dataset being added to? */
if ((f = H5G_insertion_file(loc, name)) == NULL)
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, NULL, "unable to locate insertion point");
/* If MPIO or MPIPOSIX is used, no filter support yet. */
if ((IS_H5FD_MPIO(f) || IS_H5FD_MPIPOSIX(f)) && dcpl_pline.nfilters > 0)
HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, NULL,
"Parallel I/O does not support filters yet");
/* Check if this dataset is going into a parallel file and set space allocation time */
if (IS_H5FD_MPIO(f) || IS_H5FD_MPIPOSIX(f))
alloc_time = H5D_ALLOC_TIME_EARLY;
if (H5P_get(plist, H5D_CRT_FILL_TIME_NAME, &fill_time) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't retrieve fill time");
if (fill_time == H5D_FILL_TIME_NEVER && H5T_detect_class(type, H5T_VLEN))
HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, NULL,
"Dataset doesn't support VL datatype when fill value is not defined");
/* Initialize the dataset object */
if (NULL == (new_dset = H5D_new(dcpl_id)))
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed");
/* Check if the datatype is "sensible" for use in a dataset */
if (H5T_is_sensible(type) != TRUE)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "datatype is not sensible");
/* Copy datatype for dataset */
if ((new_dset->type = H5T_copy(type, H5T_COPY_ALL)) == NULL)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCOPY, NULL, "can't copy datatype");
/* Mark any VL datatypes as being on disk now */
if (H5T_vlen_mark(new_dset->type, f, H5T_VLEN_DISK) < 0)
HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "invalid VL location");
/* Get new dataset's property list object */
if ((new_plist = H5I_object(new_dset->dcpl_id)) == NULL)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL,
"can't get dataset creation property list");
/* Set the alloc_time for the dataset, in case the default was used */
if (H5P_set(new_plist, H5D_CRT_ALLOC_TIME_NAME, &alloc_time) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, NULL, "can't set allocation time");
if (H5P_get(new_plist, H5D_CRT_CHUNK_DIM_NAME, &chunk_ndims) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't retrieve layout");
if (H5P_get(new_plist, H5D_CRT_EXT_FILE_LIST_NAME, &efl) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't retrieve external file list");
/* Total raw data size */
if (H5P_get(new_plist, H5D_CRT_LAYOUT_NAME, &new_dset->layout.type) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't retrieve layout");
new_dset->layout.ndims = H5S_get_simple_extent_ndims(space) + 1;
assert((unsigned)(new_dset->layout.ndims) <= NELMTS(new_dset->layout.dim));
new_dset->layout.dim[new_dset->layout.ndims - 1] = H5T_get_size(new_dset->type);
new_dset->layout.addr = HADDR_UNDEF; /* Initialize to no address */
/*************************************************************
* Begin Cache Update
*************************************************************/
switch (new_dset->layout.type) {
case H5D_CONTIGUOUS:
/*
* The maximum size of the dataset cannot exceed the storage size.
* Also, only the slowest varying dimension of a simple data space
* can be extendible.
*/
if ((ndims = H5S_get_simple_extent_dims(space, new_dset->layout.dim, max_dim)) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, NULL,
"unable to initialize contiguous storage");
for (i = 1; i < ndims; i++)
if (max_dim[i] > new_dset->layout.dim[i])
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, NULL,
"only the first dimension can be extendible");
if (efl.nused > 0) {
hsize_t max_points = H5S_get_npoints_max (space);
hsize_t max_storage = H5O_efl_total_size (&efl);
if (H5S_UNLIMITED == max_points) {
if (H5O_EFL_UNLIMITED!=max_storage)
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, NULL,
"unlimited data space but finite storage");
} else if (max_points * H5T_get_size (type) < max_points) {
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, NULL,
"data space * type size overflowed");
} else if (max_points * H5T_get_size (type) > max_storage) {
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, NULL,
"data space size exceeds external storage size");
}
} else if (ndims > 0 && max_dim[0] > new_dset->layout.dim[0]) {
HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, NULL,
"extendible contiguous non-external dataset");
}
break;
case H5D_CHUNKED:
/*
* Chunked storage allows any type of data space extension, so we
* don't even bother checking.
*/
if (chunk_ndims != H5S_get_simple_extent_ndims(space))
HGOTO_ERROR(H5E_DATASET, H5E_BADVALUE, NULL,
"dimensionality of chunks doesn't match the data space");
if (efl.nused > 0)
HGOTO_ERROR(H5E_DATASET, H5E_BADVALUE, NULL,
"external storage not supported with chunked layout");
/*
* The chunk size of a dimension with a fixed size cannot exceed
* the maximum dimension size
*/
if (H5P_get(new_plist, H5D_CRT_CHUNK_SIZE_NAME, chunk_size) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't retrieve chunk size");
if (H5S_get_simple_extent_dims(space, NULL, max_dim)<0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, NULL,
"unable to query maximum dimensions");
for (u = 0; u < new_dset->layout.ndims - 1; u++)
if (max_dim[u] != H5S_UNLIMITED && max_dim[u] < chunk_size[u])
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, NULL,
"chunk size must be <= maximum dimension size for fixed-sized dimensions");
/* Set the dataset's chunk sizes from the property list's chunk sizes */
for (u = 0; u < new_dset->layout.ndims - 1; u++)
new_dset->layout.dim[u] = chunk_size[u];
break;
case H5D_COMPACT:
/*
* Compact dataset is stored in dataset object header message of
* layout.
*/
new_dset->layout.size = H5S_get_simple_extent_npoints(space) *
H5T_get_size(type);
/*
* Verify data size is smaller than maximum header message size
* (64KB) minus other layout message fields.
*/
comp_data_size = H5O_MAX_SIZE-H5O_layout_meta_size(f, &new_dset->layout);
if (new_dset->layout.size > comp_data_size)
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, NULL,
"compact dataset size is bigger than header message maximum size");
if ((ndims = H5S_get_simple_extent_dims(space, new_dset->layout.dim, max_dim)) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, NULL,
"unable to initialize dimension size of compact dataset storage");
/* remember to check if size is small enough to fit header message */
ohdr_size += new_dset->layout.size;
break;
default:
HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, NULL, "not implemented yet");
} /* end switch */
/* Create (open for write access) an object header */
if (H5O_create(f, ohdr_size, &new_dset->ent) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, NULL,
"unable to create dataset object header");
/*
* Retrieve properties of fill value and others. Copy them into new
* fill value struct. Convert the fill value to the dataset type and
* write the message
*/
if (H5P_get(new_plist, H5D_CRT_ALLOC_TIME_NAME, &alloc_time) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't retrieve space allocation time");
if (H5P_get(new_plist, H5D_CRT_FILL_TIME_NAME, &fill_time) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't retrieve fill time");
if (H5P_fill_value_defined(new_plist, &fill_status)<0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't tell if fill value defined");
if (fill_status== H5D_FILL_VALUE_DEFAULT || fill_status==H5D_FILL_VALUE_USER_DEFINED) {
if (H5P_get(new_plist, H5D_CRT_FILL_VALUE_NAME, &fill_prop) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't retrieve fill value");
if (H5O_copy(H5O_FILL, &fill_prop, &fill) == NULL)
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT,NULL, "unable to copy fill value");
if (fill_prop.buf && fill_prop.size > 0 &&
H5O_fill_convert(&fill, new_dset->type) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, NULL,
"unable to convert fill value to dataset type");
fill.fill_defined = TRUE;
} else if (fill_status == H5D_FILL_VALUE_UNDEFINED) {
fill.size = -1;
fill.type = fill.buf = NULL;
fill.fill_defined = FALSE;
} else {
HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, NULL,
"unable to determine if fill value is defined");
} /* end else */
fill.alloc_time = alloc_time;
fill.fill_time = fill_time;
if (fill.fill_defined == FALSE && fill_time != H5D_FILL_TIME_NEVER)
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT,NULL, "unable to create dataset");
/* Write new fill value message */
if (H5O_modify(&new_dset->ent, H5O_FILL_NEW, 0, H5O_FLAG_CONSTANT, &fill) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, NULL,
"unable to update fill value header message");
H5O_reset(H5O_FILL, &fill_prop);
if (fill.buf && (NULL==H5O_copy(H5O_FILL, &fill, &fill_prop)))
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, NULL, "unable to copy fill value");
H5O_reset(H5O_FILL_NEW, &fill);
/* Write old fill value */
if (fill_prop.buf &&
H5O_modify(&new_dset->ent, H5O_FILL, 0, H5O_FLAG_CONSTANT, &fill_prop) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, NULL,
"unable to update fill value header message");
if (H5P_set(new_plist, H5D_CRT_FILL_VALUE_NAME, &fill_prop) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, NULL, "can't set fill value");
/* Update the type and space header messages */
if (H5O_modify(&new_dset->ent, H5O_DTYPE, 0,
H5O_FLAG_CONSTANT | H5O_FLAG_SHARED, new_dset->type) < 0 ||
H5S_modify(&new_dset->ent, space) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, NULL,
"unable to update type or space header messages");
/* Update the filters message */
if (H5P_get(new_plist, H5D_CRT_DATA_PIPELINE_NAME, &dcpl_pline) < 0)
HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "Can't retrieve pipeline filter");
if (dcpl_pline.nfilters>0 &&
H5O_modify (&new_dset->ent, H5O_PLINE, 0, H5O_FLAG_CONSTANT, &dcpl_pline) < 0)
HGOTO_ERROR (H5E_DATASET, H5E_CANTINIT, NULL, "unable to update filter header message");
/* Add a modification time message. */
if (H5O_touch(&new_dset->ent, TRUE) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, NULL,
"unable to update modification time message");
/* Give the dataset a name */
if (H5G_insert(loc, name, &new_dset->ent) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, NULL, "unable to name dataset");
/*
* Allocate storage if space allocate time is early; otherwise delay
* allocation until later.
*/
if (alloc_time == H5D_ALLOC_TIME_EARLY)
if (H5D_alloc_storage(f, new_dset, H5D_ALLOC_CREATE) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, NULL, "unable to initialize storage");
/* Update external storage message */
if (efl.nused > 0) {
size_t heap_size = H5HL_ALIGN(1);
for (i = 0; i < efl.nused; ++i)
heap_size += H5HL_ALIGN(HDstrlen(efl.slot[i].name) + 1);
if (H5HL_create(f, heap_size, &efl.heap_addr /*out*/) < 0 ||
(size_t)(-1) == H5HL_insert(f, efl.heap_addr, 1, ""))
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, NULL,
"unable to create external file list name heap");
for (i = 0; i < efl.nused; ++i) {
size_t offset = H5HL_insert(f, efl.heap_addr,
HDstrlen(efl.slot[i].name) + 1,
efl.slot[i].name);
assert(0 == efl.slot[i].name_offset);
if ((size_t)(-1) == offset)
HGOTO_ERROR(H5E_EFL, H5E_CANTINIT, NULL, "unable to insert URL into name heap");
efl.slot[i].name_offset = offset;
} /* end for */
if (H5O_modify(&new_dset->ent, H5O_EFL, 0, H5O_FLAG_CONSTANT, &efl) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, NULL,
"unable to update external file list message");
} /* end if */
/* Update layout message */
if (H5D_COMPACT != new_dset->layout.type &&
H5O_modify(&new_dset->ent, H5O_LAYOUT, 0, 0, &new_dset->layout) < 0)
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, NULL, "unable to update layout");
/*************************************************************
* Cache Updated
*************************************************************/
/* Success */
ret_value = new_dset;
done:
if (!ret_value && new_dset) {
if (new_dset->type)
H5T_close(new_dset->type);
if (H5F_addr_defined(new_dset->ent.header))
H5O_close(&(new_dset->ent));
new_dset->ent.file = NULL;
H5FL_FREE(H5D_t,new_dset);
}
FUNC_LEAVE(ret_value);
}
/*-------------------------------------------------------------------------
* Function: H5D_create