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 Workerstatic 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 Workervoid __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