mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
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. This is https://golang.org/cl/7310096 but with return instead of break in the nested switch. Fixes #4820. R=golang-dev, alex.brainman, rsc CC=golang-dev https://golang.org/cl/7304102
This commit is contained in:
parent
92ab6fb4e1
commit
a92e11a256
2 changed files with 30 additions and 8 deletions
|
|
@ -46,6 +46,36 @@ 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
|
||||
return
|
||||
default:
|
||||
runtime.Gosched()
|
||||
}
|
||||
}
|
||||
}()
|
||||
time.Sleep(10 * time.Millisecond)
|
||||
c <- true
|
||||
<-cack
|
||||
}
|
||||
|
||||
func TestYieldLocked(t *testing.T) {
|
||||
const N = 10
|
||||
c := make(chan bool)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue