diff options
author | Rhys Hiltner <rhys@justin.tv> | 2019-11-08 10:30:24 -0800 |
---|---|---|
committer | Brad Fitzpatrick <bradfitz@golang.org> | 2019-11-09 19:31:32 +0000 |
commit | 7148478f1b433caa11c8827657ee1bc61f0b1c5d (patch) | |
tree | f5c52805a13b0ba7285133891b22d5424aa059cc /src/runtime/export_test.go | |
parent | 6e111956ab4849976f9dcf46ecac575fa8105268 (diff) | |
download | go-7148478f1b433caa11c8827657ee1bc61f0b1c5d.tar.gz go-7148478f1b433caa11c8827657ee1bc61f0b1c5d.zip |
sync: yield to the waiter when unlocking a starving mutex
When we have already assigned the semaphore ticket to a specific
waiter, we want to get the waiter running as fast as possible since
no other G waiting on the semaphore can acquire it optimistically.
The net effect is that, when a sync.Mutex is contended, the code in
the critical section guarded by the Mutex gets a priority boost.
Fixes #33747
The original work was done in CL 200577 by Carlo Alberto Ferraris. The
change was reverted in CL 205817 because it broke the linux-arm64-packet
and solaris-amd64-oraclerel builders.
Change-Id: I76d79b1d63fd206ed1c57fe6900cb7ae9e4d46cb
Reviewed-on: https://go-review.googlesource.com/c/go/+/206180
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Diffstat (limited to 'src/runtime/export_test.go')
-rw-r--r-- | src/runtime/export_test.go | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/src/runtime/export_test.go b/src/runtime/export_test.go index d3ebd893cb..ef977b302e 100644 --- a/src/runtime/export_test.go +++ b/src/runtime/export_test.go @@ -900,3 +900,11 @@ func PageCachePagesLeaked() (leaked uintptr) { startTheWorld() return } + +var Semacquire = semacquire +var Semrelease1 = semrelease1 + +func SemNwait(addr *uint32) uint32 { + root := semroot(addr) + return atomic.Load(&root.nwait) +} |