Commit Diff


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 <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;
+}