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