xref: /aosp_15_r20/external/musl/src/malloc/mallocng/donate.c (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
1*c9945492SAndroid Build Coastguard Worker #include <stdlib.h>
2*c9945492SAndroid Build Coastguard Worker #include <stdint.h>
3*c9945492SAndroid Build Coastguard Worker #include <limits.h>
4*c9945492SAndroid Build Coastguard Worker #include <string.h>
5*c9945492SAndroid Build Coastguard Worker #include <sys/mman.h>
6*c9945492SAndroid Build Coastguard Worker #include <errno.h>
7*c9945492SAndroid Build Coastguard Worker 
8*c9945492SAndroid Build Coastguard Worker #include "meta.h"
9*c9945492SAndroid Build Coastguard Worker 
donate(unsigned char * base,size_t len)10*c9945492SAndroid Build Coastguard Worker static void donate(unsigned char *base, size_t len)
11*c9945492SAndroid Build Coastguard Worker {
12*c9945492SAndroid Build Coastguard Worker 	uintptr_t a = (uintptr_t)base;
13*c9945492SAndroid Build Coastguard Worker 	uintptr_t b = a + len;
14*c9945492SAndroid Build Coastguard Worker 	a += -a & (UNIT-1);
15*c9945492SAndroid Build Coastguard Worker 	b -= b & (UNIT-1);
16*c9945492SAndroid Build Coastguard Worker 	memset(base, 0, len);
17*c9945492SAndroid Build Coastguard Worker 	for (int sc=47; sc>0 && b>a; sc-=4) {
18*c9945492SAndroid Build Coastguard Worker 		if (b-a < (size_classes[sc]+1)*UNIT) continue;
19*c9945492SAndroid Build Coastguard Worker 		struct meta *m = alloc_meta();
20*c9945492SAndroid Build Coastguard Worker 		m->avail_mask = 0;
21*c9945492SAndroid Build Coastguard Worker 		m->freed_mask = 1;
22*c9945492SAndroid Build Coastguard Worker 		m->mem = (void *)a;
23*c9945492SAndroid Build Coastguard Worker 		m->mem->meta = m;
24*c9945492SAndroid Build Coastguard Worker 		m->last_idx = 0;
25*c9945492SAndroid Build Coastguard Worker 		m->freeable = 0;
26*c9945492SAndroid Build Coastguard Worker 		m->sizeclass = sc;
27*c9945492SAndroid Build Coastguard Worker 		m->maplen = 0;
28*c9945492SAndroid Build Coastguard Worker 		*((unsigned char *)m->mem+UNIT-4) = 0;
29*c9945492SAndroid Build Coastguard Worker 		*((unsigned char *)m->mem+UNIT-3) = 255;
30*c9945492SAndroid Build Coastguard Worker 		m->mem->storage[size_classes[sc]*UNIT-4] = 0;
31*c9945492SAndroid Build Coastguard Worker 		queue(&ctx.active[sc], m);
32*c9945492SAndroid Build Coastguard Worker 		a += (size_classes[sc]+1)*UNIT;
33*c9945492SAndroid Build Coastguard Worker 	}
34*c9945492SAndroid Build Coastguard Worker }
35*c9945492SAndroid Build Coastguard Worker 
__malloc_donate(char * start,char * end)36*c9945492SAndroid Build Coastguard Worker void __malloc_donate(char *start, char *end)
37*c9945492SAndroid Build Coastguard Worker {
38*c9945492SAndroid Build Coastguard Worker 	donate((void *)start, end-start);
39*c9945492SAndroid Build Coastguard Worker }
40