diff options
author | Bryan C. Mills <bcmills@google.com> | 2017-01-19 16:09:10 -0500 |
---|---|---|
committer | Bryan Mills <bcmills@google.com> | 2017-03-08 18:58:30 +0000 |
commit | 29edf0f9feb0e7412788a20e7d8d473270cb9342 (patch) | |
tree | 79729212f998917d70ded0c35199096d3e6dd062 /src/runtime/lock_sema.go | |
parent | d71f36b5aa1eadc6cd86ada2c0d5dd621bd9fd82 (diff) | |
download | go-29edf0f9feb0e7412788a20e7d8d473270cb9342.tar.gz go-29edf0f9feb0e7412788a20e7d8d473270cb9342.zip |
runtime: poll libc to deliver signals under TSAN
fixes #18717
Change-Id: I7244463d2e7489e0b0fe3b74c4b782e71210beb2
Reviewed-on: https://go-review.googlesource.com/35494
Run-TryBot: Bryan Mills <bcmills@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Diffstat (limited to 'src/runtime/lock_sema.go')
-rw-r--r-- | src/runtime/lock_sema.go | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/src/runtime/lock_sema.go b/src/runtime/lock_sema.go index 0fa0481733..e00b99164f 100644 --- a/src/runtime/lock_sema.go +++ b/src/runtime/lock_sema.go @@ -163,7 +163,16 @@ func notesleep(n *note) { } // Queued. Sleep. gp.m.blocked = true - semasleep(-1) + if _cgo_yield == nil { + semasleep(-1) + } else { + // Sleep for an arbitrary-but-moderate interval to poll libc interceptors. + const ns = 10e6 + for atomic.Loaduintptr(&n.key) == 0 { + semasleep(ns) + asmcgocall(_cgo_yield, nil) + } + } gp.m.blocked = false } @@ -186,7 +195,16 @@ func notetsleep_internal(n *note, ns int64, gp *g, deadline int64) bool { if ns < 0 { // Queued. Sleep. gp.m.blocked = true - semasleep(-1) + if _cgo_yield == nil { + semasleep(-1) + } else { + // Sleep for an arbitrary-but-moderate interval to poll libc interceptors. + const ns = 10e6 + for atomic.Loaduintptr(&n.key) == 0 { + semasleep(ns) + asmcgocall(_cgo_yield, nil) + } + } gp.m.blocked = false return true } |