From 167217bec15c9c7aa70ba2a3dc9c689b3cd91872 Mon Sep 17 00:00:00 2001 From: Guillaume Cottenceau Date: Mon, 14 May 2001 14:19:32 +0000 Subject: import new version of dietlibc --- mdk-stage1/dietlibc/lib/alloc.c | 38 ++++++++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 10 deletions(-) (limited to 'mdk-stage1/dietlibc/lib/alloc.c') diff --git a/mdk-stage1/dietlibc/lib/alloc.c b/mdk-stage1/dietlibc/lib/alloc.c index 27b6838df..8cb87a69b 100644 --- a/mdk-stage1/dietlibc/lib/alloc.c +++ b/mdk-stage1/dietlibc/lib/alloc.c @@ -5,6 +5,7 @@ #include #include #include +#include "dietfeatures.h" #if 0 #include @@ -31,8 +32,10 @@ extern void *memset(void *s, int c, size_t n); extern void *memcpy(void *dest, const void *src, size_t n); typedef struct t_alloc_head { + unsigned int magic1; struct t_alloc_head *ptr; unsigned long size; + unsigned int magic2; } alloc_head; /* guess what ? the virtual block size */ @@ -49,22 +52,28 @@ typedef struct t_alloc_head { #define PAGE_ALIGN(s) (((s)+MEM_BLOCK_SIZE-1)&(~(MEM_BLOCK_SIZE-1))) #define PAGE_ALIGNP(p) ((char*)PAGE_ALIGN((size_t)(p))) -#define END_OF_BLOCK(p) ((alloc_head*)(((char*)(p))+((p)->size))) -#define START_BLOCK(p) ((alloc_head*)(((char*)(p))-sizeof(alloc_head))) -#define START_DATA(p) (((char*)(p))+sizeof(alloc_head)) -#define MIN_ALLOC(s) (((((s)+sizeof(alloc_head)-1)/MEM_ALLOC_MIN)+1)*MEM_ALLOC_MIN) +#define END_OF_BLOCK(p) ((alloc_head*)(((char*)(p))+((p)->size))) +#define START_BLOCK(p) ((alloc_head*)(((char*)(p))-sizeof(alloc_head))) +#define START_DATA(p) (((char*)(p))+sizeof(alloc_head)) +#define MIN_ALLOC(s) (((((s)+sizeof(alloc_head)-1)/MEM_ALLOC_MIN)+1)*MEM_ALLOC_MIN) + +#define ALLOC_MAGIC1 0xbad2f7ee +#define ALLOC_MAGIC2 0xf7ee2bad /* freelist handler */ -static alloc_head base = {&base,0}; +static alloc_head base = {ALLOC_MAGIC1,&base,0,ALLOC_MAGIC2}; static char *alloc_get_end = MEM_ALLOC_START; -void free(void *ptr) +void __libc_free(void *ptr) { alloc_head *prev,*p,*block; if (ptr==NULL) return; block=START_BLOCK(ptr); + if (block->magic1 != ALLOC_MAGIC1) return; + if (block->magic2 != ALLOC_MAGIC2) return; + prev=&base; for (p=prev->ptr ; ; prev=p, p=p->ptr) { @@ -91,6 +100,7 @@ void free(void *ptr) prev->ptr = block->ptr; } } +void free(void *ptr) __attribute__((weak,alias("__libc_free"))); static void *alloc_get_mem(unsigned long size) { @@ -119,16 +129,18 @@ static void *alloc_get_mem(unsigned long size) /* make a header */ ah=(alloc_head*)tmp; + ah->magic1=ALLOC_MAGIC1; + ah->magic2=ALLOC_MAGIC2; ah->ptr=ah; ah->size=size; /* link new free maped pages in freelist */ - free(START_DATA(tmp)); + __libc_free(START_DATA(tmp)); return &base; } -void *malloc(size_t size) +void *__libc_malloc(size_t size) { alloc_head *p, *prev; size_t need; @@ -157,6 +169,8 @@ void *malloc(size_t size) else { prev->ptr=tmp; + tmp->magic1=ALLOC_MAGIC1; + tmp->magic2=ALLOC_MAGIC2; tmp->ptr=p->ptr; tmp->size=p->size-need; /* remaining size */ } @@ -169,11 +183,13 @@ void *malloc(size_t size) } else if (p==&base) { - if ((p=alloc_get_mem(need))==NULL) return NULL; + if ((p=alloc_get_mem(need))==NULL) goto err_out; } } +err_out: return NULL; } +void *malloc(size_t size) __attribute__((weak,alias("__libc_malloc"))); void *calloc(size_t nmemb,size_t size) { @@ -206,10 +222,12 @@ void *realloc(void *ptr,size_t size) } return NULL; } - if (diff>0) + if (diff>=sizeof(alloc_head)) { tmp->size=need; tf=END_OF_BLOCK(tmp); + tf->magic1=ALLOC_MAGIC1; + tf->magic2=ALLOC_MAGIC2; tf->ptr=tf; tf->size=diff; free(START_DATA(tf)); -- cgit v1.2.1