summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan McGee <dan@archlinux.org>2011-06-09 20:34:13 +0200
committerDan McGee <dan@archlinux.org>2011-06-09 21:14:55 +0200
commit9d6568da0f55fb05ea5c28e06efb51046fd270bf (patch)
tree6ca9f8c19159ca26c81b07c3fc55ee3ae65f7757
parent451cd2c88dcdec793ce7159331adcc2d049381e1 (diff)
downloadpacman-9d6568da0f55fb05ea5c28e06efb51046fd270bf.tar.gz
pacman-9d6568da0f55fb05ea5c28e06efb51046fd270bf.tar.xz
_alpm_lstat: only duplicate string if necessary
The vast majority of the time we will just be passing the same string value on to the lstat() call. The only time we need to duplicate it is if the path ends in '/'. In one run using a profiler, only 400 of the 200,000 calls (0.2%) required the string to be copied first. Signed-off-by: Dan McGee <dan@archlinux.org>
-rw-r--r--lib/libalpm/util.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/lib/libalpm/util.c b/lib/libalpm/util.c
index 6f0763d5..d24a51a6 100644
--- a/lib/libalpm/util.c
+++ b/lib/libalpm/util.c
@@ -631,17 +631,18 @@ const char *_alpm_filecache_setup(void)
int _alpm_lstat(const char *path, struct stat *buf)
{
int ret;
- char *newpath = strdup(path);
- size_t len = strlen(newpath);
+ size_t len = strlen(path);
/* strip the trailing slash if one exists */
- if(len != 0 && newpath[len - 1] == '/') {
- newpath[len - 1] = '\0';
+ if(len != 0 && path[len - 1] == '/') {
+ char *newpath = strdup(path);
+ newpath[len - 1] = '\0';
+ ret = lstat(newpath, buf);
+ free(newpath);
+ } else {
+ ret = lstat(path, buf);
}
- ret = lstat(newpath, buf);
-
- FREE(newpath);
return ret;
}