git: 9front

Download patch

ref: 5ae3e5fb1d711b69384695eb59c5e0d384f0441f
parent: f79711bd92c2798660c40f71469a1d3be333b6ca
author: cinap_lenrek <cinap_lenrek@gmx.de>
date: Sun Mar 10 20:55:26 EDT 2013

ape/malloc: make malloc and free threadsafe for python

--- a/sys/src/ape/lib/ap/plan9/malloc.c
+++ b/sys/src/ape/lib/ap/plan9/malloc.c
@@ -1,6 +1,8 @@
 #include <stdlib.h>
 #include <string.h>
 
+#include <lock.h>
+
 typedef unsigned int	uint;
 
 enum
@@ -24,6 +26,7 @@
 struct Arena
 {
 	Bucket	*btab[MAX2SIZE];	
+	Lock;
 };
 static Arena arena;
 
@@ -47,16 +50,19 @@
 	return nil;
 good:
 	/* Allocate off this list */
+	lock(&arena);
 	bp = arena.btab[pow];
 	if(bp) {
 		arena.btab[pow] = bp->next;
+		unlock(&arena);
 
 		if(bp->magic != 0)
 			abort();
 
 		bp->magic = MAGIC;
-		return  bp->data;
+		return bp->data;
 	}
+
 	size = sizeof(Bucket)+(1<<pow);
 	size += 7;
 	size &= ~7;
@@ -64,8 +70,10 @@
 	if(pow < CUTOFF) {
 		n = (CUTOFF-pow)+2;
 		bp = sbrk(size*n);
-		if((int)bp < 0)
+		if((int)bp < 0){
+			unlock(&arena);
 			return nil;
+		}
 
 		next = (uint)bp+size;
 		nbp = (Bucket*)next;
@@ -80,9 +88,12 @@
 	}
 	else {
 		bp = sbrk(size);
-		if((int)bp < 0)
+		if((int)bp < 0){
+			unlock(&arena);
 			return nil;
+		}
 	}
+	unlock(&arena);
 		
 	bp->size = pow;
 	bp->magic = MAGIC;
@@ -106,8 +117,10 @@
 
 	bp->magic = 0;
 	l = &arena.btab[bp->size];
+	lock(&arena);
 	bp->next = *l;
 	*l = bp;
+	unlock(&arena);
 }
 
 void*
--