On Wed, Jun 10, 2009 at 03:04:56PM +1000, Herbert Xu wrote: > Can you separate these two changes into two patches? It's much > easier to track down problems if each patch does a single thing. Bellow are the patches. In the first we can change space[4] also to space[1]. The second is good for systems which uses malloc based on mmap and after void *x = malloc(4000); free(x); the region is _unmapped_. One can check this with a simple program and strace. diff -urN dash-0.5.5.1_orig/src/memalloc.c dash-0.5.5.1/src/memalloc.c --- dash-0.5.5.1_orig/src/memalloc.c Wed Jan 14 01:37:13 2009 +++ dash-0.5.5.1/src/memalloc.c Wed Jun 10 09:09:23 2009 @@ -97,18 +97,19 @@ */ /* minimum size of a block */ -#define MINSIZE SHELL_ALIGN(504) +/* #define MINSIZE SHELL_ALIGN(504) */ +typedef struct { void *next; size_t size; } __alloc_t; +#define MINSIZE (512 -SHELL_ALIGN(sizeof(void*) + sizeof(__alloc_t))) struct stack_block { struct stack_block *prev; - char space[MINSIZE]; + char space[4]; }; -struct stack_block stackbase; -struct stack_block *stackp = &stackbase; -char *stacknxt = stackbase.space; -size_t stacknleft = MINSIZE; -char *sstrend = stackbase.space + MINSIZE; +static struct stack_block *stackp = 0; +char *stacknxt = 0; +char *sstrend = 0; +size_t stacknleft = 0; pointer stalloc(size_t nbytes) @@ -125,7 +126,7 @@ blocksize = aligned; if (blocksize < MINSIZE) blocksize = MINSIZE; - len = sizeof(struct stack_block) - MINSIZE + blocksize; + len = sizeof(void *) + blocksize; if (len < blocksize) sh_error("Out of space"); INTOFF; @@ -169,7 +170,7 @@ void setstackmark(struct stackmark *mark) { - pushstackmark(mark, stacknxt == stackp->space && stackp != &stackbase); + pushstackmark(mark, stacknxt == stackp->space); } @@ -212,19 +213,13 @@ if (newlen < 128) newlen += 128; - if (stacknxt == stackp->space && stackp != &stackbase) { - struct stack_block *oldstackp; + if (stacknxt == stackp->space) { struct stack_block *sp; - struct stack_block *prevstackp; size_t grosslen; INTOFF; - oldstackp = stackp; - sp = stackp; - prevstackp = sp->prev; - grosslen = newlen + sizeof(struct stack_block) - MINSIZE; - sp = ckrealloc((pointer)sp, grosslen); - sp->prev = prevstackp; + grosslen = newlen + sizeof(void *); + sp = ckrealloc((pointer)stackp, grosslen); stackp = sp; stacknxt = sp->space; stacknleft = newlen; =================================================================== diff -urN dash-0.5.5.1_orig/src/memalloc.c dash-0.5.5.1/src/memalloc.c --- dash-0.5.5.1_orig/src/memalloc.c Wed Jan 14 01:37:13 2009 +++ dash-0.5.5.1/src/memalloc.c Wed Jun 10 09:21:21 2009 @@ -99,6 +99,12 @@ /* minimum size of a block */ #define MINSIZE SHELL_ALIGN(504) +#if defined(__dietlibc__) || defined(MALLOC_USES_MMAP_FOR_BIG_BLOCKS) +typedef struct { void *next; size_t size; } __alloc_t; +#include <sys/shm.h> /* PAGE_SIZE */ +#define XXXSIZE (PAGE_SIZE -SHELL_ALIGN(sizeof(void*) + sizeof(__alloc_t))) +#endif + struct stack_block { struct stack_block *prev; char space[MINSIZE]; @@ -123,6 +129,10 @@ struct stack_block *sp; blocksize = aligned; +#ifdef XXXSIZE + if (stackp && blocksize < XXXSIZE) + blocksize = XXXSIZE; +#endif if (blocksize < MINSIZE) blocksize = MINSIZE; len = sizeof(struct stack_block) - MINSIZE + blocksize; -- To unsubscribe from this list: send the line "unsubscribe dash" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html