104 lines
2.1 KiB
C
104 lines
2.1 KiB
C
#include "kern/cdef.h"
|
|
#include "kern/mlayout.h"
|
|
#include "lb/dlist.h"
|
|
|
|
/**
|
|
* Simplified Slab Allocator
|
|
*/
|
|
|
|
#define LARGE_THRESHOLD (8)
|
|
|
|
struct ssalloc_page_desc
|
|
{
|
|
struct dlist_node node;
|
|
uint32 used_obj_num;
|
|
uint8 free_list[0]; /* free list inside each slab */
|
|
};
|
|
|
|
struct ssalloc_obj_desc
|
|
{
|
|
struct dlist free_list;
|
|
struct dlist full_list;
|
|
struct dlist empty_list;
|
|
usize obj_size;
|
|
uint32 align;
|
|
};
|
|
|
|
struct ssalloc_desc
|
|
{
|
|
uint32 chunk_size;
|
|
void* malloc_chunk(void); // allocate a chunk
|
|
void* free_chunk(void); // free a chunk
|
|
};
|
|
|
|
static void* scalloc_large(struct ssalloc_desc* desc, struct ssalloc_obj_desc* obj_desc)
|
|
{
|
|
|
|
}
|
|
|
|
static void scfree_large(struct ssalloc_desc* desc, struct ssalloc_obj_desc* obj_desc, void* addr)
|
|
{
|
|
|
|
}
|
|
|
|
static void* scalloc_small(struct ssalloc_desc* desc, struct ssalloc_obj_desc* obj_desc)
|
|
{
|
|
// check the current free list first
|
|
if (lb_dlist_size(&obj_desc->free_list) > 0)
|
|
{
|
|
// if it exists then we grab something from the list
|
|
struct llist_node* node = lb_dlist_first(node);
|
|
}
|
|
else
|
|
{
|
|
|
|
}
|
|
}
|
|
|
|
static void scfree_small(struct ssalloc_desc* desc, struct ssalloc_obj_desc* obj_desc, void* addr)
|
|
{
|
|
|
|
}
|
|
|
|
void ssalloc_desc_init(struct ssalloc_desc* desc)
|
|
{
|
|
|
|
}
|
|
|
|
void ssalloc_obj_desc_init(struct ssalloc_obj_desc* obj_desc, usize obj_size, uint32 align)
|
|
{
|
|
obj_desc->obj_size = obj_size;
|
|
obj_desc->align = align;
|
|
lb_dlist_init(&obj_desc->empty_list);
|
|
lb_dlist_init(&obj_desc->full_list);
|
|
lb_dlist_init(&obj_desc->free_list);
|
|
}
|
|
|
|
void* scalloc(struct ssalloc_desc* desc, struct ssalloc_obj_desc* obj_desc)
|
|
{
|
|
void* ret = NULL;
|
|
if(obj_desc->obj_size < desc->chunk_size / LARGE_THRESHOLD)
|
|
{
|
|
ret = scalloc_small(desc, obj_desc);
|
|
}
|
|
else
|
|
{
|
|
// large objects
|
|
ret = scalloc_large(desc, obj_desc);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
void scfree(struct ssalloc_desc* desc, struct ssalloc_obj_desc* obj_desc, void* address)
|
|
{
|
|
if(obj_desc->obj_size < desc->chunk_size)
|
|
{
|
|
scfree_small(desc, obj_desc, address);
|
|
}
|
|
else
|
|
{
|
|
// large objects
|
|
scfree_large(desc, obj_desc, address);
|
|
}
|
|
} |