#include <iostream>
using namespace std;
#include <stdlib.h>
#include <stdio.h>
#include <stdio.h>
#include <memory.h>
#include <malloc.h>
struct _page {
struct _page* next;
char begin[0];
};
struct _huge_page {
struct _huge_page* next;
size_t size;
char begin[0];
};
struct mpool {
struct _page* pages;
size_t npage;
size_t size;
size_t used;
size_t nalloc;
struct _huge_page* huges;
size_t nhuge;
};
struct mpool*
mpool_new(size_t page_size) {
size_t cap = 1024;
while (cap < page_size)
cap *= 2;
struct mpool* m = (struct mpool*)(malloc(sizeof(*m)));
struct _page* p = (struct _page*)(malloc(sizeof(*p) + cap));
p->next = NULL;
m->pages = p;
m->npage = 1;
m->size = cap;
m->used = 0;
m->nalloc = 0;
m->nhuge = 0;
return m;
}
void
mpool_delete(struct mpool* m) {
if (m) {
struct _page* p;
while (m->pages) {
p = m->pages;
m->pages = p->next;
free(p);
}
struct _huge_page* hp;
while (m->huges) {
hp = m->huges;
m->huges = hp->next;
free(hp);
}
free(m);
}
}
void*
mpool_alloc(struct mpool* m, size_t n) {
n = (n+3) & ~3;
if (n >= m->size) {
struct _huge_page* p =(struct _huge_page*)(malloc(sizeof(*p) + n));
p->size = n;
p->next = m->huges;
m->huges = p;
m->nhuge += 1;
m->nalloc += n;
return p->begin;
}
if (m->used + n > m->size) {
struct _page* p = (struct _page*)(malloc(sizeof(*p) + m->size));
p->next = m->pages;
m->pages = p;
m->npage += 1;
m->used = 0;
m->nalloc += n;
return p->begin;
} else {
void* ptr = m->pages->begin + m->used;
m->used += n;
m->nalloc += n;
return ptr;
}
}
void*
mpool_realloc(struct mpool* m, void* p, size_t n) {
return mpool_alloc(m, n);
}
void
mpool_dump(struct mpool* m) {
printf("[npage:%zu] ", m->npage);
printf("[total pagesize:%zu] ", m->npage*m->size);
printf("[nhuge:%zu] ", m->nhuge);
size_t n = 0;
struct _huge_page* h = m->huges;
while (h) {
n += h->size;
h = h->next;
}
printf("[total huge size:%zu] ", n);
printf("[nalloc:%zu]\n", m->nalloc);
}
int main()
{
struct mpool* m;
cout<<sizeof(*m)<<endl;
return 0;
}