Skip to content

Commit 2816df5

Browse files
committed
Increase tinymalloc granularity
1 parent a05ce3a commit 2816df5

File tree

4 files changed

+39
-36
lines changed

4 files changed

+39
-36
lines changed

build/bootstrap/compile

-64 Bytes
Binary file not shown.

build/bootstrap/fixupobj

83 Bytes
Binary file not shown.

libc/mem/tinymalloc.inc

Lines changed: 25 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232

3333
alignas(TINYMALLOC_MAX_ALIGN) static struct {
3434
char memory[TINYMALLOC_MAX_BYTES];
35-
unsigned used, last, free;
35+
size_t used, last, free;
3636
} heap;
3737

3838
static inline bool isheap(char *mem) {
@@ -41,46 +41,47 @@ static inline bool isheap(char *mem) {
4141

4242
void free(void *ptr) {
4343
char *mem;
44-
unsigned base;
44+
size_t base;
4545
if (ptr) {
4646
mem = (char *)ptr;
4747
unassert(isheap(mem));
4848
base = mem - heap.memory;
49-
*(unsigned *)mem = heap.free;
49+
*(size_t *)mem = heap.free;
5050
heap.free = base;
5151
}
5252
}
5353

5454
size_t malloc_usable_size(void *ptr) {
5555
char *mem = (char *)ptr;
5656
unassert(isheap(mem));
57-
return ((unsigned *)mem)[-1];
57+
return ((size_t *)mem)[-1];
5858
}
5959

6060
void *memalign(size_t align, size_t need) {
6161
char *res;
62-
unsigned next, next2, base, toto, *link, *link2;
62+
size_t next, next2, base, toto, *link, *link2;
6363

6464
// normalize arguments
6565
while (align & (align - 1))
6666
++align;
67-
if (need < sizeof(unsigned))
68-
need = sizeof(unsigned);
69-
if (align < sizeof(unsigned))
70-
align = sizeof(unsigned);
67+
if (need < sizeof(size_t))
68+
need = sizeof(size_t);
69+
if (align < sizeof(size_t))
70+
align = sizeof(size_t);
7171
if (align > TINYMALLOC_MAX_ALIGN)
7272
goto InvalidArgument;
73-
if (ckd_add(&need, need, sizeof(unsigned) - 1))
73+
// TODO(jart): refactor append*() to not need size_t*2 granularity
74+
if (ckd_add(&need, need, sizeof(size_t) * 2 - 1))
7475
goto OutOfMemory;
75-
need &= -sizeof(unsigned);
76+
need &= -sizeof(size_t);
7677

7778
// allocate from free list
7879
next = heap.free;
7980
link = &heap.free;
8081
while (next) {
81-
next2 = *(unsigned *)(heap.memory + next);
82-
link2 = (unsigned *)(heap.memory + next);
83-
if (need <= ((unsigned *)(heap.memory + next))[-1]) {
82+
next2 = *(size_t *)(heap.memory + next);
83+
link2 = (size_t *)(heap.memory + next);
84+
if (need <= ((size_t *)(heap.memory + next))[-1]) {
8485
*link = next2;
8586
return (void *)(heap.memory + next);
8687
}
@@ -90,15 +91,15 @@ void *memalign(size_t align, size_t need) {
9091

9192
// allocate new static memory
9293
base = heap.used;
93-
base += sizeof(unsigned);
94+
base += sizeof(size_t);
9495
base += align - 1;
9596
base &= -align;
9697
if (ckd_add(&toto, base, need))
9798
goto OutOfMemory;
9899
if (toto > TINYMALLOC_MAX_BYTES)
99100
goto OutOfMemory;
100101
res = heap.memory + base;
101-
((unsigned *)res)[-1] = need;
102+
((size_t *)res)[-1] = need;
102103
heap.used = toto;
103104
heap.last = base;
104105
return res;
@@ -118,7 +119,7 @@ void *malloc(size_t need) {
118119

119120
void *calloc(size_t count, size_t size) {
120121
char *res;
121-
unsigned need, used;
122+
size_t need, used;
122123
if (ckd_mul(&need, count, size))
123124
need = -1;
124125
used = heap.used;
@@ -130,27 +131,27 @@ void *calloc(size_t count, size_t size) {
130131

131132
void *realloc(void *ptr, size_t need) {
132133
char *res, *mem;
133-
unsigned base, have, toto;
134+
size_t base, have, toto;
134135
if (!ptr) {
135136
res = (char *)malloc(need);
136137
} else {
137138
mem = (char *)ptr;
138139
unassert(isheap(mem));
139-
have = ((unsigned *)mem)[-1];
140+
have = ((size_t *)mem)[-1];
140141
base = mem - heap.memory;
141142
if (need < have) {
142143
res = mem;
143144
} else if (base == heap.last) {
144-
if (need < sizeof(unsigned))
145-
need = sizeof(unsigned);
146-
if (ckd_add(&need, need, sizeof(unsigned) - 1))
145+
if (need < sizeof(size_t))
146+
need = sizeof(size_t);
147+
if (ckd_add(&need, need, sizeof(size_t) - 1))
147148
goto OutOfMemory;
148-
need &= -sizeof(unsigned);
149+
need &= -sizeof(size_t);
149150
if (ckd_add(&toto, base, need))
150151
goto OutOfMemory;
151152
if (toto > TINYMALLOC_MAX_BYTES)
152153
goto OutOfMemory;
153-
((unsigned *)mem)[-1] = need;
154+
((size_t *)mem)[-1] = need;
154155
heap.used = toto;
155156
res = mem;
156157
} else if ((res = (char *)malloc(need))) {

tool/build/compile.c

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -213,18 +213,20 @@ char *g_tmpout;
213213
const char *g_tmpout_original;
214214

215215
const char *const kSafeEnv[] = {
216-
"ADDR2LINE", // needed by GetAddr2linePath
217-
"HOME", // needed by ~/.runit.psk
218-
"HOMEDRIVE", // needed by ~/.runit.psk
219-
"HOMEPATH", // needed by ~/.runit.psk
220-
"MAKEFLAGS", // needed by IsRunningUnderMake
221-
"MODE", // needed by test scripts
222-
"PATH", // needed by clang
223-
"PWD", // just seems plain needed
224-
"STRACE", // useful for troubleshooting
225-
"TERM", // needed to detect colors
226-
"TMPDIR", // needed by compiler
227-
"SYSTEMROOT", // needed by socket()
216+
"ADDR2LINE", // needed by GetAddr2linePath
217+
"BUILDLOG", // used by cosmocc
218+
"HOME", // needed by ~/.runit.psk
219+
"HOMEDRIVE", // needed by ~/.runit.psk
220+
"HOMEPATH", // needed by ~/.runit.psk
221+
"KPRINTF_LOG", // used by internals
222+
"MAKEFLAGS", // needed by IsRunningUnderMake
223+
"MODE", // needed by test scripts
224+
"PATH", // needed by clang
225+
"PWD", // just seems plain needed
226+
"STRACE", // useful for troubleshooting
227+
"SYSTEMROOT", // needed by socket()
228+
"TERM", // needed to detect colors
229+
"TMPDIR", // needed by compiler
228230
};
229231

230232
#include "libc/mem/tinymalloc.inc"

0 commit comments

Comments
 (0)