1*368c31abSDavid du Colombier #include <u.h> 2*368c31abSDavid du Colombier #include <libc.h> 3*368c31abSDavid du Colombier #include <venti.h> 4*368c31abSDavid du Colombier 5*368c31abSDavid du Colombier enum { 6*368c31abSDavid du Colombier IdealAlignment = 32, 7*368c31abSDavid du Colombier ChunkSize = 128*1024 8*368c31abSDavid du Colombier }; 9*368c31abSDavid du Colombier 10*368c31abSDavid du Colombier 11*368c31abSDavid du Colombier void 12*368c31abSDavid du Colombier vtfree(void *p) 13*368c31abSDavid du Colombier { 14*368c31abSDavid du Colombier if(p == 0) 15*368c31abSDavid du Colombier return; 16*368c31abSDavid du Colombier free(p); 17*368c31abSDavid du Colombier } 18*368c31abSDavid du Colombier 19*368c31abSDavid du Colombier void * 20*368c31abSDavid du Colombier vtmalloc(int size) 21*368c31abSDavid du Colombier { 22*368c31abSDavid du Colombier void *p; 23*368c31abSDavid du Colombier 24*368c31abSDavid du Colombier p = malloc(size); 25*368c31abSDavid du Colombier if(p == 0) 26*368c31abSDavid du Colombier sysfatal("vtmalloc: out of memory"); 27*368c31abSDavid du Colombier setmalloctag(p, getcallerpc(&size)); 28*368c31abSDavid du Colombier return p; 29*368c31abSDavid du Colombier } 30*368c31abSDavid du Colombier 31*368c31abSDavid du Colombier void * 32*368c31abSDavid du Colombier vtmallocz(int size) 33*368c31abSDavid du Colombier { 34*368c31abSDavid du Colombier void *p = vtmalloc(size); 35*368c31abSDavid du Colombier memset(p, 0, size); 36*368c31abSDavid du Colombier setmalloctag(p, getcallerpc(&size)); 37*368c31abSDavid du Colombier return p; 38*368c31abSDavid du Colombier } 39*368c31abSDavid du Colombier 40*368c31abSDavid du Colombier void * 41*368c31abSDavid du Colombier vtrealloc(void *p, int size) 42*368c31abSDavid du Colombier { 43*368c31abSDavid du Colombier if(p == nil) 44*368c31abSDavid du Colombier return vtmalloc(size); 45*368c31abSDavid du Colombier p = realloc(p, size); 46*368c31abSDavid du Colombier if(p == 0) 47*368c31abSDavid du Colombier sysfatal("vtMemRealloc: out of memory"); 48*368c31abSDavid du Colombier setrealloctag(p, getcallerpc(&size)); 49*368c31abSDavid du Colombier return p; 50*368c31abSDavid du Colombier } 51*368c31abSDavid du Colombier 52*368c31abSDavid du Colombier void * 53*368c31abSDavid du Colombier vtbrk(int n) 54*368c31abSDavid du Colombier { 55*368c31abSDavid du Colombier static Lock lk; 56*368c31abSDavid du Colombier static uchar *buf; 57*368c31abSDavid du Colombier static int nbuf; 58*368c31abSDavid du Colombier static int nchunk; 59*368c31abSDavid du Colombier int align, pad; 60*368c31abSDavid du Colombier void *p; 61*368c31abSDavid du Colombier 62*368c31abSDavid du Colombier if(n >= IdealAlignment) 63*368c31abSDavid du Colombier align = IdealAlignment; 64*368c31abSDavid du Colombier else if(n > 8) 65*368c31abSDavid du Colombier align = 8; 66*368c31abSDavid du Colombier else 67*368c31abSDavid du Colombier align = 4; 68*368c31abSDavid du Colombier 69*368c31abSDavid du Colombier lock(&lk); 70*368c31abSDavid du Colombier pad = (align - (ulong)buf) & (align-1); 71*368c31abSDavid du Colombier if(n + pad > nbuf) { 72*368c31abSDavid du Colombier buf = vtmallocz(ChunkSize); 73*368c31abSDavid du Colombier nbuf = ChunkSize; 74*368c31abSDavid du Colombier pad = (align - (ulong)buf) & (align-1); 75*368c31abSDavid du Colombier nchunk++; 76*368c31abSDavid du Colombier } 77*368c31abSDavid du Colombier 78*368c31abSDavid du Colombier assert(n + pad <= nbuf); 79*368c31abSDavid du Colombier 80*368c31abSDavid du Colombier p = buf + pad; 81*368c31abSDavid du Colombier buf += pad + n; 82*368c31abSDavid du Colombier nbuf -= pad + n; 83*368c31abSDavid du Colombier unlock(&lk); 84*368c31abSDavid du Colombier 85*368c31abSDavid du Colombier return p; 86*368c31abSDavid du Colombier } 87*368c31abSDavid du Colombier 88