diff options
author | Panu Matilainen <pmatilai@redhat.com> | 2010-12-16 09:31:20 +0200 |
---|---|---|
committer | Panu Matilainen <pmatilai@redhat.com> | 2010-12-21 11:49:36 +0200 |
commit | 180510e4f5c4dddcbc5c041e3db455f04ce22d3e (patch) | |
tree | 7e395613e23dbe79fd5d4ccda1e3342d8c9b7815 | |
parent | ce2906b0e470b687fb9d951da18c2f1df6e5fc6f (diff) | |
download | rpm-180510e4f5c4dddcbc5c041e3db455f04ce22d3e.tar.gz rpm-180510e4f5c4dddcbc5c041e3db455f04ce22d3e.tar.bz2 rpm-180510e4f5c4dddcbc5c041e3db455f04ce22d3e.zip |
Add a "unique string cache" to rpmug
- Used for storing unique strings just once
(cherry picked from commit 353a7a81257e2a2a322b211b6ebf11b750ca6e68)
-rw-r--r-- | lib/rpmug.c | 28 | ||||
-rw-r--r-- | lib/rpmug.h | 2 |
2 files changed, 30 insertions, 0 deletions
diff --git a/lib/rpmug.c b/lib/rpmug.c index 47aa6ccf5..2bb18e5a3 100644 --- a/lib/rpmug.c +++ b/lib/rpmug.c @@ -5,9 +5,36 @@ #include <rpm/rpmlog.h> #include <rpm/rpmstring.h> +#include "lib/misc.h" #include "lib/rpmug.h" #include "debug.h" +#define HASHTYPE strCache +#define HTKEYTYPE const char * +#include "lib/rpmhash.H" +#include "lib/rpmhash.C" +#undef HASHTYPE +#undef HTKEYTYPE + +static strCache strStash = NULL; + +const char * rpmugStashStr(const char *str) +{ + const char *ret = NULL; + if (str) { + if (strStash == NULL) { + strStash = strCacheCreate(64, hashFunctionString, strcmp, + (strCacheFreeKey)rfree); + } + + if (!strCacheGetEntry(strStash, str, &ret)) { + strCacheAddEntry(strStash, xstrdup(str)); + (void) strCacheGetEntry(strStash, str, &ret); + } + } + return ret; +} + /* * These really ought to use hash tables. I just made the * guess that most files would be owned by root or the same person/group @@ -171,4 +198,5 @@ void rpmugFree(void) rpmugGid(NULL, NULL); rpmugUname(-1); rpmugGname(-1); + strCacheFree(strStash); } diff --git a/lib/rpmug.h b/lib/rpmug.h index 7dbe77d15..35e5d631d 100644 --- a/lib/rpmug.h +++ b/lib/rpmug.h @@ -3,6 +3,8 @@ #include <sys/types.h> +const char * rpmugStashStr(const char *str); + int rpmugUid(const char * name, uid_t * uid); int rpmugGid(const char * name, gid_t * gid); |