]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: fix data race in Plan9 sysalloc
authorDmitriy Vyukov <dvyukov@google.com>
Mon, 18 Jul 2011 14:50:04 +0000 (10:50 -0400)
committerRuss Cox <rsc@golang.org>
Mon, 18 Jul 2011 14:50:04 +0000 (10:50 -0400)
Add mutex to protect brk limit.
Add mstats.sys update.

R=rsc
CC=golang-dev
https://golang.org/cl/4762045

src/pkg/runtime/plan9/mem.c

index 9dfdf2cc35867adbffc9920c13e9d30d50a1fb02..f795b2c018b6fd624ae69071cdd7342c870c48f9 100644 (file)
@@ -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