mirror of
https://github.com/golang/go.git
synced 2024-09-21 18:38:37 +00:00
runtime: make mSpanStateBox accessors nosplit
get, at least, is called from typedmemclr which must not be interruptible. These were previously nosplit by accident before CL 424395 (the only call they had was an intrinsic, so they were leaf functions, so they had no prologue). After CL 424395 they contained a call (in noinline builds), thus had a prologue, thus had a suspension point. I have no idea how we might test this. This is another motivating use case for having a nosplitrec directive in the runtime. Fixes #55156 Fixes #54779 Fixes #54906 Fixes #54907 Change-Id: I851d733d71bda7172c4c96e027657e22b499ee00 Reviewed-on: https://go-review.googlesource.com/c/go/+/431919 Reviewed-by: Cherry Mui <cherryyz@google.com> Run-TryBot: Keith Randall <khr@golang.org> Reviewed-by: Keith Randall <khr@google.com> TryBot-Result: Gopher Robot <gobot@golang.org>
This commit is contained in:
parent
2d741947d8
commit
f1b7b2fc52
@ -311,6 +311,8 @@ func reflect_typedslicecopy(elemType *_type, dst, src slice) int {
|
||||
// If the caller knows that typ has pointers, it can alternatively
|
||||
// call memclrHasPointers.
|
||||
//
|
||||
// TODO: A "go:nosplitrec" annotation would be perfect for this.
|
||||
//
|
||||
//go:nosplit
|
||||
func typedmemclr(typ *_type, ptr unsafe.Pointer) {
|
||||
if writeBarrier.needed && typ.ptrdata != 0 {
|
||||
|
@ -362,10 +362,17 @@ type mSpanStateBox struct {
|
||||
s atomic.Uint8
|
||||
}
|
||||
|
||||
// It is nosplit to match get, below.
|
||||
|
||||
//go:nosplit
|
||||
func (b *mSpanStateBox) set(s mSpanState) {
|
||||
b.s.Store(uint8(s))
|
||||
}
|
||||
|
||||
// It is nosplit because it's called indirectly by typedmemclr,
|
||||
// which must not be preempted.
|
||||
|
||||
//go:nosplit
|
||||
func (b *mSpanStateBox) get() mSpanState {
|
||||
return mSpanState(b.s.Load())
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user