From: Russ Cox Date: Fri, 15 Feb 2013 22:54:46 +0000 (-0500) Subject: undo CL 7310096 / 59da6744d66d X-Git-Tag: go1.1rc2~990 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=60526ca6d105ee5cf79ede6b964de30ceea79fd3;p=gostls13.git undo CL 7310096 / 59da6744d66d broke windows build ««« original CL description runtime: ensure forward progress of runtime.Gosched() for locked goroutines The removed code leads to the situation when M executes the same locked G again and again. Fixes #4820. R=golang-dev, rsc CC=golang-dev https://golang.org/cl/7310096 »»» TBR=dvyukov CC=golang-dev https://golang.org/cl/7343050 --- diff --git a/src/pkg/runtime/proc.c b/src/pkg/runtime/proc.c index 5c60cddf9b..f8ddf9b47e 100644 --- a/src/pkg/runtime/proc.c +++ b/src/pkg/runtime/proc.c @@ -397,6 +397,14 @@ canaddmcpu(void) static void gput(G *gp) { + M *mp; + + // If g is wired, hand it off directly. + if((mp = gp->lockedm) != nil && canaddmcpu()) { + mnextg(mp, gp); + return; + } + // If g is the idle goroutine for an m, hand it off. if(gp->idlem != nil) { if(gp->idlem->idleg != nil) { diff --git a/src/pkg/runtime/proc_test.go b/src/pkg/runtime/proc_test.go index b68599a496..927bd7b816 100644 --- a/src/pkg/runtime/proc_test.go +++ b/src/pkg/runtime/proc_test.go @@ -46,36 +46,6 @@ func TestStopTheWorldDeadlock(t *testing.T) { runtime.GOMAXPROCS(maxprocs) } -func TestYieldProgress(t *testing.T) { - testYieldProgress(t, false) -} - -func TestYieldLockedProgress(t *testing.T) { - testYieldProgress(t, true) -} - -func testYieldProgress(t *testing.T, locked bool) { - c := make(chan bool) - cack := make(chan bool) - go func() { - if locked { - runtime.LockOSThread() - } - for { - select { - case <-c: - cack <- true - break - default: - runtime.Gosched() - } - } - }() - time.Sleep(10 * time.Millisecond) - c <- true - <-cack -} - func TestYieldLocked(t *testing.T) { const N = 10 c := make(chan bool)