diff options
author | Denys Vlasenko | 2020-02-21 15:25:37 +0100 |
---|---|---|
committer | Denys Vlasenko | 2020-02-21 15:25:37 +0100 |
commit | da2e46dff6576c29fa1d379c943bb7943aa6e7ce (patch) | |
tree | 3c0d5871276db4d1e1bc3061e8de0529d39fa5f0 /shell | |
parent | 3ced804e3118d138781c3e4baa6bf1589b9f2dfd (diff) | |
download | busybox-da2e46dff6576c29fa1d379c943bb7943aa6e7ce.zip busybox-da2e46dff6576c29fa1d379c943bb7943aa6e7ce.tar.gz |
ash: memalloc: Avoid looping in growstackto
Upstream commit:
Date: Thu, 31 May 2018 01:51:48 +0800
memalloc: Avoid looping in growstackto
Currently growstackto will repeatedly call growstackblock until
the requisite size is obtained. This is wasteful. This patch
changes growstackblock to take a minimum size instead.
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'shell')
-rw-r--r-- | shell/ash.c | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/shell/ash.c b/shell/ash.c index fd2fc9f..8d18228 100644 --- a/shell/ash.c +++ b/shell/ash.c @@ -1678,15 +1678,16 @@ popstackmark(struct stackmark *mark) * part of the block that has been used. */ static void -growstackblock(void) +growstackblock(size_t min) { size_t newlen; newlen = g_stacknleft * 2; if (newlen < g_stacknleft) ash_msg_and_raise_error(bb_msg_memory_exhausted); - if (newlen < 128) - newlen += 128; + min = SHELL_ALIGN(min | 128); + if (newlen < min) + newlen += min; if (g_stacknxt == g_stackp->space && g_stackp != &stackbase) { struct stack_block *sp; @@ -1736,16 +1737,15 @@ static void * growstackstr(void) { size_t len = stackblocksize(); - growstackblock(); + growstackblock(0); return (char *)stackblock() + len; } static char * growstackto(size_t len) { - while (stackblocksize() < len) - growstackblock(); - + if (stackblocksize() < len) + growstackblock(len); return stackblock(); } |