/*
* Copyright (C) 2013 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
public class Main {
private static final int TEST_TIME = 5;
public static void main(String[] args) {
System.out.println("Running (" + TEST_TIME + " seconds) ...");
InfiniteDoWhileLoopWithLong doWhileLoopWithLong = new InfiniteDoWhileLoopWithLong();
SimpleLoopThread[] simpleLoops = {
new InfiniteForLoop(),
new InfiniteWhileLoop(),
new InfiniteWhileLoopWithIntrinsic(),
new InfiniteDoWhileLoop(),
new MakeGarbage(),
new InfiniteWhileLoopWithSpecialReturnArgOrConst(new SpecialMethods1()),
new InfiniteWhileLoopWithSpecialReturnArgOrConst(new SpecialMethods2()),
new InfiniteWhileLoopWithSpecialPutOrNop(new SpecialMethods1()),
new InfiniteWhileLoopWithSpecialPutOrNop(new SpecialMethods2()),
new InfiniteWhileLoopWithSpecialConstOrIGet(new SpecialMethods1()),
new InfiniteWhileLoopWithSpecialConstOrIGet(new SpecialMethods2()),
new InfiniteWhileLoopWithSpecialConstOrIGetInTryCatch(new SpecialMethods1()),
new InfiniteWhileLoopWithSpecialConstOrIGetInTryCatch(new SpecialMethods2()),
};
doWhileLoopWithLong.start();
for (SimpleLoopThread loop : simpleLoops) {
loop.start();
}
for (int i = 0; i < TEST_TIME; i++) {
Runtime.getRuntime().gc();
System.out.println(".");
sleep(1000);
}
doWhileLoopWithLong.stopNow();
for (SimpleLoopThread loop : simpleLoops) {
loop.stopNow();
}
System.out.println("Done.");
}
public static void sleep(int ms) {
try {
Thread.sleep(ms);
} catch (InterruptedException ie) {
System.err.println("sleep was interrupted");
}
}
}
class SimpleLoopThread extends Thread {
volatile protected boolean keepGoing = true;
public void stopNow() {
keepGoing = false;
}
}
interface SpecialMethodInterface {
long ReturnArgOrConst(long arg);
void PutOrNop(long arg);
long ConstOrIGet();
}
class SpecialMethods1 implements SpecialMethodInterface {
public long ReturnArgOrConst(long arg) {
return 42L;
}
public void PutOrNop(long arg) {
}
public long ConstOrIGet() {
return 42L;
}
}
class SpecialMethods2 implements SpecialMethodInterface {
public long value = 42L;
public long ReturnArgOrConst(long arg) {
return arg;
}
public void PutOrNop(long arg) {
value = arg;
}
public long ConstOrIGet() {
return value;
}
}
class InfiniteWhileLoopWithSpecialReturnArgOrConst extends SimpleLoopThread {
private SpecialMethodInterface smi;
public InfiniteWhileLoopWithSpecialReturnArgOrConst(SpecialMethodInterface smi) {
this.smi = smi;
}
public void run() {
long i = 0L;
while (keepGoing) {
i += smi.ReturnArgOrConst(i);
}
}
}
class InfiniteWhileLoopWithSpecialPutOrNop extends SimpleLoopThread {
private SpecialMethodInterface smi;
public InfiniteWhileLoopWithSpecialPutOrNop(SpecialMethodInterface smi) {
this.smi = smi;
}
public void run() {
long i = 0L;
while (keepGoing) {
smi.PutOrNop(i);
i++;
}
}
}
class InfiniteWhileLoopWithSpecialConstOrIGet extends SimpleLoopThread {
private SpecialMethodInterface smi;
public InfiniteWhileLoopWithSpecialConstOrIGet(SpecialMethodInterface smi) {
this.smi = smi;
}
public void run() {
long i = 0L;
while (keepGoing) {
i += smi.ConstOrIGet();
}
}
}
class InfiniteWhileLoopWithSpecialConstOrIGetInTryCatch extends SimpleLoopThread {
private SpecialMethodInterface smi;
public InfiniteWhileLoopWithSpecialConstOrIGetInTryCatch(SpecialMethodInterface smi) {
this.smi = smi;
}
public void run() {
try {
long i = 0L;
while (keepGoing) {
i += smi.ConstOrIGet();
}
} catch (Throwable ignored) { }
}
}
class InfiniteWhileLoopWithIntrinsic extends SimpleLoopThread {
private String[] strings = { "a", "b", "c", "d" };
private int sum = 0;
public void run() {
int i = 0;
while (keepGoing) {
i++;
sum += strings[i & 3].length();
}
}
}
class InfiniteDoWhileLoopWithLong extends Thread {
volatile private long keepGoing = 7L;
public void run() {
int i = 0;
do {
i++;
} while (keepGoing >= 4L);
}
public void stopNow() {
keepGoing = 1L;
}
}
class InfiniteWhileLoop extends SimpleLoopThread {
public void run() {
int i = 0;
while (keepGoing) {
i++;
}
}
}
class InfiniteDoWhileLoop extends SimpleLoopThread {
public void run() {
int i = 0;
do {
i++;
} while (keepGoing);
}
}
class InfiniteForLoop extends SimpleLoopThread {
public void run() {
int i = 0;
for (int j = 0; keepGoing; j++) {
i += j;
}
}
}
class MakeGarbage extends SimpleLoopThread {
public void run() {
while (keepGoing) {
byte[] garbage = new byte[100000];
}
}
}