aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/lock_sema.go
diff options
context:
space:
mode:
authorBryan C. Mills <bcmills@google.com>2017-01-19 16:09:10 -0500
committerBryan Mills <bcmills@google.com>2017-03-08 18:58:30 +0000
commit29edf0f9feb0e7412788a20e7d8d473270cb9342 (patch)
tree79729212f998917d70ded0c35199096d3e6dd062 /src/runtime/lock_sema.go
parentd71f36b5aa1eadc6cd86ada2c0d5dd621bd9fd82 (diff)
downloadgo-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.go22
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
}