diff options
author | gVisor bot <gvisor-bot@google.com> | 2020-02-12 04:39:12 +0000 |
---|---|---|
committer | gVisor bot <gvisor-bot@google.com> | 2020-02-12 04:39:12 +0000 |
commit | 713741162247021e3dbfc7fd8e1648b4628ac4ba (patch) | |
tree | e0c6ae28f244959a4b2f3acfc32ec90beaba8c08 /pkg/sleep | |
parent | 06dba0b8d49a8f38c5446114ce76afd57eccda93 (diff) | |
parent | 5205bc7e583f90e5a5855a69de26a0baa888cbdf (diff) |
Merge release-20200127.0-134-g5205bc7 (automated)
Diffstat (limited to 'pkg/sleep')
-rw-r--r-- | pkg/sleep/commit_noasm.go | 13 | ||||
-rw-r--r-- | pkg/sleep/sleep_unsafe.go | 23 |
2 files changed, 12 insertions, 24 deletions
diff --git a/pkg/sleep/commit_noasm.go b/pkg/sleep/commit_noasm.go index 3af447fb9..f59061f37 100644 --- a/pkg/sleep/commit_noasm.go +++ b/pkg/sleep/commit_noasm.go @@ -28,15 +28,6 @@ import "sync/atomic" // It is written in assembly because it is called from g0, so it doesn't have // a race context. func commitSleep(g uintptr, waitingG *uintptr) bool { - for { - // Check if the wait was aborted. - if atomic.LoadUintptr(waitingG) == 0 { - return false - } - - // Try to store the G so that wakers know who to wake. - if atomic.CompareAndSwapUintptr(waitingG, preparingG, g) { - return true - } - } + // Try to store the G so that wakers know who to wake. + return atomic.CompareAndSwapUintptr(waitingG, preparingG, g) } diff --git a/pkg/sleep/sleep_unsafe.go b/pkg/sleep/sleep_unsafe.go index acbf0229b..65bfcf778 100644 --- a/pkg/sleep/sleep_unsafe.go +++ b/pkg/sleep/sleep_unsafe.go @@ -299,20 +299,17 @@ func (s *Sleeper) enqueueAssertedWaker(w *Waker) { } } - for { - // Nothing to do if there isn't a G waiting. - g := atomic.LoadUintptr(&s.waitingG) - if g == 0 { - return - } + // Nothing to do if there isn't a G waiting. + if atomic.LoadUintptr(&s.waitingG) == 0 { + return + } - // Signal to the sleeper that a waker has been asserted. - if atomic.CompareAndSwapUintptr(&s.waitingG, g, 0) { - if g != preparingG { - // We managed to get a G. Wake it up. - goready(g, 0) - } - } + // Signal to the sleeper that a waker has been asserted. + switch g := atomic.SwapUintptr(&s.waitingG, 0); g { + case 0, preparingG: + default: + // We managed to get a G. Wake it up. + goready(g, 0) } } |