diff --git a/src/runtime/mstkbar.go b/src/runtime/mstkbar.go index 6f5b4598538a2cb1b47640d795456746aba15b67..1c1c2eaf0a323c37546fa0196aff2b629a198e69 100644 --- a/src/runtime/mstkbar.go +++ b/src/runtime/mstkbar.go @@ -300,16 +300,26 @@ func setNextBarrierPC(pc uintptr) { // This is necessary because a sigprof during barrier installation or // removal could observe inconsistencies between the stkbar array and // the stack itself and crash. +// +//go:nosplit func gcLockStackBarriers(gp *g) { + acquirem() for !atomic.Cas(&gp.stackLock, 0, 1) { osyield() } } +//go:nosplit func gcTryLockStackBarriers(gp *g) bool { - return atomic.Cas(&gp.stackLock, 0, 1) + mp := acquirem() + result := atomic.Cas(&gp.stackLock, 0, 1) + if !result { + releasem(mp) + } + return result } func gcUnlockStackBarriers(gp *g) { atomic.Store(&gp.stackLock, 0) + releasem(getg().m) }