Пример #1
0
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);
    }
}
Пример #2
0
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);
    }
}
Пример #3
0
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;
    }