xref: /aosp_15_r20/art/test/109-suspend-check/src/Main.java (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2013 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker  *
4*795d594fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker  *
8*795d594fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker  *
10*795d594fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker  * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker  */
16*795d594fSAndroid Build Coastguard Worker 
17*795d594fSAndroid Build Coastguard Worker public class Main {
18*795d594fSAndroid Build Coastguard Worker     private static final int TEST_TIME = 5;
19*795d594fSAndroid Build Coastguard Worker 
main(String[] args)20*795d594fSAndroid Build Coastguard Worker     public static void main(String[] args) {
21*795d594fSAndroid Build Coastguard Worker         System.out.println("Running (" + TEST_TIME + " seconds) ...");
22*795d594fSAndroid Build Coastguard Worker         InfiniteDoWhileLoopWithLong doWhileLoopWithLong = new InfiniteDoWhileLoopWithLong();
23*795d594fSAndroid Build Coastguard Worker         SimpleLoopThread[] simpleLoops = {
24*795d594fSAndroid Build Coastguard Worker                 new InfiniteForLoop(),
25*795d594fSAndroid Build Coastguard Worker                 new InfiniteWhileLoop(),
26*795d594fSAndroid Build Coastguard Worker                 new InfiniteWhileLoopWithIntrinsic(),
27*795d594fSAndroid Build Coastguard Worker                 new InfiniteDoWhileLoop(),
28*795d594fSAndroid Build Coastguard Worker                 new MakeGarbage(),
29*795d594fSAndroid Build Coastguard Worker                 new InfiniteWhileLoopWithSpecialReturnArgOrConst(new SpecialMethods1()),
30*795d594fSAndroid Build Coastguard Worker                 new InfiniteWhileLoopWithSpecialReturnArgOrConst(new SpecialMethods2()),
31*795d594fSAndroid Build Coastguard Worker                 new InfiniteWhileLoopWithSpecialPutOrNop(new SpecialMethods1()),
32*795d594fSAndroid Build Coastguard Worker                 new InfiniteWhileLoopWithSpecialPutOrNop(new SpecialMethods2()),
33*795d594fSAndroid Build Coastguard Worker                 new InfiniteWhileLoopWithSpecialConstOrIGet(new SpecialMethods1()),
34*795d594fSAndroid Build Coastguard Worker                 new InfiniteWhileLoopWithSpecialConstOrIGet(new SpecialMethods2()),
35*795d594fSAndroid Build Coastguard Worker                 new InfiniteWhileLoopWithSpecialConstOrIGetInTryCatch(new SpecialMethods1()),
36*795d594fSAndroid Build Coastguard Worker                 new InfiniteWhileLoopWithSpecialConstOrIGetInTryCatch(new SpecialMethods2()),
37*795d594fSAndroid Build Coastguard Worker         };
38*795d594fSAndroid Build Coastguard Worker         doWhileLoopWithLong.start();
39*795d594fSAndroid Build Coastguard Worker         for (SimpleLoopThread loop : simpleLoops) {
40*795d594fSAndroid Build Coastguard Worker             loop.start();
41*795d594fSAndroid Build Coastguard Worker         }
42*795d594fSAndroid Build Coastguard Worker         for (int i = 0; i < TEST_TIME; i++) {
43*795d594fSAndroid Build Coastguard Worker           Runtime.getRuntime().gc();
44*795d594fSAndroid Build Coastguard Worker           System.out.println(".");
45*795d594fSAndroid Build Coastguard Worker           sleep(1000);
46*795d594fSAndroid Build Coastguard Worker         }
47*795d594fSAndroid Build Coastguard Worker         doWhileLoopWithLong.stopNow();
48*795d594fSAndroid Build Coastguard Worker         for (SimpleLoopThread loop : simpleLoops) {
49*795d594fSAndroid Build Coastguard Worker             loop.stopNow();
50*795d594fSAndroid Build Coastguard Worker         }
51*795d594fSAndroid Build Coastguard Worker         System.out.println("Done.");
52*795d594fSAndroid Build Coastguard Worker     }
53*795d594fSAndroid Build Coastguard Worker 
sleep(int ms)54*795d594fSAndroid Build Coastguard Worker     public static void sleep(int ms) {
55*795d594fSAndroid Build Coastguard Worker         try {
56*795d594fSAndroid Build Coastguard Worker             Thread.sleep(ms);
57*795d594fSAndroid Build Coastguard Worker         } catch (InterruptedException ie) {
58*795d594fSAndroid Build Coastguard Worker             System.out.println("sleep was interrupted");
59*795d594fSAndroid Build Coastguard Worker         }
60*795d594fSAndroid Build Coastguard Worker     }
61*795d594fSAndroid Build Coastguard Worker }
62*795d594fSAndroid Build Coastguard Worker 
63*795d594fSAndroid Build Coastguard Worker class SimpleLoopThread extends Thread {
64*795d594fSAndroid Build Coastguard Worker   volatile protected boolean keepGoing = true;
stopNow()65*795d594fSAndroid Build Coastguard Worker   public void stopNow() {
66*795d594fSAndroid Build Coastguard Worker     keepGoing = false;
67*795d594fSAndroid Build Coastguard Worker   }
68*795d594fSAndroid Build Coastguard Worker }
69*795d594fSAndroid Build Coastguard Worker 
70*795d594fSAndroid Build Coastguard Worker interface SpecialMethodInterface {
ReturnArgOrConst(long arg)71*795d594fSAndroid Build Coastguard Worker   long ReturnArgOrConst(long arg);
PutOrNop(long arg)72*795d594fSAndroid Build Coastguard Worker   void PutOrNop(long arg);
ConstOrIGet()73*795d594fSAndroid Build Coastguard Worker   long ConstOrIGet();
74*795d594fSAndroid Build Coastguard Worker }
75*795d594fSAndroid Build Coastguard Worker 
76*795d594fSAndroid Build Coastguard Worker class SpecialMethods1 implements SpecialMethodInterface {
ReturnArgOrConst(long arg)77*795d594fSAndroid Build Coastguard Worker   public long ReturnArgOrConst(long arg) {
78*795d594fSAndroid Build Coastguard Worker     return 42L;
79*795d594fSAndroid Build Coastguard Worker   }
PutOrNop(long arg)80*795d594fSAndroid Build Coastguard Worker   public void PutOrNop(long arg) {
81*795d594fSAndroid Build Coastguard Worker   }
ConstOrIGet()82*795d594fSAndroid Build Coastguard Worker   public long ConstOrIGet() {
83*795d594fSAndroid Build Coastguard Worker     return 42L;
84*795d594fSAndroid Build Coastguard Worker   }
85*795d594fSAndroid Build Coastguard Worker }
86*795d594fSAndroid Build Coastguard Worker 
87*795d594fSAndroid Build Coastguard Worker class SpecialMethods2 implements SpecialMethodInterface {
88*795d594fSAndroid Build Coastguard Worker   public long value = 42L;
ReturnArgOrConst(long arg)89*795d594fSAndroid Build Coastguard Worker   public long ReturnArgOrConst(long arg) {
90*795d594fSAndroid Build Coastguard Worker     return arg;
91*795d594fSAndroid Build Coastguard Worker   }
PutOrNop(long arg)92*795d594fSAndroid Build Coastguard Worker   public void PutOrNop(long arg) {
93*795d594fSAndroid Build Coastguard Worker     value = arg;
94*795d594fSAndroid Build Coastguard Worker   }
ConstOrIGet()95*795d594fSAndroid Build Coastguard Worker   public long ConstOrIGet() {
96*795d594fSAndroid Build Coastguard Worker     return value;
97*795d594fSAndroid Build Coastguard Worker   }
98*795d594fSAndroid Build Coastguard Worker }
99*795d594fSAndroid Build Coastguard Worker 
100*795d594fSAndroid Build Coastguard Worker class InfiniteWhileLoopWithSpecialReturnArgOrConst extends SimpleLoopThread {
101*795d594fSAndroid Build Coastguard Worker   private SpecialMethodInterface smi;
InfiniteWhileLoopWithSpecialReturnArgOrConst(SpecialMethodInterface smi)102*795d594fSAndroid Build Coastguard Worker   public InfiniteWhileLoopWithSpecialReturnArgOrConst(SpecialMethodInterface smi) {
103*795d594fSAndroid Build Coastguard Worker     this.smi = smi;
104*795d594fSAndroid Build Coastguard Worker   }
run()105*795d594fSAndroid Build Coastguard Worker   public void run() {
106*795d594fSAndroid Build Coastguard Worker     long i = 0L;
107*795d594fSAndroid Build Coastguard Worker     while (keepGoing) {
108*795d594fSAndroid Build Coastguard Worker       i += smi.ReturnArgOrConst(i);
109*795d594fSAndroid Build Coastguard Worker     }
110*795d594fSAndroid Build Coastguard Worker   }
111*795d594fSAndroid Build Coastguard Worker }
112*795d594fSAndroid Build Coastguard Worker 
113*795d594fSAndroid Build Coastguard Worker class InfiniteWhileLoopWithSpecialPutOrNop extends SimpleLoopThread {
114*795d594fSAndroid Build Coastguard Worker   private SpecialMethodInterface smi;
InfiniteWhileLoopWithSpecialPutOrNop(SpecialMethodInterface smi)115*795d594fSAndroid Build Coastguard Worker   public InfiniteWhileLoopWithSpecialPutOrNop(SpecialMethodInterface smi) {
116*795d594fSAndroid Build Coastguard Worker     this.smi = smi;
117*795d594fSAndroid Build Coastguard Worker   }
run()118*795d594fSAndroid Build Coastguard Worker   public void run() {
119*795d594fSAndroid Build Coastguard Worker     long i = 0L;
120*795d594fSAndroid Build Coastguard Worker     while (keepGoing) {
121*795d594fSAndroid Build Coastguard Worker       smi.PutOrNop(i);
122*795d594fSAndroid Build Coastguard Worker       i++;
123*795d594fSAndroid Build Coastguard Worker     }
124*795d594fSAndroid Build Coastguard Worker   }
125*795d594fSAndroid Build Coastguard Worker }
126*795d594fSAndroid Build Coastguard Worker 
127*795d594fSAndroid Build Coastguard Worker class InfiniteWhileLoopWithSpecialConstOrIGet extends SimpleLoopThread {
128*795d594fSAndroid Build Coastguard Worker   private SpecialMethodInterface smi;
InfiniteWhileLoopWithSpecialConstOrIGet(SpecialMethodInterface smi)129*795d594fSAndroid Build Coastguard Worker   public InfiniteWhileLoopWithSpecialConstOrIGet(SpecialMethodInterface smi) {
130*795d594fSAndroid Build Coastguard Worker     this.smi = smi;
131*795d594fSAndroid Build Coastguard Worker   }
run()132*795d594fSAndroid Build Coastguard Worker   public void run() {
133*795d594fSAndroid Build Coastguard Worker     long i = 0L;
134*795d594fSAndroid Build Coastguard Worker     while (keepGoing) {
135*795d594fSAndroid Build Coastguard Worker       i += smi.ConstOrIGet();
136*795d594fSAndroid Build Coastguard Worker     }
137*795d594fSAndroid Build Coastguard Worker   }
138*795d594fSAndroid Build Coastguard Worker }
139*795d594fSAndroid Build Coastguard Worker 
140*795d594fSAndroid Build Coastguard Worker class InfiniteWhileLoopWithSpecialConstOrIGetInTryCatch extends SimpleLoopThread {
141*795d594fSAndroid Build Coastguard Worker   private SpecialMethodInterface smi;
InfiniteWhileLoopWithSpecialConstOrIGetInTryCatch(SpecialMethodInterface smi)142*795d594fSAndroid Build Coastguard Worker   public InfiniteWhileLoopWithSpecialConstOrIGetInTryCatch(SpecialMethodInterface smi) {
143*795d594fSAndroid Build Coastguard Worker     this.smi = smi;
144*795d594fSAndroid Build Coastguard Worker   }
run()145*795d594fSAndroid Build Coastguard Worker   public void run() {
146*795d594fSAndroid Build Coastguard Worker     try {
147*795d594fSAndroid Build Coastguard Worker       long i = 0L;
148*795d594fSAndroid Build Coastguard Worker       while (keepGoing) {
149*795d594fSAndroid Build Coastguard Worker         i += smi.ConstOrIGet();
150*795d594fSAndroid Build Coastguard Worker       }
151*795d594fSAndroid Build Coastguard Worker     } catch (Throwable ignored) { }
152*795d594fSAndroid Build Coastguard Worker   }
153*795d594fSAndroid Build Coastguard Worker }
154*795d594fSAndroid Build Coastguard Worker 
155*795d594fSAndroid Build Coastguard Worker class InfiniteWhileLoopWithIntrinsic extends SimpleLoopThread {
156*795d594fSAndroid Build Coastguard Worker   private String[] strings = { "a", "b", "c", "d" };
157*795d594fSAndroid Build Coastguard Worker   private int sum = 0;
run()158*795d594fSAndroid Build Coastguard Worker   public void run() {
159*795d594fSAndroid Build Coastguard Worker     int i = 0;
160*795d594fSAndroid Build Coastguard Worker     while (keepGoing) {
161*795d594fSAndroid Build Coastguard Worker       i++;
162*795d594fSAndroid Build Coastguard Worker       sum += strings[i & 3].length();
163*795d594fSAndroid Build Coastguard Worker     }
164*795d594fSAndroid Build Coastguard Worker   }
165*795d594fSAndroid Build Coastguard Worker }
166*795d594fSAndroid Build Coastguard Worker 
167*795d594fSAndroid Build Coastguard Worker class InfiniteDoWhileLoopWithLong extends Thread {
168*795d594fSAndroid Build Coastguard Worker   volatile private long keepGoing = 7L;
run()169*795d594fSAndroid Build Coastguard Worker   public void run() {
170*795d594fSAndroid Build Coastguard Worker     int i = 0;
171*795d594fSAndroid Build Coastguard Worker     do {
172*795d594fSAndroid Build Coastguard Worker       i++;
173*795d594fSAndroid Build Coastguard Worker     } while (keepGoing >= 4L);
174*795d594fSAndroid Build Coastguard Worker   }
stopNow()175*795d594fSAndroid Build Coastguard Worker   public void stopNow() {
176*795d594fSAndroid Build Coastguard Worker     keepGoing = 1L;
177*795d594fSAndroid Build Coastguard Worker   }
178*795d594fSAndroid Build Coastguard Worker }
179*795d594fSAndroid Build Coastguard Worker 
180*795d594fSAndroid Build Coastguard Worker class InfiniteWhileLoop extends SimpleLoopThread {
run()181*795d594fSAndroid Build Coastguard Worker   public void run() {
182*795d594fSAndroid Build Coastguard Worker     int i = 0;
183*795d594fSAndroid Build Coastguard Worker     while (keepGoing) {
184*795d594fSAndroid Build Coastguard Worker       i++;
185*795d594fSAndroid Build Coastguard Worker     }
186*795d594fSAndroid Build Coastguard Worker   }
187*795d594fSAndroid Build Coastguard Worker }
188*795d594fSAndroid Build Coastguard Worker 
189*795d594fSAndroid Build Coastguard Worker class InfiniteDoWhileLoop extends SimpleLoopThread {
run()190*795d594fSAndroid Build Coastguard Worker   public void run() {
191*795d594fSAndroid Build Coastguard Worker     int i = 0;
192*795d594fSAndroid Build Coastguard Worker     do {
193*795d594fSAndroid Build Coastguard Worker       i++;
194*795d594fSAndroid Build Coastguard Worker     } while (keepGoing);
195*795d594fSAndroid Build Coastguard Worker   }
196*795d594fSAndroid Build Coastguard Worker }
197*795d594fSAndroid Build Coastguard Worker 
198*795d594fSAndroid Build Coastguard Worker class InfiniteForLoop extends SimpleLoopThread {
run()199*795d594fSAndroid Build Coastguard Worker   public void run() {
200*795d594fSAndroid Build Coastguard Worker     int i = 0;
201*795d594fSAndroid Build Coastguard Worker     for (int j = 0; keepGoing; j++) {
202*795d594fSAndroid Build Coastguard Worker       i += j;
203*795d594fSAndroid Build Coastguard Worker     }
204*795d594fSAndroid Build Coastguard Worker   }
205*795d594fSAndroid Build Coastguard Worker }
206*795d594fSAndroid Build Coastguard Worker 
207*795d594fSAndroid Build Coastguard Worker class MakeGarbage extends SimpleLoopThread {
run()208*795d594fSAndroid Build Coastguard Worker   public void run() {
209*795d594fSAndroid Build Coastguard Worker     while (keepGoing) {
210*795d594fSAndroid Build Coastguard Worker       byte[] garbage = new byte[100000];
211*795d594fSAndroid Build Coastguard Worker     }
212*795d594fSAndroid Build Coastguard Worker   }
213*795d594fSAndroid Build Coastguard Worker }
214