Skip to content

Commit

Permalink
runtime: make test for freezetheworld more precise
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
aclements committed Apr 10, 2015
1 parent 253ad67 commit 7c37249
Showing 1 changed file with 6 additions and 2 deletions.
8 changes: 6 additions & 2 deletions src/runtime/proc1.go
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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() {
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 7c37249

Please sign in to comment.