]> Cypherpunks repositories - gostls13.git/commit
runtime: hold worldsema while starting the world
authorAustin Clements <austin@google.com>
Fri, 15 May 2015 20:13:14 +0000 (16:13 -0400)
committerAustin Clements <austin@google.com>
Mon, 18 May 2015 14:55:37 +0000 (14:55 +0000)
commit277acca286e47fd704aae10d030c74927ba2a8d2
treefc8af902e269114084b1c83bcb1579c7dfc98ede
parent9c44a41dd56660b7685da61bf1efb00cc7c1e198
runtime: hold worldsema while starting the world

Currently, startTheWorld releases worldsema before starting the
world. Since startTheWorld can change gomaxprocs after allowing Ps to
run, this means that gomaxprocs can change while another P holds
worldsema.

Unfortunately, the garbage collector and forEachP assume that holding
worldsema protects against changes in gomaxprocs (which it *almost*
does). In particular, this is causing somewhat frequent "P did not run
fn" crashes in forEachP in the runtime tests because gomaxprocs is
changing between the several loops that forEachP does over all the Ps.

Fix this by only releasing worldsema after the world is started.

This relates to issue #10618. forEachP still fails under stress
testing, but much less frequently.

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