diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2020-12-30 01:04:56 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2020-12-30 01:04:56 +0100 |
commit | 89a55972fd5d7f0ab815c2a62be69a8f34718353 (patch) | |
tree | bfd5b6e17a596a3a244ec9996b0df5baf42e1da3 | |
parent | b230ff9d8f1a393c13f338b030cace0899d5ec26 (diff) | |
download | busybox-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.c | 45 |
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 | ||
24 | static cache_t username, groupname; | 24 | static cache_t *cache_user_group; |
25 | 25 | ||
26 | static void clear_cache(cache_t *cp) | ||
27 | { | ||
28 | free(cp->cache); | ||
29 | cp->cache = NULL; | ||
30 | cp->size = 0; | ||
31 | } | ||
32 | void FAST_FUNC clear_username_cache(void) | 26 | void 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 */ | ||
41 | static 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 | ||
54 | static char* get_cached(cache_t *cp, uid_t id, | 36 | static 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 | } |
68 | const char* FAST_FUNC get_cached_username(uid_t uid) | 57 | const 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 | } |
72 | const char* FAST_FUNC get_cached_groupname(gid_t gid) | 61 | const 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 | ||