6 * The Unix libc routines cannot be trusted to do their own locking.
7 * Sad but apparently true.
9 static Lock malloclock;
13 * The Unix mallocs don't do nearly enough error checking
14 * for my tastes. We'll waste another 24 bytes per guy so that
15 * we can. This is severely antisocial, since now free and p9free
16 * are not interchangeable.
20 #define Overhead (debugmalloc ? (6*sizeof(ulong)) : 0)
21 #define MallocMagic 0xA110C09
22 #define ReallocMagic 0xB110C09
23 #define CallocMagic 0xC110C09
24 #define FreeMagic 0xF533F533
26 #define END "\x7F\x2E\x55\x23"
31 fprint(2, "bad malloc block %p\n", v);
36 mark(void *v, ulong pc, ulong n, ulong magic)
47 if(magic == FreeMagic || magic == CheckMagic){
48 u = (ulong*)((char*)v-4*sizeof(ulong));
49 if(u[0] != MallocMagic && u[0] != ReallocMagic && u[0] != CallocMagic)
53 if(memcmp(p, END, 4) != 0)
55 if(magic != CheckMagic){
57 u[1] = u[2] = u[3] = pc;
59 u[4] = u[5] = u[6] = u[7] = pc;
60 memset((char*)v+16, 0xFB, n-16);
70 if(magic == ReallocMagic)
81 setmalloctag(void *v, ulong t)
95 setrealloctag(void *v, ulong t)
104 u = mark(v, 0, 0, 0);
114 //fprint(2, "%s %d malloc\n", argv0, getpid());
116 mallocpid = getpid();
117 v = malloc(n+Overhead);
118 v = mark(v, getcallerpc(&n), n, MallocMagic);
120 //fprint(2, "%s %d donemalloc\n", argv0, getpid());
130 //fprint(2, "%s %d free\n", argv0, getpid());
132 mallocpid = getpid();
133 v = mark(v, getcallerpc(&v), 0, FreeMagic);
136 //fprint(2, "%s %d donefree\n", argv0, getpid());
140 p9calloc(ulong a, ulong b)
144 //fprint(2, "%s %d calloc\n", argv0, getpid());
146 mallocpid = getpid();
147 v = calloc(a*b+Overhead, 1);
148 v = mark(v, getcallerpc(&a), a*b, CallocMagic);
150 //fprint(2, "%s %d donecalloc\n", argv0, getpid());
155 p9realloc(void *v, ulong n)
157 //fprint(2, "%s %d realloc\n", argv0, getpid());
159 mallocpid = getpid();
160 v = mark(v, getcallerpc(&v), 0, CheckMagic);
161 v = realloc(v, n+Overhead);
162 v = mark(v, getcallerpc(&v), n, ReallocMagic);
164 //fprint(2, "%s %d donerealloc\n", argv0, getpid());