]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: relax TestAsyncPreempt
authorCherry Zhang <cherryyz@google.com>
Tue, 19 Nov 2019 21:04:32 +0000 (16:04 -0500)
committerCherry Zhang <cherryyz@google.com>
Thu, 21 Nov 2019 16:56:47 +0000 (16:56 +0000)
In TestAsyncPreempt, the function being tested for preemption,
although still asynchronously preemptible, may have only samll
ranges of PCs that are preemtible. In an unlucky run, it may
take quite a while to have a signal that lands on a preemptible
instruction. The test case is kind of an extreme. Relax it to
make it more preemptible.

In the original version, the first closure has more work to do,
and it is not a leaf function, and the second test case is a
frameless leaf function. In the current version, the first one
is also a frameless leaf function (the atomic is intrinsified).
Add some calls to it. It is still not preemptible without async
preemption.

Fixes #35608.

Change-Id: Ia4f857f2afc55501c6568d7507b517e3b4db191c
Reviewed-on: https://go-review.googlesource.com/c/go/+/208221
Run-TryBot: Cherry Zhang <cherryyz@google.com>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/runtime/testdata/testprog/preempt.go

index c08b29b65a5230c4e6c42cc6875978360d7ba0c6..1454095cde470ef55646e989aeac0e24d65c2698 100644 (file)
@@ -26,6 +26,8 @@ func AsyncPreempt() {
        go func() {
                for {
                        atomic.StoreUint32(&ready, 1)
+                       dummy()
+                       dummy()
                }
        }()
        // Also start one with a frameless function.
@@ -53,8 +55,11 @@ func AsyncPreempt() {
 //go:noinline
 func frameless() {
        for i := int64(0); i < 1<<62; i++ {
-               out += i
+               out += i * i * i * i * i * 12345
        }
 }
 
 var out int64
+
+//go:noinline
+func dummy() {}