summaryrefslogtreecommitdiff
path: root/lib/libc/internal/include/malloc.h
blob: 98361ebd2a021af5cd78380609c06306860923be (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
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