diff options
author | Quincey Koziol <koziol@hdfgroup.org> | 2011-04-04 04:23:12 (GMT) |
---|---|---|
committer | Quincey Koziol <koziol@hdfgroup.org> | 2011-04-04 04:23:12 (GMT) |
commit | b035e980f01b19b4c25c7c1764f795e8f1939ae6 (patch) | |
tree | 99c6208e1489d76f66433260d28737027f9ad88d /src/H5Groot.c | |
parent | e9e713869c2a59477e77faf0aa3f7545e9858e06 (diff) | |
download | hdf5-b035e980f01b19b4c25c7c1764f795e8f1939ae6.zip hdf5-b035e980f01b19b4c25c7c1764f795e8f1939ae6.tar.gz hdf5-b035e980f01b19b4c25c7c1764f795e8f1939ae6.tar.bz2 |
[svn-r20406] Description:
Refactor root group routines to centralize and simplify them some.
Also patch root group's file pointer when it doesn't match the querying
file, from H5G_rootof.
Tested on:
FreeBSD/32 6.3 (duty) in debug mode
FreeBSD/64 6.3 (liberty) w/C++ & FORTRAN, in debug mode
Linux/32 2.6 (jam) w/PGI compilers, w/default API=1.8.x,
w/C++ & FORTRAN, w/threadsafe, in debug mode
Linux/64-amd64 2.6 (amani) w/Intel compilers, w/default API=1.6.x,
w/C++ & FORTRAN, in production mode
Solaris/32 2.10 (linew) w/deprecated symbols disabled, w/C++ & FORTRAN,
w/szip filter, w/threadsafe, in production mode
Linux/PPC 2.6 (heiwa) w/C++ & FORTRAN, w/threadsafe, in debug mode
Mac OS X/32 10.6.6 (amazon) in debug mode
Mac OS X/32 10.6.6 (amazon) w/C++ & FORTRAN, w/threadsafe,
in production mode
Mac OS X/32 10.6.6 (amazon) w/parallel, in debug mode
Diffstat (limited to 'src/H5Groot.c')
-rw-r--r-- | src/H5Groot.c | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/src/H5Groot.c b/src/H5Groot.c index ff4a8c4..a7d7e29 100644 --- a/src/H5Groot.c +++ b/src/H5Groot.c @@ -68,9 +68,25 @@ H5G_rootof(H5F_t *f) { FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5G_rootof) + /* Sanity check */ + HDassert(f); + HDassert(f->shared); + + /* Walk to top of mounted files */ while(f->parent) f = f->parent; + /* Sanity check */ + HDassert(f); + HDassert(f->shared); + HDassert(f->shared->root_grp); + + /* Check to see if the root group was opened through a different + * "top" file, and switch it to point at the current "top" file. + */ + if(f->shared->root_grp->oloc.file != f) + f->shared->root_grp->oloc.file = f; + FUNC_LEAVE_NOAPI(f->shared->root_grp) } /* end H5G_rootof() */ @@ -277,3 +293,87 @@ done: FUNC_LEAVE_NOAPI(ret_value) } /* end H5G_mkroot() */ + +/*------------------------------------------------------------------------- +* Function: H5G_root_free +* +* Purpose: Free memory used by an H5G_t struct (and its H5G_shared_t). +* Does not close the group or decrement the reference count. +* Used to free memory used by the root group. +* +* Return: Success: Non-negative +* Failure: Negative +* +* Programmer: James Laird +* Tuesday, September 7, 2004 +* +*------------------------------------------------------------------------- +*/ +herr_t +H5G_root_free(H5G_t *grp) +{ + FUNC_ENTER_NOAPI_NOFUNC(H5G_root_free) + + /* Check args */ + HDassert(grp && grp->shared); + HDassert(grp->shared->fo_count > 0); + + /* Free the path */ + H5G_name_free(&(grp->path)); + + grp->shared = H5FL_FREE(H5G_shared_t, grp->shared); + grp = H5FL_FREE(H5G_t, grp); + + FUNC_LEAVE_NOAPI(SUCCEED) +} /* end H5G_root_free() */ + + +/*------------------------------------------------------------------------- + * Function: H5G_root_loc + * + * Purpose: Construct a "group location" for the root group of a file + * + * Return: Success: Non-negative + * Failure: Negative + * + * Programmer: Quincey Koziol + * koziol@hdfgroup.org + * Mar 5 2007 + * + *------------------------------------------------------------------------- + */ +herr_t +H5G_root_loc(H5F_t *f, H5G_loc_t *loc) +{ + H5G_t *root_grp; /* Pointer to root group's info */ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI(H5G_root_loc, FAIL) + + HDassert(f); + HDassert(loc); + + /* Retrieve the root group for the file */ + root_grp = H5G_rootof(f); + HDassert(root_grp); + + /* Build the group location for the root group */ + if(NULL == (loc->oloc = H5G_oloc(root_grp))) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to get object location for root group") + if(NULL == (loc->path = H5G_nameof(root_grp))) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to get path for root group") + + /* Patch up root group's object location to reflect this file */ + /* (Since the root group info is only stored once for files which + * share an underlying low-level file) + */ + /* (but only for non-mounted files) */ + if(!H5F_is_mount(f)) { + loc->oloc->file = f; + loc->oloc->holding_file = FALSE; + } /* end if */ + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5G_root_loc() */ + |