summaryrefslogtreecommitdiffstats
path: root/src/H5Gname.c
diff options
context:
space:
mode:
authorQuincey Koziol <koziol@hdfgroup.org>2010-07-28 12:27:56 (GMT)
committerQuincey Koziol <koziol@hdfgroup.org>2010-07-28 12:27:56 (GMT)
commit0b7306beed3616d5e259ce3efa1dd0105f436fdb (patch)
tree4d5d467a608e5fc9ada867f913136de744750860 /src/H5Gname.c
parentad2f3285b3a0e55aab2014c9e395009df758fef6 (diff)
downloadhdf5-0b7306beed3616d5e259ce3efa1dd0105f436fdb.zip
hdf5-0b7306beed3616d5e259ce3efa1dd0105f436fdb.tar.gz
hdf5-0b7306beed3616d5e259ce3efa1dd0105f436fdb.tar.bz2
[svn-r19133] Description:
Correct traversal of user-defined links (including external links) to retain path information of object, allowing H5Iget_name() queries to work quickly (without searching entire destination file). This required some refactoring and addition of a mechanism to detect if a "fast" query was performed (for the tests). Minor code cleanups, etc. 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 Linux/64-ia64 2.6 (cobalt) w/Intel compilers, w/C++ & FORTRAN, in production mode Linux/64-amd64 2.6 (abe) w/parallel, w/FORTRAN, in debug mode Mac OS X/32 10.6.4 (amazon) in debug mode Mac OS X/32 10.6.4 (amazon) w/C++ & FORTRAN, w/threadsafe, in production mode Mac OS X/32 10.6.4 (amazon) w/parallel, in debug mode
Diffstat (limited to 'src/H5Gname.c')
-rw-r--r--src/H5Gname.c72
1 files changed, 40 insertions, 32 deletions
diff --git a/src/H5Gname.c b/src/H5Gname.c
index b298ccf..96b2e3a 100644
--- a/src/H5Gname.c
+++ b/src/H5Gname.c
@@ -426,49 +426,57 @@ H5G_name_copy(H5G_name_t *dst, const H5G_name_t *src, H5_copy_depth_t depth)
*-------------------------------------------------------------------------
*/
ssize_t
-H5G_get_name(hid_t id, char *name/*out*/, size_t size, hid_t lapl_id,
- hid_t dxpl_id)
+H5G_get_name(const H5G_loc_t *loc, char *name/*out*/, size_t size,
+ hbool_t *cached, hid_t lapl_id, hid_t dxpl_id)
{
- H5G_loc_t loc; /* Object location */
- ssize_t ret_value = FAIL;
+ ssize_t len = 0; /* Length of object's name */
+ ssize_t ret_value; /* Return value */
FUNC_ENTER_NOAPI(H5G_get_name, FAIL)
- /* get object location */
- if(H5G_loc(id, &loc) >= 0) {
- ssize_t len = 0;
+ /* Sanity check */
+ HDassert(loc);
- /* If the user path is available and it's not "hidden", use it */
- if(loc.path->user_path_r != NULL && loc.path->obj_hidden == 0) {
- len = H5RS_len(loc.path->user_path_r);
+ /* If the user path is available and it's not "hidden", use it */
+ if(loc->path->user_path_r != NULL && loc->path->obj_hidden == 0) {
+ len = H5RS_len(loc->path->user_path_r);
- if(name) {
- HDstrncpy(name, H5RS_get_str(loc.path->user_path_r), MIN((size_t)(len + 1), size));
- if((size_t)len >= size)
- name[size - 1] = '\0';
- } /* end if */
+ if(name) {
+ HDstrncpy(name, H5RS_get_str(loc->path->user_path_r), MIN((size_t)(len + 1), size));
+ if((size_t)len >= size)
+ name[size - 1] = '\0';
} /* end if */
- else if(!loc.path->obj_hidden) {
- hid_t file;
- /* Retrieve file ID for name search */
- if((file = H5I_get_file_id(id, FALSE)) < 0)
- HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't retrieve file ID")
+ /* Indicate that the name is cached, if requested */
+ /* (Currently only used for testing - QAK, 2010/07/26) */
+ if(cached)
+ *cached = TRUE;
+ } /* end if */
+ else if(!loc->path->obj_hidden) {
+ hid_t file;
- /* Search for name of object */
- if((len = H5G_get_name_by_addr(file, lapl_id, dxpl_id, loc.oloc, name, size)) < 0) {
- H5I_dec_ref(file, FALSE);
- HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't determine name")
- } /* end if */
+ /* Retrieve file ID for name search */
+ if((file = H5F_get_id(loc->oloc->file, FALSE)) < 0)
+ HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't get file ID")
- /* Close file ID used for search */
- if(H5I_dec_ref(file, FALSE) < 0)
- HGOTO_ERROR(H5E_SYM, H5E_CANTCLOSEFILE, FAIL, "can't determine name")
- } /* end else */
+ /* Search for name of object */
+ if((len = H5G_get_name_by_addr(file, lapl_id, dxpl_id, loc->oloc, name, size)) < 0) {
+ H5I_dec_ref(file, FALSE);
+ HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't determine name")
+ } /* end if */
- /* Set return value */
- ret_value = len;
- } /* end if */
+ /* Close file ID used for search */
+ if(H5I_dec_ref(file, FALSE) < 0)
+ HGOTO_ERROR(H5E_SYM, H5E_CANTCLOSEFILE, FAIL, "can't determine name")
+
+ /* Indicate that the name is _not_ cached, if requested */
+ /* (Currently only used for testing - QAK, 2010/07/26) */
+ if(cached)
+ *cached = FALSE;
+ } /* end else */
+
+ /* Set return value */
+ ret_value = len;
done:
FUNC_LEAVE_NOAPI(ret_value)