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>
This commit is contained in:
@ -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
|
||||
|
Reference in New Issue
Block a user