level 11
#include<stdlib.h>
#include<stddef.h>
#include<string.h>
#include<stdio.h>
#define ALIGN 8
#define MAX_BYTES 128
#define NFREELISTS (MAX_BYTES/ALIGN) //16
typedef union obj
{
union obj *next_free_link;
char clint[1];
}obj;
static obj *free_list[NFREELISTS]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
static char *start_free=0,*end_free=0;
static size_t heap_size=0;
static inline size_t ROUND_UP(size_t bytes)
{
return ( ((bytes)+ALIGN-1) & ~(ALIGN-1) );
}
static inline size_t FREELIST_INDEX(size_t bytes)
{
return (((bytes)+ALIGN-1)/ALIGN-1);
}
static void * refill(size_t );
static void * chunk_alloc(size_t,int *);
static void *allocate(size_t n)
{
obj **my_free_list;
obj *result;
if(n>MAX_BYTES)return malloc(n);
my_free_list=free_list+FREELIST_INDEX(n);
result=*my_free_list;
if(0==result)
{
void *re=refill(ROUND_UP(n));
return re;
}
*my_free_list=result->next_free_link;
return (result);
}
static void deallocate(void *p,size_t n)
{
obj *q=(obj *)p;
obj **my_free_list;
if(n>(size_t)MAX_BYTES)
{
free(p);
return ;
}
my_free_list=free_list+FREELIST_INDEX(n);
q->next_free_link=*my_free_list;
*my_free_list=q;
}
static void *reallocate(void *p,size_t old_size,size_t new_size)
{
obj *result;
size_t copy_size;
if(new_size>(size_t)MAX_BYTES && old_size>(size_t)MAX_BYTES)
{
return realloc(p,new_size);
}
if(ROUND_UP(old_size)==ROUND_UP(new_size))return p;
result=allocate(new_size);
copy_size = new_size<old_size ? new_size : old_size;
memcpy(result,p,copy_size);
deallocate(p,old_size);
}
void *chunk_alloc(size_t size,int *n)
{
char *result;
size_t total_bytes=*n*size;
size_t heap_left=end_free-start_free;
obj **my_free_list,*p;
2011年08月08日 15点08分