aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHerbert Xu <herbert@gondor.apana.org.au>2018-05-31 01:51:48 +0800
committerBen Hutchings <ben@decadent.org.uk>2020-03-28 21:42:55 +0000
commit21ceb151c758eb2384962b9ee8abc33b5bd674e9 (patch)
tree2ba3134ddf80ec1aaed610f12cef882f6999a283
parenta4d612ae4f36810afb28b497e867714a01cbec82 (diff)
downloadklibc-21ceb151c758eb2384962b9ee8abc33b5bd674e9.tar.gz
[klibc] dash: memalloc: Avoid looping in growstackto
[ dash commit e9cb50188b1b04b6e5e8e8ccc8874b2abcff8bb1 ] 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: Ben Hutchings <ben@decadent.org.uk>
-rw-r--r--usr/dash/memalloc.c16
-rw-r--r--usr/dash/memalloc.h1
2 files changed, 8 insertions, 9 deletions
diff --git a/usr/dash/memalloc.c b/usr/dash/memalloc.c
index 9d1de74a4000f..60637da154cbf 100644
--- a/usr/dash/memalloc.c
+++ b/usr/dash/memalloc.c
@@ -201,16 +201,16 @@ popstackmark(struct stackmark *mark)
* part of the block that has been used.
*/
-void
-growstackblock(void)
+static void growstackblock(size_t min)
{
size_t newlen;
newlen = stacknleft * 2;
if (newlen < stacknleft)
sh_error("Out of space");
- if (newlen < 128)
- newlen += 128;
+ min = SHELL_ALIGN(min | 128);
+ if (newlen < min)
+ newlen += min;
if (stacknxt == stackp->space && stackp != &stackbase) {
struct stack_block *sp;
@@ -261,15 +261,15 @@ void *
growstackstr(void)
{
size_t len = stackblocksize();
- growstackblock();
+
+ growstackblock(0);
return stackblock() + len;
}
char *growstackto(size_t len)
{
- while (stackblocksize() < len)
- growstackblock();
-
+ if (stackblocksize() < len)
+ growstackblock(len);
return stackblock();
}
diff --git a/usr/dash/memalloc.h b/usr/dash/memalloc.h
index b348d9ccd5641..b9c63dacb2327 100644
--- a/usr/dash/memalloc.h
+++ b/usr/dash/memalloc.h
@@ -55,7 +55,6 @@ void stunalloc(pointer);
void pushstackmark(struct stackmark *mark, size_t len);
void setstackmark(struct stackmark *);
void popstackmark(struct stackmark *);
-void growstackblock(void);
void *growstackstr(void);
char *growstackto(size_t len);
char *makestrspace(size_t, char *);