• Dmitriy Vyukov's avatar
    runtime: fix spurious deadlock reporting · 56959158
    Dmitriy Vyukov authored
    Fixes #2337.
    Unfortunate sequence of events is:
    1. maxcpu=2, mcpu=1, grunning=1
    2. starttheworld creates an extra M:
       maxcpu=2, mcpu=2, grunning=1
    4. the goroutine calls runtime.GOMAXPROCS(1)
       maxcpu=1, mcpu=2, grunning=1
    5. since it sees mcpu>maxcpu, it calls gosched()
    6. schedule() deschedules the goroutine:
       maxcpu=1, mcpu=1, grunning=0
    7. schedule() call getnextandunlock() which
       fails to pick up the goroutine again,
       because canaddcpu() fails, because mcpu==maxcpu
    8. then it sees that grunning==0,
       reports deadlock and terminates
    
    R=golang-dev, rsc
    CC=golang-dev
    https://golang.org/cl/5191044
    56959158
proc.c 39.4 KB