Main.java revision 1c83cbc4a817acbd7f9abb5b29a2d418a958e6a1
17c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom/* 27c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom * Copyright (C) 2011 The Android Open Source Project 37c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom * 47c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom * Licensed under the Apache License, Version 2.0 (the "License"); 57c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom * you may not use this file except in compliance with the License. 67c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom * You may obtain a copy of the License at 77c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom * 87c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom * http://www.apache.org/licenses/LICENSE-2.0 97c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom * 107c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom * Unless required by applicable law or agreed to in writing, software 117c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom * distributed under the License is distributed on an "AS IS" BASIS, 127c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom * See the License for the specific language governing permissions and 147c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom * limitations under the License. 157c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom */ 167c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom 171c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampeimport java.lang.reflect.*; 187c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstromimport java.util.ArrayList; 197c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstromimport java.util.Arrays; 207c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstromimport java.util.Collections; 217c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstromimport java.util.HashMap; 227c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstromimport java.util.List; 237c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstromimport java.util.Map; 247c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom 257c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom// Run on host with: 267c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom// javac ThreadTest.java && java ThreadStress && rm *.class 271c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampepublic class Main implements Runnable { 287c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom 294514d3c0e69a49f5dbe19138330a2bb2aee36d63Brian Carlstrom public static final boolean DEBUG = false; 307c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom 317c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom enum Operation { 327c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom OOM(1), 33831afe4c2334f3d96df39538023f122101c89384Elliott Hughes SIGQUIT(19), 34cd74c4b3a6893c876c6e03fd99a1264249653d80Brian Carlstrom ALLOC(60), 35cd74c4b3a6893c876c6e03fd99a1264249653d80Brian Carlstrom STACKTRACE(20), 367c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom EXIT(50), 374cd121ef0cb35fced70c7d9de378277be7a727d9Elliott Hughes 384cd121ef0cb35fced70c7d9de378277be7a727d9Elliott Hughes SLEEP(25), 394cd121ef0cb35fced70c7d9de378277be7a727d9Elliott Hughes TIMED_WAIT(10), 404cd121ef0cb35fced70c7d9de378277be7a727d9Elliott Hughes WAIT(15); 417c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom 427c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom private final int frequency; 437c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom Operation(int frequency) { 447c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom this.frequency = frequency; 457c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom } 467c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom } 477c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom 487c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom public static void main(String[] args) throws Exception { 497c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom 507c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom final int numberOfThreads = 5; 517c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom final int totalOperations = 1000; 527c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom final int operationsPerThread = totalOperations/numberOfThreads; 537c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom 544cd121ef0cb35fced70c7d9de378277be7a727d9Elliott Hughes // Lock used to notify threads performing Operation.WAIT 557c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom final Object lock = new Object(); 567c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom 577c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom // Each thread is going to do operationsPerThread 587c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom // operations. The distribution of operations is determined by 597c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom // the Operation.frequency values. We fill out an Operation[] 607c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom // for each thread with the operations it is to perform. The 617c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom // Operation[] is shuffled so that there is more random 627c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom // interactions between the threads. 637c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom 647c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom // The simple-minded filling in of Operation[] based on 657c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom // Operation.frequency below won't have even have close to a 667c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom // reasonable distribution if the count of Operation 677c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom // frequencies is greater than the total number of 687c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom // operations. So here we do a quick sanity check in case 697c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom // people tweak the constants above. 707c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom int operationCount = 0; 717c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom for (Operation op : Operation.values()) { 727c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom operationCount += op.frequency; 737c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom } 747c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom if (operationCount > operationsPerThread) { 757c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom throw new AssertionError(operationCount + " > " + operationsPerThread); 767c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom } 777c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom 787c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom // Fill in the Operation[] array for each thread by laying 797c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom // down references to operation according to their desired 807c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom // frequency. 811c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampe final Main[] threadStresses = new Main[numberOfThreads]; 827c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom for (int t = 0; t < threadStresses.length; t++) { 837c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom Operation[] operations = new Operation[operationsPerThread]; 847c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom int o = 0; 857c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom LOOP: 867c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom while (true) { 877c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom for (Operation op : Operation.values()) { 887c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom for (int f = 0; f < op.frequency; f++) { 897c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom if (o == operations.length) { 907c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom break LOOP; 917c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom } 927c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom operations[o] = op; 937c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom o++; 947c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom } 957c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom } 967c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom } 977c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom // Randomize the oepration order 987c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom Collections.shuffle(Arrays.asList(operations)); 991c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampe threadStresses[t] = new Main(lock, t, operations); 1007c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom } 1017c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom 1027c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom // Enable to dump operation counds per thread to make sure its 1037c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom // sane compared to Operation.frequency 1047c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom if (DEBUG) { 1057c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom for (int t = 0; t < threadStresses.length; t++) { 1067c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom Operation[] operations = new Operation[operationsPerThread]; 1077c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom Map<Operation, Integer> distribution = new HashMap<Operation, Integer>(); 1087c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom for (Operation operation : operations) { 1097c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom Integer ops = distribution.get(operation); 1107c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom if (ops == null) { 1117c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom ops = 1; 1127c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom } else { 1137c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom ops++; 1147c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom } 1157c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom distribution.put(operation, ops); 1167c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom } 1177c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom System.out.println("Distribution for " + t); 1187c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom for (Operation op : Operation.values()) { 1197c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom System.out.println(op + " = " + distribution.get(op)); 1207c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom } 1217c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom } 1227c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom } 1237c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom 1247c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom // Create the runners for each thread. The runner Thread 1257c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom // ensures that thread that exit due to Operation.EXIT will be 1267c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom // restarted until they reach their desired 1277c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom // operationsPerThread. 1287c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom Thread[] runners = new Thread[numberOfThreads]; 1297c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom for (int r = 0; r < runners.length; r++) { 1301c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampe final Main ts = threadStresses[r]; 1315f51d4b80058236759fea1d932470a57f348c199Mathieu Chartier runners[r] = new Thread("Runner thread " + r) { 1321c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampe final Main threadStress = ts; 1337c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom public void run() { 1347c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom int id = threadStress.id; 1355f51d4b80058236759fea1d932470a57f348c199Mathieu Chartier System.out.println("Starting worker for " + id); 1367c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom while (threadStress.nextOperation < operationsPerThread) { 1375f51d4b80058236759fea1d932470a57f348c199Mathieu Chartier Thread thread = new Thread(ts, "Worker thread " + id); 1387c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom thread.start(); 1397c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom try { 1407c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom thread.join(); 1417c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom } catch (InterruptedException e) { 1427c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom } 1437c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom System.out.println("Thread exited for " + id + " with " 1447c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom + (operationsPerThread - threadStress.nextOperation) 1457c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom + " operations remaining."); 1467c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom } 1471c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampe System.out.println("Finishing worker"); 1487c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom } 1497c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom }; 1507c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom } 1517c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom 1527c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom // The notifier thread is a daemon just loops forever to wake 1537c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom // up threads in Operation.WAIT 1545f51d4b80058236759fea1d932470a57f348c199Mathieu Chartier Thread notifier = new Thread("Notifier") { 1557c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom public void run() { 1567c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom while (true) { 1577c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom synchronized (lock) { 1587c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom lock.notifyAll(); 1597c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom } 1607c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom } 1617c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom } 1627c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom }; 1637c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom notifier.setDaemon(true); 1647c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom notifier.start(); 1657c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom 1667c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom for (int r = 0; r < runners.length; r++) { 1677c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom runners[r].start(); 1687c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom } 1697c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom for (int r = 0; r < runners.length; r++) { 1707c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom runners[r].join(); 1717c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom } 1727c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom } 1737c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom 1747c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom private final Operation[] operations; 1757c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom private final Object lock; 1767c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom private final int id; 1777c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom 1787c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom private int nextOperation; 1797c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom 1801c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampe private Main(Object lock, int id, Operation[] operations) { 1817c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom this.lock = lock; 1827c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom this.id = id; 1837c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom this.operations = operations; 1847c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom } 1857c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom 1867c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom public void run() { 1877c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom try { 1887c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom if (DEBUG) { 1897c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom System.out.println("Starting ThreadStress " + id); 1907c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom } 1917c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom while (nextOperation < operations.length) { 1927c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom Operation operation = operations[nextOperation]; 1937c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom if (DEBUG) { 1947c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom System.out.println("ThreadStress " + id 1957c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom + " operation " + nextOperation 1967c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom + " is " + operation); 1977c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom } 1987c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom nextOperation++; 1997c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom switch (operation) { 2007c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom case EXIT: { 2017c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom return; 2027c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom } 203831afe4c2334f3d96df39538023f122101c89384Elliott Hughes case SIGQUIT: { 204831afe4c2334f3d96df39538023f122101c89384Elliott Hughes try { 2051c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampe SIGQUIT(); 2061c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampe } catch (Exception ex) { 207831afe4c2334f3d96df39538023f122101c89384Elliott Hughes } 208831afe4c2334f3d96df39538023f122101c89384Elliott Hughes } 2094cd121ef0cb35fced70c7d9de378277be7a727d9Elliott Hughes case SLEEP: { 2104cd121ef0cb35fced70c7d9de378277be7a727d9Elliott Hughes try { 2114cd121ef0cb35fced70c7d9de378277be7a727d9Elliott Hughes Thread.sleep(100); 2124cd121ef0cb35fced70c7d9de378277be7a727d9Elliott Hughes } catch (InterruptedException ignored) { 2134cd121ef0cb35fced70c7d9de378277be7a727d9Elliott Hughes } 2144cd121ef0cb35fced70c7d9de378277be7a727d9Elliott Hughes } 2154cd121ef0cb35fced70c7d9de378277be7a727d9Elliott Hughes case TIMED_WAIT: { 2164cd121ef0cb35fced70c7d9de378277be7a727d9Elliott Hughes synchronized (lock) { 2174cd121ef0cb35fced70c7d9de378277be7a727d9Elliott Hughes try { 2184cd121ef0cb35fced70c7d9de378277be7a727d9Elliott Hughes lock.wait(100, 0); 2194cd121ef0cb35fced70c7d9de378277be7a727d9Elliott Hughes } catch (InterruptedException ignored) { 2204cd121ef0cb35fced70c7d9de378277be7a727d9Elliott Hughes } 2214cd121ef0cb35fced70c7d9de378277be7a727d9Elliott Hughes } 2224cd121ef0cb35fced70c7d9de378277be7a727d9Elliott Hughes break; 2234cd121ef0cb35fced70c7d9de378277be7a727d9Elliott Hughes } 2247c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom case WAIT: { 2257c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom synchronized (lock) { 2267c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom try { 2277c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom lock.wait(); 2284cd121ef0cb35fced70c7d9de378277be7a727d9Elliott Hughes } catch (InterruptedException ignored) { 2297c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom } 2307c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom } 2317c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom break; 2327c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom } 2337c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom case OOM: { 2347c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom try { 2357c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom List<byte[]> l = new ArrayList<byte[]>(); 2367c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom while (true) { 2377c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom l.add(new byte[1024]); 2387c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom } 2397c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom } catch (OutOfMemoryError e) { 2407c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom } 2417c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom break; 2427c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom } 2437c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom case ALLOC: { 2444514d3c0e69a49f5dbe19138330a2bb2aee36d63Brian Carlstrom try { 2454514d3c0e69a49f5dbe19138330a2bb2aee36d63Brian Carlstrom List<byte[]> l = new ArrayList<byte[]>(); 2464514d3c0e69a49f5dbe19138330a2bb2aee36d63Brian Carlstrom for (int i = 0; i < 1024; i++) { 2474514d3c0e69a49f5dbe19138330a2bb2aee36d63Brian Carlstrom l.add(new byte[1024]); 2484514d3c0e69a49f5dbe19138330a2bb2aee36d63Brian Carlstrom } 2494514d3c0e69a49f5dbe19138330a2bb2aee36d63Brian Carlstrom } catch (OutOfMemoryError e) { 2507c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom } 2517c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom break; 2527c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom } 253cd74c4b3a6893c876c6e03fd99a1264249653d80Brian Carlstrom case STACKTRACE: { 254cd74c4b3a6893c876c6e03fd99a1264249653d80Brian Carlstrom Thread.currentThread().getStackTrace(); 255cd74c4b3a6893c876c6e03fd99a1264249653d80Brian Carlstrom break; 256cd74c4b3a6893c876c6e03fd99a1264249653d80Brian Carlstrom } 2577c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom default: { 2587c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom throw new AssertionError(operation.toString()); 2597c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom } 2607c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom } 2617c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom } 2624514d3c0e69a49f5dbe19138330a2bb2aee36d63Brian Carlstrom } finally { 2637c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom if (DEBUG) { 2647c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom System.out.println("Finishing ThreadStress for " + id); 2657c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom } 2667c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom } 2677c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom } 2681c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampe 2691c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampe private static void SIGQUIT() throws Exception { 2701c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampe Class<?> osClass = Class.forName("android.system.Os"); 2711c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampe Method getpid = osClass.getDeclaredMethod("getpid"); 2721c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampe int pid = (Integer)getpid.invoke(null); 2731c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampe 2741c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampe Class<?> osConstants = Class.forName("android.system.OsConstants"); 2751c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampe Field sigquitField = osConstants.getDeclaredField("SIGQUIT"); 2761c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampe int sigquit = (Integer)sigquitField.get(null); 2771c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampe 2781c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampe Method kill = osClass.getDeclaredMethod("kill", int.class, int.class); 2791c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampe kill.invoke(null, pid, sigquit); 2801c83cbc4a817acbd7f9abb5b29a2d418a958e6a1Andreas Gampe } 2817c6deaa3382f1f4fb0f591af206f03045c6e9004Brian Carlstrom} 282