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 <herb...@gondor.apana.org.au>

diff --git a/src/memalloc.c b/src/memalloc.c
index 9d1de74..60637da 100644
--- a/src/memalloc.c
+++ b/src/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/src/memalloc.h b/src/memalloc.h
index b348d9c..b9c63da 100644
--- a/src/memalloc.h
+++ b/src/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 *);
-- 
Email: Herbert Xu <herb...@gondor.apana.org.au>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
--
To unsubscribe from this list: send the line "unsubscribe dash" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to