diff options
| author | Russ Cox <rsc@golang.org> | 2013-02-15 17:54:46 -0500 |
|---|---|---|
| committer | Russ Cox <rsc@golang.org> | 2013-02-15 17:54:46 -0500 |
| commit | 60526ca6d105ee5cf79ede6b964de30ceea79fd3 (patch) | |
| tree | b4f56cf8d9a59159b235cf160fab6d524d39b58b /src/pkg/runtime | |
| parent | c92d3552e5de31a5195aef5ff04979d61dcbf1a6 (diff) | |
| download | go-60526ca6d105ee5cf79ede6b964de30ceea79fd3.tar.xz | |
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
Diffstat (limited to 'src/pkg/runtime')
| -rw-r--r-- | src/pkg/runtime/proc.c | 8 | ||||
| -rw-r--r-- | src/pkg/runtime/proc_test.go | 30 |
2 files changed, 8 insertions, 30 deletions
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) |
