aboutsummaryrefslogtreecommitdiff
path: root/test/memory.c
blob: 9308b2ba3dc0ef07de37a9fa0242c042aa7dc25e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

#include "kpl_test.h"

KPL_TEST(allocate_and_pool) {
    kpl_memory_allocator allocator = {};
    kpl_memory_allocator_init(&allocator);
    for (int32_t times = 0; times < 700; times++) {
        kpl_object *objects[10] = {};
        for (int32_t object = 0; object < 10; object++) {
            objects[object] = kpl_memory_allocator_allocate(&allocator, 32, KPL_THREAD_MAIN_ID);
            KPL_ASSERT(objects[object]->object_size == 32, "Invalid size for 32 byte object");
        }
        for (int32_t object = 0; object < 10; object++)
            kpl_memory_allocator_return(&allocator, objects[object]);
    }
    kpl_memory_allocator_slab_group *slab_group32 = &allocator.slabs[5];
    KPL_ASSERT(slab_group32->slab_head == slab_group32->slab_tail, "Only one slab should have been allocated");
    kpl_memory_allocator_free(&allocator);
}

KPL_TEST(allocate_multiple_slabs) {
    kpl_memory_allocator allocator = {};
    kpl_memory_allocator_init(&allocator);
    kpl_object *large1 = kpl_memory_allocator_allocate(&allocator, 1 << 13, KPL_THREAD_MAIN_ID);
    kpl_object *large2 = kpl_memory_allocator_allocate(&allocator, 1 << 13, KPL_THREAD_MAIN_ID);
    KPL_ASSERT(large1->object_size == 1 << 13, "Invalid object size");
    KPL_ASSERT(large1->object_size == large2->object_size, "Objects should have the same size");
    kpl_memory_allocator_slab_group *slab_group = &allocator.slabs[13];
    KPL_ASSERT(slab_group->slab_head != slab_group->slab_tail, "More the one slab should have been allocated");
    kpl_memory_allocator_return(&allocator, large1);
    kpl_memory_allocator_return(&allocator, large2);
    kpl_memory_allocator_free(&allocator);
}