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*
--
⑨