15d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao/* 25d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * Copyright (C) 2010 The Android Open Source Project 35d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * 45d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * Licensed under the Apache License, Version 2.0 (the "License"); 55d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * you may not use this file except in compliance with the License. 65d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * You may obtain a copy of the License at 75d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * 85d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * http://www.apache.org/licenses/LICENSE-2.0 95d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * 105d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * Unless required by applicable law or agreed to in writing, software 115d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * distributed under the License is distributed on an "AS IS" BASIS, 125d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * See the License for the specific language governing permissions and 145d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * limitations under the License. 155d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao */ 165d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao 175d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao 185d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao/* 195d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * Entry point and tests that are expected to succeed. 205d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao */ 215d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhaopublic class Main { 225d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao /** 235d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * Drives tests. 245d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao */ 255d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao public static void main(String[] args) { 265d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao Main m = new Main(); 275d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao 285d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao m.recursiveSync(0); 295d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao 305d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao m.nestedMayThrow(false); 315d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao try { 325d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao m.nestedMayThrow(true); 335d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao System.err.println("nestedThrow(true) did not throw"); 345d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao } catch (MyException me) {} 355d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao System.out.println("nestedMayThrow ok"); 365d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao 375d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao m.constantLock(); 385d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao System.out.println("constantLock ok"); 395d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao 405d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao m.notExcessiveNesting(); 415d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao try { 425d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao TooDeep.excessiveNesting(); 435d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao System.err.println("excessiveNesting did not throw"); 445d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao } catch (VerifyError ve) {} 455d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao System.out.println("excessiveNesting ok"); 465d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao 475d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao m.notNested(); 485d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao System.out.println("notNested ok"); 495d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao 505d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao Object obj1 = new Object(); 515d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao Object obj2 = new Object(); 525d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao 535d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao m.twoPath(obj1, obj2, 0); 545d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao System.out.println("twoPath ok"); 555d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao 565d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao m.triplet(obj1, obj2, 0); 575d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao System.out.println("triplet ok"); 585d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao } 595d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao 605d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao /** 615d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * Recursive synchronized method. 625d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao */ 635d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized void recursiveSync(int iter) { 645d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao if (iter < 40) { 655d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao recursiveSync(iter+1); 665d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao } else { 675d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao System.out.println("recursiveSync ok"); 685d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao } 695d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao } 705d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao 715d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao /** 725d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * Tests simple nesting, with and without a throw. 735d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao */ 745d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao void nestedMayThrow(boolean doThrow) { 755d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) { 765d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (Main.class) { 775d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (new Object()) { 785d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized(Class.class) { 795d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao if (doThrow) { 805d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao throw new MyException(); 815d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao } 825d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao } 835d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao } 845d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao } 855d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao } 865d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao } 875d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao 885d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao /** 895d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * Exercises bug 3215458. 905d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao */ 915d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao void constantLock() { 925d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao Class thing = Thread.class; 935d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (Thread.class) {} 945d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao } 955d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao 965d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao /** 975d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * Confirms that we can have 32 nested monitors on one method. 985d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao */ 995d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao void notExcessiveNesting() { 1005d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) { // 1 1015d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) { // 2 1025d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) { // 3 1035d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) { // 4 1045d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) { // 5 1055d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) { // 6 1065d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) { // 7 1075d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) { // 8 1085d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) { // 9 1095d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) { // 10 1105d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) { // 11 1115d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) { // 12 1125d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) { // 13 1135d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) { // 14 1145d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) { // 15 1155d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) { // 16 1165d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) { // 17 1175d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) { // 18 1185d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) { // 19 1195d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) { // 20 1205d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) { // 21 1215d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) { // 22 1225d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) { // 23 1235d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) { // 24 1245d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) { // 25 1255d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) { // 26 1265d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) { // 27 1275d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) { // 28 1285d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) { // 29 1295d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) { // 30 1305d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) { // 31 1315d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) { // 32 1325d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} 1335d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao } 1345d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao 1355d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao /** 1365d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * Confirms that we can have more than 32 non-nested monitors in one 1375d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * method. 1385d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao */ 1395d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao void notNested() { 1405d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) {} // 1 1415d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) {} // 2 1425d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) {} // 3 1435d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) {} // 4 1445d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) {} // 5 1455d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) {} // 6 1465d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) {} // 7 1475d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) {} // 8 1485d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) {} // 9 1495d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) {} // 10 1505d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) {} // 11 1515d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) {} // 12 1525d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) {} // 13 1535d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) {} // 14 1545d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) {} // 15 1555d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) {} // 16 1565d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) {} // 17 1575d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) {} // 18 1585d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) {} // 19 1595d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) {} // 20 1605d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) {} // 21 1615d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) {} // 22 1625d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) {} // 23 1635d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) {} // 24 1645d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) {} // 25 1655d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) {} // 26 1665d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) {} // 27 1675d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) {} // 28 1685d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) {} // 29 1695d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) {} // 30 1705d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) {} // 31 1715d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) {} // 32 1725d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) {} // 33 1735d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (this) {} // 34 1745d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao } 1755d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao 1765d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao /* does nothing but ensure that the compiler doesn't discard an object */ 1775d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao private void doNothing(Object obj) {} 1785d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao 1795d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao /** 1805d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * Conditionally uses one of the synchronized objects. 1815d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao */ 1825d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao public void twoPath(Object obj1, Object obj2, int x) { 1835d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao Object localObj; 1845d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao 1855d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (obj1) { 1865d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized(obj2) { 1875d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao if (x == 0) { 1885d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao localObj = obj2; 1895d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao } else { 1905d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao localObj = obj1; 1915d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao } 1925d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao } 1935d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao } 1945d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao 1955d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao doNothing(localObj); 1965d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao } 1975d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao 1985d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao /** 1995d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * Lock the monitor two or three times, and make use of the locked or 2005d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * unlocked object. 2015d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao */ 2025d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao public void triplet(Object obj1, Object obj2, int x) { 2035d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao Object localObj; 2045d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao 2055d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized (obj1) { 2065d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized(obj1) { 2075d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao if (x == 0) { 2085d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao synchronized(obj1) { 2095d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao localObj = obj2; 2105d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao } 2115d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao } else { 2125d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao localObj = obj1; 2135d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao } 2145d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao } 2155d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao } 2165d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao 2175d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao doNothing(localObj); 2185d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao } 2195d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao} 220