void _slab_page_insert(page_t* page, meta_t* meta) { list_head_t* head; head = _slab_free_page(meta->size); // page not full, then add list if (head == &g_slab_minor && list_not_in_link(&page->link)) { list_add(&page->link, head); } else if (head == &g_slab_common && list_not_in_link(&page->link)) { list_add(&page->link, head); } }
static void _slab_page_insert(page_t* page, meta_t* meta) { list_head_t* head = _slab_free_page(meta->size); if (head == &g_slab_minor) { list_del(&page->link); list_add(&page->link, head); } else if (head == &g_slab_common) { list_del(&page->link); list_add(&page->link, head); } }
void* slab_alloc(size_t sz) { meta_t* meta; page_t* page; list_head_t* head; void* memory; if (sz == 0) return NULL; sz = SLAB_ALIGN(sz); // try different list, if exceeds max return null head = _slab_free_page(sz); if (!head) return NULL; // alloc from free page list_for_each_entry(page, page_t, head, link) { memory = _slab_alloc(page, head, sz); if (memory) return memory; }