forked from KolibriOS/kolibrios
101 lines
2.2 KiB
C
101 lines
2.2 KiB
C
|
|
||
|
|
||
|
//#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 */
|
||
|
|
||
|
|
||
|
|