From 689d0650ab63425adaea26afe347015a204958ee Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Thu, 1 Oct 2020 21:52:16 +0200 Subject: 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 --- editors/diff.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) (limited to 'editors/diff.c') 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 { }; /* This function adds a filename to dl, the directory listing. */ -static int FAST_FUNC add_to_dirlist(const char *filename, - struct stat *sb UNUSED_PARAM, - void *userdata, int depth UNUSED_PARAM) +static int FAST_FUNC add_to_dirlist(struct recursive_state *state, + const char *filename, + struct stat *sb UNUSED_PARAM) { - struct dlist *const l = userdata; + struct dlist *const l = state->userData; const char *file = filename + l->len; while (*file == '/') file++; @@ -820,12 +820,12 @@ static int FAST_FUNC add_to_dirlist(const char *filename, /* If recursion is not set, this function adds the directory * to the list and prevents recursive_action from recursing into it. */ -static int FAST_FUNC skip_dir(const char *filename, - struct stat *sb, void *userdata, - int depth) +static int FAST_FUNC skip_dir(struct recursive_state *state, + const char *filename, + struct stat *sb) { - if (!(option_mask32 & FLAG(r)) && depth) { - add_to_dirlist(filename, sb, userdata, depth); + if (!(option_mask32 & FLAG(r)) && state->depth) { + add_to_dirlist(state, filename, sb); return SKIP; } if (!(option_mask32 & FLAG(N))) { @@ -833,7 +833,7 @@ static int FAST_FUNC skip_dir(const char *filename, * which do not exist on the "other side". * Testcase: diff -r /tmp / * (it would recurse deep into /proc without this code) */ - struct dlist *const l = userdata; + struct dlist *const l = state->userData; filename += l->len; if (filename[0]) { struct stat osb; @@ -868,7 +868,7 @@ static void diffdir(char *p[2], const char *s_start) * add_to_dirlist will remove it. */ list[i].len = strlen(p[i]); recursive_action(p[i], ACTION_RECURSE | ACTION_FOLLOWLINKS, - add_to_dirlist, skip_dir, &list[i], 0); + add_to_dirlist, skip_dir, &list[i]); /* Sort dl alphabetically. * GNU diff does this ignoring any number of trailing dots. * We don't, so for us dotted files almost always are -- cgit v1.2.3