]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: fix data race in GC
authorDmitriy Vyukov <dvyukov@google.com>
Wed, 15 Jan 2014 15:38:08 +0000 (19:38 +0400)
committerDmitriy Vyukov <dvyukov@google.com>
Wed, 15 Jan 2014 15:38:08 +0000 (19:38 +0400)
Fixes #5139.
Update #7065.

R=golang-codereviews, bradfitz, minux.ma
CC=golang-codereviews
https://golang.org/cl/52090045

src/pkg/runtime/mgc0.c

index af4ba42a620677681a5f6e0d67ca1fed427dcf11..5d38db27ba7d9f4f6e7dd34736b718a32c1a24db 100644 (file)
@@ -1956,6 +1956,8 @@ runtime·memorydump(void)
 void
 runtime·gchelper(void)
 {
+       int32 nproc;
+
        gchelperstart();
 
        // parallel mark for over gc roots
@@ -1972,7 +1974,8 @@ runtime·gchelper(void)
 
        runtime·parfordo(work.sweepfor);
        bufferList[m->helpgc].busy = 0;
-       if(runtime·xadd(&work.ndone, +1) == work.nproc-1)
+       nproc = work.nproc;  // work.nproc can change right after we increment work.ndone
+       if(runtime·xadd(&work.ndone, +1) == nproc-1)
                runtime·notewakeup(&work.alldone);
 }