diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2020-10-01 21:52:16 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2020-10-01 21:52:16 +0200 |
commit | 689d0650ab63425adaea26afe347015a204958ee (patch) | |
tree | 9c2e10b952cad6804359bc10ccc963ff138fc3d4 /editors | |
parent | 3c3928fc658bddacd4e540589868bc28a8e4ca0a (diff) | |
download | busybox-w32-689d0650ab63425adaea26afe347015a204958ee.tar.gz busybox-w32-689d0650ab63425adaea26afe347015a204958ee.tar.bz2 busybox-w32-689d0650ab63425adaea26afe347015a204958ee.zip |
libbb: shrink recursive_action() by reducing memory pressure
function old new delta
recursive_action1 - 316 +316
file_action_grep 161 164 +3
add_to_prg_cache_if_socket 202 205 +3
depmod_main 509 511 +2
writeFileToTarball 488 489 +1
parse_module 281 282 +1
fileAction 207 208 +1
act 189 190 +1
add_to_dirlist 65 64 -1
writeTarFile 196 194 -2
uuidcache_init 47 45 -2
uuidcache_check_device 109 107 -2
true_action 8 6 -2
run_parts_main 310 308 -2
netstat_main 534 532 -2
lsusb_main 29 27 -2
lspci_main 45 43 -2
initial_scan 138 136 -2
grep_main 845 843 -2
find_main 482 480 -2
config_file_action 437 435 -2
chmod_main 142 140 -2
dirAction 14 10 -4
diff_main 1544 1540 -4
chown_main 154 148 -6
skip_dir 136 129 -7
dir_act 191 184 -7
recursive_action 453 69 -384
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 7/20 up/down: 328/-439) Total: -111 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'editors')
-rw-r--r-- | editors/diff.c | 22 |
1 files changed, 11 insertions, 11 deletions
diff --git a/editors/diff.c b/editors/diff.c index dc40ab4f1..280091756 100644 --- a/editors/diff.c +++ b/editors/diff.c | |||
@@ -803,11 +803,11 @@ struct dlist { | |||
803 | }; | 803 | }; |
804 | 804 | ||
805 | /* This function adds a filename to dl, the directory listing. */ | 805 | /* This function adds a filename to dl, the directory listing. */ |
806 | static int FAST_FUNC add_to_dirlist(const char *filename, | 806 | static int FAST_FUNC add_to_dirlist(struct recursive_state *state, |
807 | struct stat *sb UNUSED_PARAM, | 807 | const char *filename, |
808 | void *userdata, int depth UNUSED_PARAM) | 808 | struct stat *sb UNUSED_PARAM) |
809 | { | 809 | { |
810 | struct dlist *const l = userdata; | 810 | struct dlist *const l = state->userData; |
811 | const char *file = filename + l->len; | 811 | const char *file = filename + l->len; |
812 | while (*file == '/') | 812 | while (*file == '/') |
813 | file++; | 813 | file++; |
@@ -820,12 +820,12 @@ static int FAST_FUNC add_to_dirlist(const char *filename, | |||
820 | /* If recursion is not set, this function adds the directory | 820 | /* If recursion is not set, this function adds the directory |
821 | * to the list and prevents recursive_action from recursing into it. | 821 | * to the list and prevents recursive_action from recursing into it. |
822 | */ | 822 | */ |
823 | static int FAST_FUNC skip_dir(const char *filename, | 823 | static int FAST_FUNC skip_dir(struct recursive_state *state, |
824 | struct stat *sb, void *userdata, | 824 | const char *filename, |
825 | int depth) | 825 | struct stat *sb) |
826 | { | 826 | { |
827 | if (!(option_mask32 & FLAG(r)) && depth) { | 827 | if (!(option_mask32 & FLAG(r)) && state->depth) { |
828 | add_to_dirlist(filename, sb, userdata, depth); | 828 | add_to_dirlist(state, filename, sb); |
829 | return SKIP; | 829 | return SKIP; |
830 | } | 830 | } |
831 | if (!(option_mask32 & FLAG(N))) { | 831 | if (!(option_mask32 & FLAG(N))) { |
@@ -833,7 +833,7 @@ static int FAST_FUNC skip_dir(const char *filename, | |||
833 | * which do not exist on the "other side". | 833 | * which do not exist on the "other side". |
834 | * Testcase: diff -r /tmp / | 834 | * Testcase: diff -r /tmp / |
835 | * (it would recurse deep into /proc without this code) */ | 835 | * (it would recurse deep into /proc without this code) */ |
836 | struct dlist *const l = userdata; | 836 | struct dlist *const l = state->userData; |
837 | filename += l->len; | 837 | filename += l->len; |
838 | if (filename[0]) { | 838 | if (filename[0]) { |
839 | struct stat osb; | 839 | struct stat osb; |
@@ -868,7 +868,7 @@ static void diffdir(char *p[2], const char *s_start) | |||
868 | * add_to_dirlist will remove it. */ | 868 | * add_to_dirlist will remove it. */ |
869 | list[i].len = strlen(p[i]); | 869 | list[i].len = strlen(p[i]); |
870 | recursive_action(p[i], ACTION_RECURSE | ACTION_FOLLOWLINKS, | 870 | recursive_action(p[i], ACTION_RECURSE | ACTION_FOLLOWLINKS, |
871 | add_to_dirlist, skip_dir, &list[i], 0); | 871 | add_to_dirlist, skip_dir, &list[i]); |
872 | /* Sort dl alphabetically. | 872 | /* Sort dl alphabetically. |
873 | * GNU diff does this ignoring any number of trailing dots. | 873 | * GNU diff does this ignoring any number of trailing dots. |
874 | * We don't, so for us dotted files almost always are | 874 | * We don't, so for us dotted files almost always are |