1
2
3
4
5 package main
6
7 import (
8 "runtime"
9 "runtime/debug"
10 "sync/atomic"
11 )
12
13 func init() {
14 register("AsyncPreempt", AsyncPreempt)
15 }
16
17 func AsyncPreempt() {
18
19
20 runtime.GOMAXPROCS(1)
21
22 debug.SetGCPercent(-1)
23
24
25 var ready, ready2 uint32
26 go func() {
27 for {
28 atomic.StoreUint32(&ready, 1)
29 dummy()
30 dummy()
31 }
32 }()
33
34
35
36 go func() {
37 atomic.AddUint32(&ready2, 1)
38 frameless()
39 }()
40
41 go func() {
42 atomic.AddUint32(&ready2, 1)
43 for {
44 }
45 }()
46
47
48
49 for atomic.LoadUint32(&ready) == 0 || atomic.LoadUint32(&ready2) < 2 {
50 runtime.Gosched()
51 }
52
53
54
55
56 runtime.GC()
57
58 println("OK")
59 }
60
61
62 func frameless() {
63 for i := int64(0); i < 1<<62; i++ {
64 out += i * i * i * i * i * 12345
65 }
66 }
67
68 var out int64
69
70
71 func dummy() {}
72
View as plain text