diff options
author | Quincey Koziol <koziol@hdfgroup.org> | 2005-11-15 02:55:39 (GMT) |
---|---|---|
committer | Quincey Koziol <koziol@hdfgroup.org> | 2005-11-15 02:55:39 (GMT) |
commit | a1708eb023f2c8f8ac6c2c17bf1e598c8dff956e (patch) | |
tree | 34c87a3753b36c4c8d689d58bf456eaf261cd235 /src/H5Oginfo.c | |
parent | bea1e576c5ef5500678f7ce913d835341b625e8f (diff) | |
download | hdf5-a1708eb023f2c8f8ac6c2c17bf1e598c8dff956e.zip hdf5-a1708eb023f2c8f8ac6c2c17bf1e598c8dff956e.tar.gz hdf5-a1708eb023f2c8f8ac6c2c17bf1e598c8dff956e.tar.bz2 |
[svn-r11712] Purpose:
New feature
Description:
Check in baseline for compact group revisions, which radically revises the
source code for managing groups and object headers.
WARNING!!!! WARNING!!!! WARNING!!!! WARNING!!!! WARNING!!!! WARNING!!!!
WARNING!!!! WARNING!!!! WARNING!!!! WARNING!!!! WARNING!!!! WARNING!!!!
This initiates the "unstable" phase of the 1.7.x branch, leading up
to the 1.8.0 release. Please test this code, but do _NOT_ keep files created
with it - the format will change again before the release and you will not
be able to read your old files!!!
WARNING!!!! WARNING!!!! WARNING!!!! WARNING!!!! WARNING!!!! WARNING!!!!
WARNING!!!! WARNING!!!! WARNING!!!! WARNING!!!! WARNING!!!! WARNING!!!!
Solution:
There's too many changes to really describe them all, but some of them
include:
- Stop abusing the H5G_entry_t structure and split it into two separate
structures for non-symbol table node use within the library: H5O_loc_t
for object locations in a file and H5G_name_t to store the path to
an opened object. H5G_entry_t is now only used for storing symbol
table entries on disk.
- Retire H5G_namei() in favor of a more general mechanism for traversing
group paths and issuing callbacks on objects located. This gets us out
of the business of hacking H5G_namei() for new features, generally.
- Revised H5O* routines to take a H5O_loc_t instead of H5G_entry_t
- Lots more...
Platforms tested:
h5committested and maybe another dozen configurations.... :-)
Diffstat (limited to 'src/H5Oginfo.c')
-rw-r--r-- | src/H5Oginfo.c | 334 |
1 files changed, 334 insertions, 0 deletions
diff --git a/src/H5Oginfo.c b/src/H5Oginfo.c new file mode 100644 index 0000000..6aeda3d --- /dev/null +++ b/src/H5Oginfo.c @@ -0,0 +1,334 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/*------------------------------------------------------------------------- + * + * Created: H5Oginfo.c + * Aug 23 2005 + * Quincey Koziol <koziol@ncsa.uiuc.edu> + * + * Purpose: Group Information messages. + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +#define H5O_PACKAGE /*suppress error about including H5Opkg */ + +#include "H5private.h" /* Generic Functions */ +#include "H5Eprivate.h" /* Error handling */ +#include "H5FLprivate.h" /* Free lists */ +#include "H5Opkg.h" /* Object headers */ + + +/* PRIVATE PROTOTYPES */ +static void *H5O_ginfo_decode(H5F_t *f, hid_t dxpl_id, const uint8_t *p); +static herr_t H5O_ginfo_encode(H5F_t *f, uint8_t *p, const void *_mesg); +static void *H5O_ginfo_copy(const void *_mesg, void *_dest, unsigned update_flags); +static size_t H5O_ginfo_size(const H5F_t *f, const void *_mesg); +static herr_t H5O_ginfo_free(void *_mesg); +static herr_t H5O_ginfo_debug(H5F_t *f, hid_t dxpl_id, const void *_mesg, + FILE * stream, int indent, int fwidth); + +/* This message derives from H5O */ +const H5O_class_t H5O_GINFO[1] = {{ + H5O_GINFO_ID, /*message id number */ + "ginfo", /*message name for debugging */ + sizeof(H5O_ginfo_t), /*native message size */ + H5O_ginfo_decode, /*decode message */ + H5O_ginfo_encode, /*encode message */ + H5O_ginfo_copy, /*copy the native value */ + H5O_ginfo_size, /*size of symbol table entry */ + NULL, /*default reset method */ + H5O_ginfo_free, /* free method */ + NULL, /* file delete method */ + NULL, /* link method */ + NULL, /*get share method */ + NULL, /*set share method */ + NULL, /* copy native value to file */ + NULL, /* post copy native value to file */ + H5O_ginfo_debug /*debug the message */ +}}; + +/* Current version of group info information */ +#define H5O_GINFO_VERSION 1 + +/* Declare a free list to manage the H5O_ginfo_t struct */ +H5FL_DEFINE_STATIC(H5O_ginfo_t); + + +/*------------------------------------------------------------------------- + * Function: H5O_ginfo_decode + * + * Purpose: Decode a message and return a pointer to + * a newly allocated one. + * + * Return: Success: Ptr to new message in native order. + * + * Failure: NULL + * + * Programmer: Quincey Koziol + * koziol@ncsa.uiuc.edu + * Aug 30 2005 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +static void * +H5O_ginfo_decode(H5F_t UNUSED *f, hid_t UNUSED dxpl_id, const uint8_t *p) +{ + H5O_ginfo_t *ginfo = NULL; /* Pointer to group information message */ + void *ret_value; /* Return value */ + + FUNC_ENTER_NOAPI_NOINIT(H5O_ginfo_decode) + + /* check args */ + HDassert(f); + HDassert(p); + + /* decode */ + if(*p++ != H5O_GINFO_VERSION) + HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "bad version number for message") + + /* Allocate space for message */ + if(NULL == (ginfo = H5FL_CALLOC(H5O_ginfo_t))) + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed") + + /* Get the local heap size hint */ + UINT32DECODE(p, ginfo->lheap_size_hint) + + /* Get the max. # of links to store compactly & the min. # of links to store densely */ + UINT32DECODE(p, ginfo->max_compact) + UINT32DECODE(p, ginfo->min_dense) + + /* Get the estimated # of entries & name lengths */ + UINT32DECODE(p, ginfo->est_num_entries) + UINT32DECODE(p, ginfo->est_name_len) + + /* Set return value */ + ret_value=ginfo; + +done: + if(ret_value == NULL) + if(ginfo != NULL) + H5FL_FREE(H5O_ginfo_t, ginfo); + + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5O_ginfo_decode() */ + + +/*------------------------------------------------------------------------- + * Function: H5O_ginfo_encode + * + * Purpose: Encodes a message. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: Quincey Koziol + * koziol@ncsa.uiuc.edu + * Aug 30 2005 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +static herr_t +H5O_ginfo_encode(H5F_t UNUSED *f, uint8_t *p, const void *_mesg) +{ + const H5O_ginfo_t *ginfo = (const H5O_ginfo_t *) _mesg; + + FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5O_ginfo_encode) + + /* check args */ + HDassert(f); + HDassert(p); + HDassert(ginfo); + + /* encode */ + *p++ = H5O_GINFO_VERSION; + + /* Store the local heap size hint for the group */ + UINT32ENCODE(p, ginfo->lheap_size_hint) + + /* Store the max. # of links to store compactly & the min. # of links to store densely */ + UINT32ENCODE(p, ginfo->max_compact) + UINT32ENCODE(p, ginfo->min_dense) + + /* Store the estimated # of entries & name lengths */ + UINT32ENCODE(p, ginfo->est_num_entries) + UINT32ENCODE(p, ginfo->est_name_len) + + FUNC_LEAVE_NOAPI(SUCCEED) +} /* end H5O_ginfo_encode() */ + + +/*------------------------------------------------------------------------- + * Function: H5O_ginfo_copy + * + * Purpose: Copies a message from _MESG to _DEST, allocating _DEST if + * necessary. + * + * Return: Success: Ptr to _DEST + * + * Failure: NULL + * + * Programmer: Quincey Koziol + * koziol@ncsa.uiuc.edu + * Aug 30 2005 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +static void * +H5O_ginfo_copy(const void *_mesg, void *_dest, unsigned UNUSED update_flags) +{ + const H5O_ginfo_t *ginfo = (const H5O_ginfo_t *) _mesg; + H5O_ginfo_t *dest = (H5O_ginfo_t *) _dest; + void *ret_value; /* Return value */ + + FUNC_ENTER_NOAPI_NOINIT(H5O_ginfo_copy) + + /* check args */ + HDassert(ginfo); + if(!dest && NULL == (dest = H5FL_MALLOC(H5O_ginfo_t))) + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed") + + /* copy */ + *dest = *ginfo; + + /* Set return value */ + ret_value=dest; + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5O_ginfo_copy() */ + + +/*------------------------------------------------------------------------- + * Function: H5O_ginfo_size + * + * Purpose: Returns the size of the raw message in bytes not counting + * the message type or size fields, but only the data fields. + * This function doesn't take into account alignment. + * + * Return: Success: Message data size in bytes without alignment. + * + * Failure: zero + * + * Programmer: Quincey Koziol + * koziol@ncsa.uiuc.edu + * Aug 30 2005 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +static size_t +H5O_ginfo_size(const H5F_t UNUSED *f, const void UNUSED *_mesg) +{ + size_t ret_value; /* Return value */ + + FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5O_ginfo_size) + + /* Set return value */ + ret_value = 1 + /* Version */ + 4 + /* Local heap size hint */ + 4 + /* "Max compact" links */ + 4 + /* "Min dense" links */ + 4 + /* Estimated # of entries in group */ + 4; /* Estimated length of name of entry in group */ + + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5O_ginfo_size() */ + + +/*------------------------------------------------------------------------- + * Function: H5O_ginfo_free + * + * Purpose: Free's the message + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: Quincey Koziol + * Tuesday, August 30, 2005 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +static herr_t +H5O_ginfo_free(void *mesg) +{ + FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5O_ginfo_free) + + HDassert(mesg); + + H5FL_FREE(H5O_ginfo_t, mesg); + + FUNC_LEAVE_NOAPI(SUCCEED) +} /* end H5O_ginfo_free() */ + + +/*------------------------------------------------------------------------- + * Function: H5O_ginfo_debug + * + * Purpose: Prints debugging info for a message. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: Quincey Koziol + * koziol@ncsa.uiuc.edu + * Aug 30 2005 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +static herr_t +H5O_ginfo_debug(H5F_t UNUSED *f, hid_t UNUSED dxpl_id, const void *_mesg, FILE * stream, + int indent, int fwidth) +{ + const H5O_ginfo_t *ginfo = (const H5O_ginfo_t *) _mesg; + + FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5O_ginfo_debug) + + /* check args */ + HDassert(f); + HDassert(ginfo); + HDassert(stream); + HDassert(indent >= 0); + HDassert(fwidth >= 0); + + HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth, + "Local heap size hint:", ginfo->lheap_size_hint); + + HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth, + "Max. compact links:", ginfo->max_compact); + + HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth, + "Min. dense links:", ginfo->min_dense); + + HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth, + "Estimated # of objects in group:", ginfo->est_num_entries); + + HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth, + "Estimated length of object in group's name:", ginfo->est_name_len); + + FUNC_LEAVE_NOAPI(SUCCEED) +} /* end H5O_ginfo_debug() */ + + |