• Austin Clements's avatar
    runtime: prevent descheduling while holding rwmutex read lock · f3b5a2bc
    Austin Clements authored
    Currently only the rwmutex write lock prevents descheduling. The read
    lock does not. This leads to the following situation:
    
    1. A reader acquires the lock and gets descheduled.
    
    2. GOMAXPROCS writers attempt to acquire the lock (or at least one
    writer does, followed by readers). This blocks all of the Ps.
    
    3. There is no 3. The descheduled reader never gets to run again
    because there are no Ps, so it never releases the lock and the system
    deadlocks.
    
    Fix this by preventing descheduling while holding the read lock. This
    requires also rewriting TestParallelRWMutexReaders to always create
    enough GOMAXPROCS and to use non-blocking operations for
    synchronization.
    
    Fixes #20903.
    
    Change-Id: Ibd460663a7e5a555be5490e13b2eaaa295fac39f
    Reviewed-on: https://go-review.googlesource.com/47632
    Run-TryBot: Austin Clements <austin@google.com>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: 's avatarIan Lance Taylor <iant@golang.org>
    f3b5a2bc
rwmutex_test.go 3.73 KB