]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: test a frameless function for async preemption
authorCherry Zhang <cherryyz@google.com>
Sun, 20 Oct 2019 21:24:14 +0000 (17:24 -0400)
committerCherry Zhang <cherryyz@google.com>
Tue, 5 Nov 2019 03:42:00 +0000 (03:42 +0000)
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>
src/runtime/testdata/testprog/preempt.go

index cf004fcb28763b6c8d0650211a54c5cf9371de7b..c08b29b65a5230c4e6c42cc6875978360d7ba0c6 100644 (file)
@@ -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