diff options
author | Quincey Koziol <koziol@hdfgroup.org> | 2010-07-28 12:27:56 (GMT) |
---|---|---|
committer | Quincey Koziol <koziol@hdfgroup.org> | 2010-07-28 12:27:56 (GMT) |
commit | 0b7306beed3616d5e259ce3efa1dd0105f436fdb (patch) | |
tree | 4d5d467a608e5fc9ada867f913136de744750860 /src/H5Gname.c | |
parent | ad2f3285b3a0e55aab2014c9e395009df758fef6 (diff) | |
download | hdf5-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.c | 72 |
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) |