summaryrefslogtreecommitdiffstats
path: root/mdk-stage1/dietlibc/lib/alloc.c
diff options
context:
space:
mode:
authorGuillaume Cottenceau <gc@mandriva.com>2001-05-14 14:19:32 +0000
committerGuillaume Cottenceau <gc@mandriva.com>2001-05-14 14:19:32 +0000
commit167217bec15c9c7aa70ba2a3dc9c689b3cd91872 (patch)
tree7c0c62debf8f9f145643102fb52b81afce743594 /mdk-stage1/dietlibc/lib/alloc.c
parent9097327dc1c667fc51b8e05cc7c0626fac96665d (diff)
downloaddrakx-backup-do-not-use-167217bec15c9c7aa70ba2a3dc9c689b3cd91872.tar
drakx-backup-do-not-use-167217bec15c9c7aa70ba2a3dc9c689b3cd91872.tar.gz
drakx-backup-do-not-use-167217bec15c9c7aa70ba2a3dc9c689b3cd91872.tar.bz2
drakx-backup-do-not-use-167217bec15c9c7aa70ba2a3dc9c689b3cd91872.tar.xz
drakx-backup-do-not-use-167217bec15c9c7aa70ba2a3dc9c689b3cd91872.zip
import new version of dietlibc
Diffstat (limited to 'mdk-stage1/dietlibc/lib/alloc.c')
-rw-r--r--mdk-stage1/dietlibc/lib/alloc.c38
1 files changed, 28 insertions, 10 deletions
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 <linux/unistd.h>
#include <asm/mman.h>
#include <linux/errno.h>
+#include "dietfeatures.h"
#if 0
#include <sys/mman.h>
@@ -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));