mirror of
https://github.com/golang/go
synced 2024-11-18 01:04:48 -07:00
runtime: test a frameless function for async preemption
Frameless function is an interesting case for call injection espcially for LR architectures. Extend the test for this case. Change-Id: I074090d09eeaf642e71e3f44fea216f66d39b817 Reviewed-on: https://go-review.googlesource.com/c/go/+/202339 Run-TryBot: Cherry Zhang <cherryyz@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Austin Clements <austin@google.com>
This commit is contained in:
parent
a866b48e4a
commit
11db7e4469
20
src/runtime/testdata/testprog/preempt.go
vendored
20
src/runtime/testdata/testprog/preempt.go
vendored
@ -22,16 +22,23 @@ func AsyncPreempt() {
|
||||
debug.SetGCPercent(-1)
|
||||
|
||||
// Start a goroutine with no sync safe-points.
|
||||
var ready uint32
|
||||
var ready, ready2 uint32
|
||||
go func() {
|
||||
for {
|
||||
atomic.StoreUint32(&ready, 1)
|
||||
}
|
||||
}()
|
||||
// Also start one with a frameless function.
|
||||
// This is an especially interesting case for
|
||||
// LR machines.
|
||||
go func() {
|
||||
atomic.StoreUint32(&ready2, 1)
|
||||
frameless()
|
||||
}()
|
||||
|
||||
// Wait for the goroutine to stop passing through sync
|
||||
// safe-points.
|
||||
for atomic.LoadUint32(&ready) == 0 {
|
||||
for atomic.LoadUint32(&ready) == 0 || atomic.LoadUint32(&ready2) == 0 {
|
||||
runtime.Gosched()
|
||||
}
|
||||
|
||||
@ -42,3 +49,12 @@ func AsyncPreempt() {
|
||||
|
||||
println("OK")
|
||||
}
|
||||
|
||||
//go:noinline
|
||||
func frameless() {
|
||||
for i := int64(0); i < 1<<62; i++ {
|
||||
out += i
|
||||
}
|
||||
}
|
||||
|
||||
var out int64
|
||||
|
Loading…
Reference in New Issue
Block a user