#ifndef __LIBC_MALLOC_H #define __LIBC_MALLOC_H #include #include #include struct class { uint32_t size; uint32_t count; }; struct page { volatile atomic_flag lock; enum { PAGE_SMALL = 0x0, PAGE_MEDIUM = 0x1, PAGE_LARGE = 0x2, } flags; struct { uint32_t size; uint32_t used; uint32_t count; } block; uint8_t *bitmap; uint8_t *heap; struct page *next; struct page *prev; }; extern struct page *__malloc_pvec; #define SMALL_PAGE_SIZE_SHIFT 16 #define SMALL_PAGE_SIZE (1 << SMALL_PAGE_SIZE_SHIFT) #define SMALL_PAGE_MASK (~((uintptr_t)SMALL_PAGE_SIZE - 1)) #define MEDIUM_PAGE_SIZE_SHIFT 22 #define MEDIUM_PAGE_SIZE (1 << MEDIUM_PAGE_SIZE_SHIFT) #define MEDIUM_PAGE_MASK (~((uintptr_t)MEDIUM_PAGE_SIZE - 1)) #define LARGE_PAGE_SIZE_SHIFT 26 #define LARGE_PAGE_SIZE (1 << LARGE_PAGE_SIZE_SHIFT) #define LARGE_PAGE_MASK (~((uintptr_t)LARGE_PAGE_SIZE - 1)) #define SMALL_CLASS(n) \ { (n * 16), (SMALL_PAGE_SIZE - sizeof(struct page)) / (n * 16) } #define MEDIUM_CLASS(n) \ { (n * 16), (MEDIUM_PAGE_SIZE - sizeof(struct page)) / (n * 16) } #define LARGE_CLASS(n) \ { (n * 16), (LARGE_PAGE_SIZE - sizeof(struct page)) / (n * 16) } static const struct class global_size_class[] = { SMALL_CLASS(1), SMALL_CLASS(1), SMALL_CLASS(2), SMALL_CLASS(3), SMALL_CLASS(4), SMALL_CLASS(5), SMALL_CLASS(6), SMALL_CLASS(7), SMALL_CLASS(8), SMALL_CLASS(9), SMALL_CLASS(10), SMALL_CLASS(11), SMALL_CLASS(12), SMALL_CLASS(13), SMALL_CLASS(14), SMALL_CLASS(15), SMALL_CLASS(16), SMALL_CLASS(17), SMALL_CLASS(18), SMALL_CLASS(19), SMALL_CLASS(20), SMALL_CLASS(21), SMALL_CLASS(22), SMALL_CLASS(23), SMALL_CLASS(24), SMALL_CLASS(25), SMALL_CLASS(26), SMALL_CLASS(27), SMALL_CLASS(28), SMALL_CLASS(29), SMALL_CLASS(30), SMALL_CLASS(31), SMALL_CLASS(32), SMALL_CLASS(33), SMALL_CLASS(34), SMALL_CLASS(35), SMALL_CLASS(36), SMALL_CLASS(37), SMALL_CLASS(38), SMALL_CLASS(39), SMALL_CLASS(40), SMALL_CLASS(41), SMALL_CLASS(42), SMALL_CLASS(43), SMALL_CLASS(44), SMALL_CLASS(45), SMALL_CLASS(46), SMALL_CLASS(47), SMALL_CLASS(48), SMALL_CLASS(49), SMALL_CLASS(50), SMALL_CLASS(51), SMALL_CLASS(52), SMALL_CLASS(53), SMALL_CLASS(54), SMALL_CLASS(55), SMALL_CLASS(56), SMALL_CLASS(57), SMALL_CLASS(58), SMALL_CLASS(59), SMALL_CLASS(60), SMALL_CLASS(61), SMALL_CLASS(62), SMALL_CLASS(63), SMALL_CLASS(64), SMALL_CLASS(80), SMALL_CLASS(96), SMALL_CLASS(112), SMALL_CLASS(128), SMALL_CLASS(160), SMALL_CLASS(192), SMALL_CLASS(224), SMALL_CLASS(256), MEDIUM_CLASS(320), MEDIUM_CLASS(384), MEDIUM_CLASS(448), MEDIUM_CLASS(512), MEDIUM_CLASS(640), MEDIUM_CLASS(768), MEDIUM_CLASS(896), MEDIUM_CLASS(1024), MEDIUM_CLASS(1280), MEDIUM_CLASS(1536), MEDIUM_CLASS(1792), MEDIUM_CLASS(2048), MEDIUM_CLASS(2560), MEDIUM_CLASS(3072), MEDIUM_CLASS(3584), MEDIUM_CLASS(4096), MEDIUM_CLASS(5120), MEDIUM_CLASS(6144), MEDIUM_CLASS(7168), MEDIUM_CLASS(8192), MEDIUM_CLASS(10240), MEDIUM_CLASS(12288), MEDIUM_CLASS(14336), MEDIUM_CLASS(16384), LARGE_CLASS(20480), LARGE_CLASS(24576), LARGE_CLASS(28672), LARGE_CLASS(32768), LARGE_CLASS(40960), LARGE_CLASS(49152), LARGE_CLASS(57344), LARGE_CLASS(65536), LARGE_CLASS(81920), LARGE_CLASS(98304), LARGE_CLASS(114688), LARGE_CLASS(131072), LARGE_CLASS(163840), LARGE_CLASS(196608), LARGE_CLASS(229376), LARGE_CLASS(262144), LARGE_CLASS(327680), LARGE_CLASS(393216), LARGE_CLASS(458752), LARGE_CLASS(524288) }; #endif