diff options
author | Robb Matzke <matzke@llnl.gov> | 1998-06-04 22:27:11 (GMT) |
---|---|---|
committer | Robb Matzke <matzke@llnl.gov> | 1998-06-04 22:27:11 (GMT) |
commit | b4c5e3e00965f4ba6bd6b865cbde3bd33fcdbe47 (patch) | |
tree | 36c4e26a2a7c4ac25c2618c0384171cd1833920f /src/H5Odtype.c | |
parent | 412b58f5246e11f88a75aed1c4b4156db1a49272 (diff) | |
download | hdf5-b4c5e3e00965f4ba6bd6b865cbde3bd33fcdbe47.zip hdf5-b4c5e3e00965f4ba6bd6b865cbde3bd33fcdbe47.tar.gz hdf5-b4c5e3e00965f4ba6bd6b865cbde3bd33fcdbe47.tar.bz2 |
[svn-r407] ./src/H5A.c
./src/H5D.c
./src/H5Tconv.c
./src/H5detect.c
Updated to work with new internal H5T functions. Fixed some
data type memory leaks during error recovery.
./src/H5Dprivate.h
Added H5D_typeof() similar to H5D_entof() that returns a
pointer directly to the dataset's type. This is used by
H5Tcopy() when invoked on a dataset (see below).
./src/H5Epublic.h
Fixed typos in H5E_BEGIN_TRY and H5E_END_TRY macros.
./src/H5F.c
Closing a file with objects still open reports the file name
in the warning message. Removed unnecessary invalidation of
shared data types.
./src/H5Gent.c
./src/H5Gpkg.h
./src/H5Gprivate.h
Added `const' to some arguments.
./src/H5O.c
./src/H5Oprivate.h
./src/H5Oshared.c
An object header message can now be a pointer to a message in
some other object header. The pointer is to the first message
of the appropriate type in the other object header and hard
link counts are maintained automatically to prevent dangling
pointers. The old global heap method of message sharing is
also supported although nothing actually uses it.
./src/H5Oattr.c
./src/H5Ocomp.c
./src/H5Ocont.c
./src/H5Odtype.c
./src/H5Oefl.c
./src/H5Olayout.c
./src/H5Oname.c
./src/H5Osdspace.c
./src/H5Oshare.c
./src/H5Ostab.c
Changed the data type for the shared message info struct to
H5O_shared_t and added an extra initializer to the class
methods struct for the set_share method.
./src/H5Odtype.c
Added the ability to share data type messages by pointing to
other object headers.
./src/H5T.c
./src/H5Tpkg.h
./src/H5Tprivate.h
./src/H5Tpublic.h
Added named data types and changed the functionality of some
API functions as follows:
* The term `read-only' means that a type handle cannot be
modified with functions like H5Tset_*() or H5Tinsert().
* The term `immutable' means the same as `read-only' with the
added restriction that H5Tclose() cannot be called for the
type. A transient type is made immutable by calling
H5Tlock().
* Handles to named types are always read-only.
* Handles to predefined types are immutable.
* A transient type can be converted to a named type by calling
H5Tcommit(). This function will fail if the type is already
named or is immutable.
* The API function H5Tcommitted() returns an indication of
whether a data type has been commited (or is named). If
H5Tcommitted() returns TRUE for a data type obtained by
calling H5Dget_type() on a dataset, then the dataset is
using a shared data type.
* H5Topen() returns a handle to a named type.
* H5Tcopy() always returns a handle to a modifiable transient
type even when invoked on a named type. Also, when invoked
on a dataset it returns a modifiable transient type which is
a copy of the dataset's data type.
* Using a named data type in the call to H5Dcreate() causes
the dataset object header to point to the named data type,
but using a transient type causes the type to be copied into
the dataset's object header.
* The data type returned from H5Dget_type() is a named data
type or a read-only transient data type depending on whether
the dataset points to a named data type. The old behavior,
to return a modifiable transient type, is accomplished by
overloading H5Tcopy() to operate on datasets (see above).
* H5Tshare(), H5Tunshare(), and H5Tis_shared() have been
removed from the API.
The following features were *not* implemented because they
need more discussion:
* A named data type can be opened by applying H5Topen() to a
dataset in which case the data type is the data type of the
dataset (or the data type to which the dataset points if the
dataset has a shared data type).
* A named data type can have attributes like groups or
datasets.
* The members of a compound data type can point to named data
types.
./src/h5ls.c
Reports `Data type' for named data type objects in the file.
Diffstat (limited to 'src/H5Odtype.c')
-rw-r--r-- | src/H5Odtype.c | 97 |
1 files changed, 67 insertions, 30 deletions
diff --git a/src/H5Odtype.c b/src/H5Odtype.c index bfbe5a3..9ea0713 100644 --- a/src/H5Odtype.c +++ b/src/H5Odtype.c @@ -29,13 +29,16 @@ static char RcsId[] = "@(#)$Revision$"; /* PRIVATE PROTOTYPES */ static herr_t H5O_dtype_encode (H5F_t *f, uint8 *p, const void *mesg); -static void *H5O_dtype_decode (H5F_t *f, const uint8 *p, H5HG_t *hobj); +static void *H5O_dtype_decode (H5F_t *f, const uint8 *p, H5O_shared_t *sh); static void *H5O_dtype_copy (const void *_mesg, void *_dest); static size_t H5O_dtype_size (H5F_t *f, const void *_mesg); static herr_t H5O_dtype_reset (void *_mesg); +static herr_t H5O_dtype_get_share (H5F_t *f, const void *_mesg, + H5O_shared_t *sh); +static herr_t H5O_dtype_set_share (H5F_t *f, void *_mesg, + const H5O_shared_t *sh); static herr_t H5O_dtype_debug (H5F_t *f, const void *_mesg, FILE * stream, intn indent, intn fwidth); -static herr_t H5O_dtype_share (H5F_t *f, const void *_mesg, H5HG_t *hobj); /* This message derives from H5O */ const H5O_class_t H5O_DTYPE[1] = {{ @@ -47,7 +50,8 @@ const H5O_class_t H5O_DTYPE[1] = {{ H5O_dtype_copy, /* copy the native value */ H5O_dtype_size, /* size of raw message */ H5O_dtype_reset, /* reset method */ - H5O_dtype_share, /* share method */ + H5O_dtype_get_share, /* get share method */ + H5O_dtype_set_share, /* set share method */ H5O_dtype_debug, /* debug the message */ }}; @@ -174,6 +178,7 @@ H5O_dtype_decode_helper(const uint8 **pp, H5T_t *dt) dt->u.compnd.memb[i].perm[2] = (perm_word >> 16) & 0xff; dt->u.compnd.memb[i].perm[3] = (perm_word >> 24) & 0xff; dt->u.compnd.memb[i].type = H5MM_xcalloc (1, sizeof(H5T_t)); + H5F_addr_undef (&(dt->u.compnd.memb[i].type->ent.header)); if (H5O_dtype_decode_helper(pp, dt->u.compnd.memb[i].type) < 0 || H5T_COMPOUND == dt->u.compnd.memb[i].type->type) { for (j = 0; j <= i; j++) @@ -436,7 +441,7 @@ H5O_dtype_encode_helper(uint8 **pp, const H5T_t *dt) function using malloc() and is returned to the caller. --------------------------------------------------------------------------*/ static void * -H5O_dtype_decode(H5F_t *f, const uint8 *p, H5HG_t *hobj) +H5O_dtype_decode(H5F_t *f, const uint8 *p, H5O_shared_t *sh) { H5T_t *dt = NULL; @@ -445,19 +450,16 @@ H5O_dtype_decode(H5F_t *f, const uint8 *p, H5HG_t *hobj) /* check args */ assert(f); assert(p); + assert (!sh); dt = H5MM_xcalloc(1, sizeof(H5T_t)); + H5F_addr_undef (&(dt->ent.header)); if (H5O_dtype_decode_helper(&p, dt) < 0) { H5MM_xfree(dt); HRETURN_ERROR(H5E_DATATYPE, H5E_CANTDECODE, NULL, "can't decode type"); } - if (hobj) { - dt->sh_heap = *hobj; - dt->sh_file = f; - } - FUNC_LEAVE(dt); } @@ -515,7 +517,7 @@ H5O_dtype_encode(H5F_t __unused__ *f, uint8 *p, const void *mesg) This function copies a native (memory) simple datatype message, allocating the destination structure if necessary. --------------------------------------------------------------------------*/ -static void * +static void * H5O_dtype_copy(const void *_src, void *_dst) { const H5T_t *src = (const H5T_t *) _src; @@ -527,7 +529,7 @@ H5O_dtype_copy(const void *_src, void *_dst) assert(src); /* copy */ - if (NULL == (dst = H5T_copy(src))) { + if (NULL == (dst = H5T_copy(src, H5T_COPY_ALL))) { HRETURN_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "can't copy type"); } /* was result already allocated? */ @@ -627,43 +629,78 @@ H5O_dtype_reset(void *_mesg) /*------------------------------------------------------------------------- - * Function: H5O_dtype_share + * Function: H5O_dtype_get_share * - * Purpose: Returns, through argument HOBJ, whether a data type is shared - * in the specified file. + * Purpose: Returns information about where the shared message is located + * by filling in the SH shared message struct. * - * Return: Success: SUCCEED if the data type is shared in file F, - * and HOBJ is set to the global heap address. + * Return: Success: SUCCEED * - * Failure: FAIL if the data type is not shared, or - * shared but not in file F. The value of HOBJ - * is undefined. + * Failure: FAIL * * Programmer: Robb Matzke - * Thursday, April 2, 1998 + * Monday, June 1, 1998 * * Modifications: * *------------------------------------------------------------------------- */ static herr_t -H5O_dtype_share (H5F_t *f, const void *_mesg, H5HG_t *hobj/*out*/) +H5O_dtype_get_share (H5F_t *f, const void *_mesg, H5O_shared_t *sh/*out*/) { - const H5T_t *dt = (const H5T_t *)_mesg; - - FUNC_ENTER (H5O_dtype_share, FAIL); + const H5T_t *dt = (const H5T_t *)_mesg; - if (!H5HG_defined (&(dt->sh_heap)) || - NULL==dt->sh_file || - dt->sh_file->shared != f->shared) { + FUNC_ENTER (H5O_dtype_get_share, FAIL); + assert (f); + assert (dt); + assert (sh); + + if (H5F_addr_defined (&(dt->ent.header))) { + assert (H5T_STATE_NAMED==dt->state || H5T_STATE_OPEN==dt->state); + sh->in_gh = FALSE; + sh->u.ent = dt->ent; + } else { HRETURN_ERROR (H5E_DATATYPE, H5E_CANTINIT, FAIL, - "data type is not shared"); + "data type is not sharable"); } + + FUNC_LEAVE (SUCCEED); +} + + +/*------------------------------------------------------------------------- + * Function: H5O_dtype_set_share + * + * Purpose: Copies sharing information from SH into the message. + * + * Return: Success: SUCCEED + * + * Failure: FAIL + * + * Programmer: Robb Matzke + * Thursday, June 4, 1998 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +static herr_t +H5O_dtype_set_share (H5F_t *f, void *_mesg/*in,out*/, const H5O_shared_t *sh) +{ + H5T_t *dt = (H5T_t *)_mesg; - *hobj = dt->sh_heap; + FUNC_ENTER (H5O_dtype_set_share, FAIL); + assert (f); + assert (dt); + assert (sh); + assert (!sh->in_gh); + + dt->ent = sh->u.ent; + dt->state = H5T_STATE_NAMED; + FUNC_LEAVE (SUCCEED); } - + /*-------------------------------------------------------------------------- NAME H5O_dtype_debug |