From 11db7e44692a2389b7e9bc2e157b363cf7be5ed8 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Sun, 20 Oct 2019 17:24:14 -0400 Subject: [PATCH] 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 TryBot-Result: Gobot Gobot Reviewed-by: Austin Clements --- src/runtime/testdata/testprog/preempt.go | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/runtime/testdata/testprog/preempt.go b/src/runtime/testdata/testprog/preempt.go index cf004fcb28..c08b29b65a 100644 --- a/src/runtime/testdata/testprog/preempt.go +++ b/src/runtime/testdata/testprog/preempt.go @@ -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