]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: consistency check for G rescan position
authorAustin Clements <austin@google.com>
Thu, 25 Aug 2016 15:50:50 +0000 (11:50 -0400)
committerAustin Clements <austin@google.com>
Tue, 20 Sep 2016 18:37:32 +0000 (18:37 +0000)
Issue #17099 shows a failure that indicates we rescanned a stack twice
concurrently during mark termination, which suggests that the rescan
list became inconsistent. Add a simple check when we dequeue something
from the rescan list that it claims to be at the index where we found
it.

Change-Id: I6a267da4154a2e7b7d430cb4056e6bae978eaf62
Reviewed-on: https://go-review.googlesource.com/29280
Run-TryBot: Austin Clements <austin@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Rick Hudson <rlh@golang.org>
src/runtime/mgcmark.go

index a4f25ac48f293dcded817f3c378ba80d214f0076..003073f42fd3f3f6227e01a5b82919ad6e3b3f2c 100644 (file)
@@ -199,6 +199,11 @@ func markroot(gcw *gcWork, i uint32) {
                        gp = allgs[i-baseStacks]
                } else if baseRescan <= i && i < end {
                        gp = work.rescan.list[i-baseRescan].ptr()
+                       if gp.gcRescan != int32(i-baseRescan) {
+                               // Looking for issue #17099.
+                               println("runtime: gp", gp, "found at rescan index", i-baseRescan, "but should be at", gp.gcRescan)
+                               throw("bad g rescan index")
+                       }
                } else {
                        throw("markroot: bad index")
                }