commit - c9896e2edba3bf17061447f3491a866a74e2cbb9
commit + 7e0e6522e576bc35b55a7182c23fb752cc1ec636
blob - 8654bd98ffa25355f361ca298c740c299bca4a7c
blob + 18ac25aa7383edc1e2412e43490b0e088d2e4046
--- include/libc.h
+++ include/libc.h
*/
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*);
*/
#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
#define NOPLAN9DEFINES
#include <libc.h>
+/*
+ * 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;
+}