summaryrefslogtreecommitdiffhomepage
path: root/third_party
diff options
context:
space:
mode:
Diffstat (limited to 'third_party')
-rw-r--r--third_party/gvsync/BUILD4
-rw-r--r--third_party/gvsync/downgradable_rwmutex_1_12_unsafe.go21
-rw-r--r--third_party/gvsync/downgradable_rwmutex_1_13_unsafe.go16
-rw-r--r--third_party/gvsync/downgradable_rwmutex_unsafe.go20
-rw-r--r--third_party/gvsync/memmove_unsafe.go13
5 files changed, 61 insertions, 13 deletions
diff --git a/third_party/gvsync/BUILD b/third_party/gvsync/BUILD
index 4764eaa83..04a1fbeba 100644
--- a/third_party/gvsync/BUILD
+++ b/third_party/gvsync/BUILD
@@ -5,6 +5,8 @@ package(
licenses = ["notice"],
)
+exports_files(["LICENSE"])
+
load("//tools/go_generics:defs.bzl", "go_template")
go_template(
@@ -29,6 +31,8 @@ go_template(
go_library(
name = "gvsync",
srcs = [
+ "downgradable_rwmutex_1_12_unsafe.go",
+ "downgradable_rwmutex_1_13_unsafe.go",
"downgradable_rwmutex_unsafe.go",
"gvsync.go",
"memmove_unsafe.go",
diff --git a/third_party/gvsync/downgradable_rwmutex_1_12_unsafe.go b/third_party/gvsync/downgradable_rwmutex_1_12_unsafe.go
new file mode 100644
index 000000000..855b2a2b1
--- /dev/null
+++ b/third_party/gvsync/downgradable_rwmutex_1_12_unsafe.go
@@ -0,0 +1,21 @@
+// Copyright 2009 The Go Authors. All rights reserved.
+// Copyright 2019 The gVisor Authors.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build go1.12
+// +build !go1.13
+
+// TODO(b/133868570): Delete once Go 1.12 is no longer supported.
+
+package gvsync
+
+import _ "unsafe"
+
+//go:linkname runtimeSemrelease112 sync.runtime_Semrelease
+func runtimeSemrelease112(s *uint32, handoff bool)
+
+func runtimeSemrelease(s *uint32, handoff bool, skipframes int) {
+ // 'skipframes' is only available starting from 1.13.
+ runtimeSemrelease112(s, handoff)
+}
diff --git a/third_party/gvsync/downgradable_rwmutex_1_13_unsafe.go b/third_party/gvsync/downgradable_rwmutex_1_13_unsafe.go
new file mode 100644
index 000000000..8baec5458
--- /dev/null
+++ b/third_party/gvsync/downgradable_rwmutex_1_13_unsafe.go
@@ -0,0 +1,16 @@
+// Copyright 2009 The Go Authors. All rights reserved.
+// Copyright 2019 The gVisor Authors.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build go1.13
+// +build !go1.14
+
+// Check go:linkname function signatures when updating Go version.
+
+package gvsync
+
+import _ "unsafe"
+
+//go:linkname runtimeSemrelease sync.runtime_Semrelease
+func runtimeSemrelease(s *uint32, handoff bool, skipframes int)
diff --git a/third_party/gvsync/downgradable_rwmutex_unsafe.go b/third_party/gvsync/downgradable_rwmutex_unsafe.go
index 4d43eb765..069939033 100644
--- a/third_party/gvsync/downgradable_rwmutex_unsafe.go
+++ b/third_party/gvsync/downgradable_rwmutex_unsafe.go
@@ -3,6 +3,11 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
+// +build go1.12
+// +build !go1.14
+
+// Check go:linkname function signatures when updating Go version.
+
// This is mostly copied from the standard library's sync/rwmutex.go.
//
// Happens-before relationships indicated to the race detector:
@@ -19,6 +24,9 @@ import (
"unsafe"
)
+//go:linkname runtimeSemacquire sync.runtime_Semacquire
+func runtimeSemacquire(s *uint32)
+
// DowngradableRWMutex is identical to sync.RWMutex, but adds the DowngradeLock
// method.
type DowngradableRWMutex struct {
@@ -62,7 +70,7 @@ func (rw *DowngradableRWMutex) RUnlock() {
// A writer is pending.
if atomic.AddInt32(&rw.readerWait, -1) == 0 {
// The last reader unblocks the writer.
- runtimeSemrelease(&rw.writerSem, false)
+ runtimeSemrelease(&rw.writerSem, false, 0)
}
}
if RaceEnabled {
@@ -103,7 +111,7 @@ func (rw *DowngradableRWMutex) Unlock() {
}
// Unblock blocked readers, if any.
for i := 0; i < int(r); i++ {
- runtimeSemrelease(&rw.readerSem, false)
+ runtimeSemrelease(&rw.readerSem, false, 0)
}
// Allow other writers to proceed.
rw.w.Unlock()
@@ -126,7 +134,7 @@ func (rw *DowngradableRWMutex) DowngradeLock() {
// Unblock blocked readers, if any. Note that this loop starts as 1 since r
// includes this goroutine.
for i := 1; i < int(r); i++ {
- runtimeSemrelease(&rw.readerSem, false)
+ runtimeSemrelease(&rw.readerSem, false, 0)
}
// Allow other writers to proceed to rw.w.Lock(). Note that they will still
// block on rw.writerSem since at least this reader exists, such that
@@ -136,9 +144,3 @@ func (rw *DowngradableRWMutex) DowngradeLock() {
RaceEnable()
}
}
-
-//go:linkname runtimeSemacquire sync.runtime_Semacquire
-func runtimeSemacquire(s *uint32)
-
-//go:linkname runtimeSemrelease sync.runtime_Semrelease
-func runtimeSemrelease(s *uint32, handoff bool)
diff --git a/third_party/gvsync/memmove_unsafe.go b/third_party/gvsync/memmove_unsafe.go
index 4c8aa9ab6..84b69f215 100644
--- a/third_party/gvsync/memmove_unsafe.go
+++ b/third_party/gvsync/memmove_unsafe.go
@@ -3,12 +3,21 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
+// +build go1.12
+// +build !go1.14
+
+// Check go:linkname function signatures when updating Go version.
+
package gvsync
import (
"unsafe"
)
+//go:linkname memmove runtime.memmove
+//go:noescape
+func memmove(to, from unsafe.Pointer, n uintptr)
+
// Memmove is exported for SeqAtomicLoad/SeqAtomicTryLoad<T>, which can't
// define it because go_generics can't update the go:linkname annotation.
// Furthermore, go:linkname silently doesn't work if the local name is exported
@@ -17,7 +26,3 @@ import (
func Memmove(to, from unsafe.Pointer, n uintptr) {
memmove(to, from, n)
}
-
-//go:linkname memmove runtime.memmove
-//go:noescape
-func memmove(to, from unsafe.Pointer, n uintptr)