diff options
author | Dmitriy Vyukov <dvyukov@google.com> | 2011-07-18 10:50:04 -0400 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2011-07-18 10:50:04 -0400 |
commit | c1f035ba4c77e84bd7bc857337f5963c9b6eeab2 (patch) | |
tree | ee5cb0b981c824ee562e932bd0fd694f74a2e82e | |
parent | e8689404a7ba46acb491702fa8554c1394223325 (diff) | |
download | go-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.c | 11 |
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 |