]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: make test for freezetheworld more precise
authorAustin Clements <austin@google.com>
Fri, 27 Mar 2015 20:11:11 +0000 (16:11 -0400)
committerAustin Clements <austin@google.com>
Fri, 10 Apr 2015 18:02:55 +0000 (18:02 +0000)
exitsyscallfast checks for freezetheworld, but does so only by
checking if stopwait is positive. This can also happen during
stoptheworld, which is harmless, but confusing. Shortly, it will be
important that we get to the p.status cas even if stopwait is set.

Hence, make this test more specific so it only triggers with
freezetheworld and not other uses of stopwait.

Change-Id: Ibb722cd8360c3ed5a9654482519e3ceb87a8274d
Reviewed-on: https://go-review.googlesource.com/8205
Reviewed-by: Russ Cox <rsc@golang.org>
src/runtime/proc1.go

index 3b09149260b42ea07ff378c52ea59be929ff5956..954d242b5f5ea1c8af5418abea0ab72d388ce2f6 100644 (file)
@@ -208,6 +208,10 @@ func helpgc(nproc int32) {
        unlock(&sched.lock)
 }
 
+// freezeStopWait is a large value that freezetheworld sets
+// sched.stopwait to in order to request that all Gs permanently stop.
+const freezeStopWait = 0x7fffffff
+
 // Similar to stoptheworld but best-effort and can be called several times.
 // There is no reverse operation, used during crashing.
 // This function must not lock any mutexes.
@@ -220,7 +224,7 @@ func freezetheworld() {
        // so try several times
        for i := 0; i < 5; i++ {
                // this should tell the scheduler to not start any new goroutines
-               sched.stopwait = 0x7fffffff
+               sched.stopwait = freezeStopWait
                atomicstore(&sched.gcwaiting, 1)
                // this should stop running goroutines
                if !preemptall() {
@@ -1864,7 +1868,7 @@ func exitsyscallfast() bool {
        _g_ := getg()
 
        // Freezetheworld sets stopwait but does not retake P's.
-       if sched.stopwait != 0 {
+       if sched.stopwait == freezeStopWait {
                _g_.m.mcache = nil
                _g_.m.p = nil
                return false