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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
#ifndef __LIBC_MALLOC_H
#define __LIBC_MALLOC_H
#include <stdatomic.h>
#include <stdint.h>
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
|