mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-05-15 22:02:49 -06:00
50 lines
1.1 KiB
C
50 lines
1.1 KiB
C
#define V7
|
|
|
|
struct MSmall {
|
|
enum { CACHE = 64 };
|
|
|
|
struct FreeLink {
|
|
FreeLink *next;
|
|
};
|
|
|
|
struct Page {
|
|
Page *next;
|
|
Page *prev;
|
|
byte klass;
|
|
byte active;
|
|
MSmall *heap;
|
|
FreeLink *freelist;
|
|
|
|
void LinkSelf() { prev = next = this; }
|
|
void Unlink() { prev->next = next; next->prev = prev; }
|
|
void Link(Page *lnk) { prev = lnk; next = lnk->next; next->prev = this; lnk->next = this; }
|
|
|
|
void Format(int k);
|
|
byte *Begin() { return (byte *)this + sizeof(Page); }
|
|
byte *End() { return (byte *)this + 4096; }
|
|
};
|
|
|
|
static int Ksz(int k) { return (k + 1) << 4; }
|
|
|
|
|
|
static Page *global_empty[16];
|
|
static StaticMutex global_lock;
|
|
|
|
Page full[16][1];
|
|
Page work[16][1];
|
|
Page *empty[16];
|
|
FreeLink *cache[16];
|
|
int level[16];
|
|
|
|
void Init();
|
|
|
|
void *AllocK(int k);
|
|
void FreeK(void *ptr, Page *page, int k);
|
|
void *Alloc(size_t sz);
|
|
void Free(void *ptr);
|
|
|
|
static void *CheckFree(void *p, int k);
|
|
static void FillFree(void *ptr, int k);
|
|
|
|
void Check();
|
|
};
|