mirror of https://github.com/golang/go.git
runtime: convert extram and extraMWaiters to internal atomic type
Updates #53821 Change-Id: Id579b2f8e48dfbe9f37e02d2fa8c94354f9887a4 Reviewed-on: https://go-review.googlesource.com/c/go/+/425480 Reviewed-by: Michael Knyszek <mknyszek@google.com> Reviewed-by: Michael Pratt <mpratt@google.com> Run-TryBot: hopehook <hopehook@golangcn.org> Auto-Submit: Michael Pratt <mpratt@google.com> TryBot-Result: Gopher Robot <gobot@golang.org>
This commit is contained in:
parent
3486735bf2
commit
5634629f0b
|
|
@ -86,7 +86,6 @@ package runtime
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"internal/goarch"
|
"internal/goarch"
|
||||||
"runtime/internal/atomic"
|
|
||||||
"runtime/internal/sys"
|
"runtime/internal/sys"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
)
|
)
|
||||||
|
|
@ -259,7 +258,7 @@ func cgocallbackg1(fn, frame unsafe.Pointer, ctxt uintptr) {
|
||||||
// We must still stay on the same m.
|
// We must still stay on the same m.
|
||||||
defer unlockOSThread()
|
defer unlockOSThread()
|
||||||
|
|
||||||
if gp.m.needextram || atomic.Load(&extraMWaiters) > 0 {
|
if gp.m.needextram || extraMWaiters.Load() > 0 {
|
||||||
gp.m.needextram = false
|
gp.m.needextram = false
|
||||||
systemstack(newextram)
|
systemstack(newextram)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1878,7 +1878,7 @@ var earlycgocallback = []byte("fatal error: cgo callback before cgo call\n")
|
||||||
// It is called with a working local m, so that it can do things
|
// It is called with a working local m, so that it can do things
|
||||||
// like call schedlock and allocate.
|
// like call schedlock and allocate.
|
||||||
func newextram() {
|
func newextram() {
|
||||||
c := atomic.Xchg(&extraMWaiters, 0)
|
c := extraMWaiters.Swap(0)
|
||||||
if c > 0 {
|
if c > 0 {
|
||||||
for i := uint32(0); i < c; i++ {
|
for i := uint32(0); i < c; i++ {
|
||||||
oneNewExtraM()
|
oneNewExtraM()
|
||||||
|
|
@ -1999,9 +1999,9 @@ func getm() uintptr {
|
||||||
return uintptr(unsafe.Pointer(getg().m))
|
return uintptr(unsafe.Pointer(getg().m))
|
||||||
}
|
}
|
||||||
|
|
||||||
var extram uintptr
|
var extram atomic.Uintptr
|
||||||
var extraMCount uint32 // Protected by lockextra
|
var extraMCount uint32 // Protected by lockextra
|
||||||
var extraMWaiters uint32
|
var extraMWaiters atomic.Uint32
|
||||||
|
|
||||||
// lockextra locks the extra list and returns the list head.
|
// lockextra locks the extra list and returns the list head.
|
||||||
// The caller must unlock the list by storing a new list head
|
// The caller must unlock the list by storing a new list head
|
||||||
|
|
@ -2015,7 +2015,7 @@ func lockextra(nilokay bool) *m {
|
||||||
|
|
||||||
incr := false
|
incr := false
|
||||||
for {
|
for {
|
||||||
old := atomic.Loaduintptr(&extram)
|
old := extram.Load()
|
||||||
if old == locked {
|
if old == locked {
|
||||||
osyield_no_g()
|
osyield_no_g()
|
||||||
continue
|
continue
|
||||||
|
|
@ -2025,13 +2025,13 @@ func lockextra(nilokay bool) *m {
|
||||||
// Add 1 to the number of threads
|
// Add 1 to the number of threads
|
||||||
// waiting for an M.
|
// waiting for an M.
|
||||||
// This is cleared by newextram.
|
// This is cleared by newextram.
|
||||||
atomic.Xadd(&extraMWaiters, 1)
|
extraMWaiters.Add(1)
|
||||||
incr = true
|
incr = true
|
||||||
}
|
}
|
||||||
usleep_no_g(1)
|
usleep_no_g(1)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if atomic.Casuintptr(&extram, old, locked) {
|
if extram.CompareAndSwap(old, locked) {
|
||||||
return (*m)(unsafe.Pointer(old))
|
return (*m)(unsafe.Pointer(old))
|
||||||
}
|
}
|
||||||
osyield_no_g()
|
osyield_no_g()
|
||||||
|
|
@ -2041,7 +2041,7 @@ func lockextra(nilokay bool) *m {
|
||||||
|
|
||||||
//go:nosplit
|
//go:nosplit
|
||||||
func unlockextra(mp *m) {
|
func unlockextra(mp *m) {
|
||||||
atomic.Storeuintptr(&extram, uintptr(unsafe.Pointer(mp)))
|
extram.Store(uintptr(unsafe.Pointer(mp)))
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue