Commit 6c91272f authored by Mathieu Maret's avatar Mathieu Maret

alloc: slub implemented with list

parent e03f0c0d
......@@ -9,7 +9,7 @@
// Slab will contains object from sizeof(void *) to PAGE_SIZE/2 by pow2
#define SLUB_SIZE (PAGE_SHIFT - 1)
struct slabDesc *slubArray[SLUB_SIZE];
struct slabDesc *slub;
int initSlabDesc(struct slabDesc **desc, size_t size);
static int formatPage(struct slabDesc *desc, size_t size);
......@@ -17,9 +17,12 @@ static int formatPage(struct slabDesc *desc, size_t size);
int initSlab(void)
{
uint start = log2(sizeof(void *));
list_init(slub);
for (uint i = start; i < SLUB_SIZE; i++) {
if (initSlabDesc(&slubArray[i - start], 1U << i))
struct slabDesc *slab;
if (initSlabDesc(&slab, 1U << i))
return ENOMEM;
list_add_tail(slub, slab);
}
return 0;
}
......@@ -75,23 +78,26 @@ void *malloc(size_t size)
printf("implement malloc for big size\n");
return NULL;
}
struct slabDesc *slubEntry;
uint slubIdx = 0;
while (size > slubArray[slubIdx]->size) {
slubIdx++;
list_foreach(slub, slubEntry, slubIdx)
{
if(size <= slubEntry->size)
break;
}
struct slabDesc *slab;
int slabIdx;
list_foreach(slubArray[slubIdx], slab, slabIdx)
list_foreach(slubEntry, slab, slabIdx)
{
if (!slab->full) {
pr_devel("found place in slub %d at idx %d \n", slubIdx, slabIdx);
return allocFromSlab(slab);
}
}
if (!list_foreach_early_break(slubArray[slubIdx], slab, slabIdx)) {
if (!list_foreach_early_break(slubEntry, slab, slabIdx)) {
struct slabDesc *newSlab;
initSlabDesc(&newSlab, slab->size);
list_add_head(slubArray[slubIdx], newSlab);
list_add_head(slubEntry, newSlab);
return allocFromSlab(newSlab);
}
return NULL;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment