aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2020-12-30 01:04:56 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2020-12-30 01:04:56 +0100
commit89a55972fd5d7f0ab815c2a62be69a8f34718353 (patch)
treebfd5b6e17a596a3a244ec9996b0df5baf42e1da3
parentb230ff9d8f1a393c13f338b030cace0899d5ec26 (diff)
downloadbusybox-w32-89a55972fd5d7f0ab815c2a62be69a8f34718353.tar.gz
busybox-w32-89a55972fd5d7f0ab815c2a62be69a8f34718353.tar.bz2
busybox-w32-89a55972fd5d7f0ab815c2a62be69a8f34718353.zip
libbb/procps: smaller global data for username/groupname cache
function old new delta get_cached 101 133 +32 cache_user_group - 4 +4 get_cached_username 17 14 -3 username 8 - -8 groupname 8 - -8 clear_username_cache 65 47 -18 ------------------------------------------------------------------------------ (add/remove: 1/2 grow/shrink: 1/2 up/down: 36/-37) Total: -1 bytes Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--libbb/procps.c45
1 files changed, 17 insertions, 28 deletions
diff --git a/libbb/procps.c b/libbb/procps.c
index 75969947b..f56b71b21 100644
--- a/libbb/procps.c
+++ b/libbb/procps.c
@@ -21,40 +21,29 @@ typedef struct cache_t {
21 int size; 21 int size;
22} cache_t; 22} cache_t;
23 23
24static cache_t username, groupname; 24static cache_t *cache_user_group;
25 25
26static void clear_cache(cache_t *cp)
27{
28 free(cp->cache);
29 cp->cache = NULL;
30 cp->size = 0;
31}
32void FAST_FUNC clear_username_cache(void) 26void FAST_FUNC clear_username_cache(void)
33{ 27{
34 clear_cache(&username); 28 if (cache_user_group) {
35 clear_cache(&groupname); 29 free(cache_user_group[0].cache);
36} 30 free(cache_user_group[1].cache);
37 31 free(cache_user_group);
38#if 0 /* more generic, but we don't need that yet */ 32 cache_user_group = NULL;
39/* Returns -N-1 if not found. */ 33 }
40/* cp->cache[N] is allocated and must be filled in this case */
41static int get_cached(cache_t *cp, uid_t id)
42{
43 int i;
44 for (i = 0; i < cp->size; i++)
45 if (cp->cache[i].id == id)
46 return i;
47 i = cp->size++;
48 cp->cache = xrealloc_vector(cp->cache, 2, i);
49 cp->cache[i++].id = id;
50 return -i;
51} 34}
52#endif
53 35
54static char* get_cached(cache_t *cp, uid_t id, 36static char* get_cached(int user_group, uid_t id,
55 char* FAST_FUNC x2x_utoa(uid_t id)) 37 char* FAST_FUNC x2x_utoa(uid_t id))
56{ 38{
39 cache_t *cp;
57 int i; 40 int i;
41
42 if (!cache_user_group)
43 cache_user_group = xzalloc(sizeof(cache_user_group[0]) * 2);
44
45 cp = &cache_user_group[user_group];
46
58 for (i = 0; i < cp->size; i++) 47 for (i = 0; i < cp->size; i++)
59 if (cp->cache[i].id == id) 48 if (cp->cache[i].id == id)
60 return cp->cache[i].name; 49 return cp->cache[i].name;
@@ -67,11 +56,11 @@ static char* get_cached(cache_t *cp, uid_t id,
67} 56}
68const char* FAST_FUNC get_cached_username(uid_t uid) 57const char* FAST_FUNC get_cached_username(uid_t uid)
69{ 58{
70 return get_cached(&username, uid, uid2uname_utoa); 59 return get_cached(0, uid, uid2uname_utoa);
71} 60}
72const char* FAST_FUNC get_cached_groupname(gid_t gid) 61const char* FAST_FUNC get_cached_groupname(gid_t gid)
73{ 62{
74 return get_cached(&groupname, gid, gid2group_utoa); 63 return get_cached(1, gid, gid2group_utoa);
75} 64}
76 65
77 66