commit 7e0e6522e576bc35b55a7182c23fb752cc1ec636 from: rsc date: Sun May 23 00:58:23 2004 UTC lock malloc ourselves commit - c9896e2edba3bf17061447f3491a866a74e2cbb9 commit + 7e0e6522e576bc35b55a7182c23fb752cc1ec636 blob - 8654bd98ffa25355f361ca298c740c299bca4a7c blob + 18ac25aa7383edc1e2412e43490b0e088d2e4046 --- include/libc.h +++ include/libc.h @@ -113,12 +113,9 @@ extern void* malloc(ulong); */ extern void* p9malloc(ulong); extern void* mallocz(ulong, int); -/* -extern void free(void*); -extern ulong msize(void*); -extern void* calloc(ulong, ulong); -extern void* realloc(void*, ulong); - */ +extern void p9free(void*); +extern void* p9calloc(ulong, ulong); +extern void* p9realloc(void*, ulong); extern void setmalloctag(void*, ulong); extern void setrealloctag(void*, ulong); extern ulong getmalloctag(void*); @@ -128,6 +125,9 @@ extern void* malloctopoolblock(void*); */ #ifndef NOPLAN9DEFINES #define malloc p9malloc +#define realloc p9realloc +#define calloc p9calloc +#define free p9free #endif /* blob - b75d2f07f5d7cbfb7a3f170591cfa14822729b59 blob + 7c5b1786cdb73da2addead06a073d744fea04580 --- src/lib9/malloc.c +++ src/lib9/malloc.c @@ -2,10 +2,57 @@ #define NOPLAN9DEFINES #include +/* + * The Unix libc routines cannot be trusted to do their own locking. + * Sad but apparently true. + */ + +static Lock malloclock; + void* p9malloc(ulong n) { + void *v; if(n == 0) n++; - return malloc(n); +//fprint(2, "%s %d malloc\n", argv0, getpid()); + lock(&malloclock); + v = malloc(n); + unlock(&malloclock); +//fprint(2, "%s %d donemalloc\n", argv0, getpid()); + return v; } + +void +p9free(void *v) +{ +//fprint(2, "%s %d free\n", argv0, getpid()); + lock(&malloclock); + free(v); + unlock(&malloclock); +//fprint(2, "%s %d donefree\n", argv0, getpid()); +} + +void* +p9calloc(ulong a, ulong b) +{ + void *v; + +//fprint(2, "%s %d calloc\n", argv0, getpid()); + lock(&malloclock); + v = calloc(a, b); + unlock(&malloclock); +//fprint(2, "%s %d donecalloc\n", argv0, getpid()); + return v; +} + +void* +p9realloc(void *v, ulong n) +{ +//fprint(2, "%s %d realloc\n", argv0, getpid()); + lock(&malloclock); + v = realloc(v, n); + unlock(&malloclock); +//fprint(2, "%s %d donerealloc\n", argv0, getpid()); + return v; +}