0,0 → 1,100 |
|
|
//#include "kolibc.h" |
|
#ifdef __cplusplus |
extern "C" { |
#endif /* __cplusplus */ |
|
typedef unsigned int dword; |
typedef unsigned int size_t; |
|
|
#define PINUSE_BIT 1 |
#define CINUSE_BIT 2 |
#define INUSE_BITS 3 |
|
|
struct m_seg |
{ |
char* base; /* base address */ |
dword size; /* allocated size */ |
struct m_seg* next; /* ptr to next segment */ |
dword flags; /* mmap and extern flag */ |
}; |
|
struct m_chunk |
{ |
dword prev_foot; /* Size of previous chunk (if free). */ |
dword head; /* Size and inuse bits. */ |
struct m_chunk* fd; /* double links -- used only if free. */ |
struct m_chunk* bk; |
}; |
|
typedef struct m_chunk* mchunkptr; |
|
struct t_chunk |
{ |
/* The first four fields must be compatible with malloc_chunk */ |
dword prev_foot; |
dword head; |
|
struct t_chunk* fd; |
struct t_chunk* bk; |
|
struct t_chunk* child[2]; |
|
struct t_chunk* parent; |
dword index; |
}; |
|
typedef struct t_chunk* tchunkptr; |
typedef struct t_chunk* tbinptr; |
|
typedef struct m_state |
{ |
dword smallmap; |
dword treemap; |
// DWORD dvsize; |
dword topsize; |
char* least_addr; |
// mchunkptr dv; |
mchunkptr top; |
dword magic; |
struct m_chunk smallbins[32]; |
tbinptr treebins[32]; |
}; |
|
|
void _cdecl init_malloc(void* p); |
void* _cdecl dlmalloc(size_t); |
void _cdecl dlfree(void*); |
void* _cdecl dlrealloc(void *,size_t); |
|
|
dword compute_tree_index(size_t s); |
|
static void insert_chunk(mchunkptr P, size_t S); |
static void insert_large_chunk(tchunkptr X, size_t S); |
|
static void unlink_large_chunk(tchunkptr X); |
|
//void replace_dv(mchunkptr P, size_t S); |
static void* malloc_small(size_t nb); |
static void* malloc_large(size_t nb); |
|
#define leftshift_for_tree_index(i) \ |
((i == 31)? 0 : (31 - (i >> 1) + 8 - 2)) |
|
#define leftmost_child(t) ((t)->child[0] != 0? (t)->child[0] : (t)->child[1]) |
#define chunk2mem(p) (void*)((char*)p + 8) |
#define mem2chunk(mem) (mchunkptr)((char*)mem - 8) |
#define chunk_plus_offset(p, s) ((mchunkptr)(((char*)(p)) + (s))) |
|
|
#ifdef __cplusplus |
} |
#endif /* __cplusplus */ |
|
|
|