aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitriy Vyukov <dvyukov@google.com>2011-07-18 10:50:04 -0400
committerRuss Cox <rsc@golang.org>2011-07-18 10:50:04 -0400
commitc1f035ba4c77e84bd7bc857337f5963c9b6eeab2 (patch)
treeee5cb0b981c824ee562e932bd0fd694f74a2e82e
parente8689404a7ba46acb491702fa8554c1394223325 (diff)
downloadgo-c1f035ba4c77e84bd7bc857337f5963c9b6eeab2.tar.gz
go-c1f035ba4c77e84bd7bc857337f5963c9b6eeab2.zip
runtime: fix data race in Plan9 sysalloc
Add mutex to protect brk limit. Add mstats.sys update. R=rsc CC=golang-dev https://golang.org/cl/4762045
-rw-r--r--src/pkg/runtime/plan9/mem.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/src/pkg/runtime/plan9/mem.c b/src/pkg/runtime/plan9/mem.c
index 9dfdf2cc35..f795b2c018 100644
--- a/src/pkg/runtime/plan9/mem.c
+++ b/src/pkg/runtime/plan9/mem.c
@@ -8,6 +8,7 @@
extern byte end[];
static byte *bloc = { end };
+static Lock memlock;
enum
{
@@ -19,23 +20,31 @@ runtime·SysAlloc(uintptr nbytes)
{
uintptr bl;
+ runtime·lock(&memlock);
+ mstats.sys += nbytes;
// Plan 9 sbrk from /sys/src/libc/9sys/sbrk.c
bl = ((uintptr)bloc + Round) & ~Round;
- if(runtime·brk_((void*)(bl + nbytes)) < 0)
+ if(runtime·brk_((void*)(bl + nbytes)) < 0) {
+ runtime·unlock(&memlock);
return (void*)-1;
+ }
bloc = (byte*)bl + nbytes;
+ runtime·unlock(&memlock);
return (void*)bl;
}
void
runtime·SysFree(void *v, uintptr nbytes)
{
+ runtime·lock(&memlock);
+ mstats.sys -= nbytes;
// from tiny/mem.c
// Push pointer back if this is a free
// of the most recent SysAlloc.
nbytes += (nbytes + Round) & ~Round;
if(bloc == (byte*)v+nbytes)
bloc -= nbytes;
+ runtime·unlock(&memlock);
}
void