13f64a024dec2c080b9abde74502826b29263152aAndy McFadden/* 23f64a024dec2c080b9abde74502826b29263152aAndy McFadden * Copyright (C) 2010 The Android Open Source Project 33f64a024dec2c080b9abde74502826b29263152aAndy McFadden * 43f64a024dec2c080b9abde74502826b29263152aAndy McFadden * Licensed under the Apache License, Version 2.0 (the "License"); 53f64a024dec2c080b9abde74502826b29263152aAndy McFadden * you may not use this file except in compliance with the License. 63f64a024dec2c080b9abde74502826b29263152aAndy McFadden * You may obtain a copy of the License at 73f64a024dec2c080b9abde74502826b29263152aAndy McFadden * 83f64a024dec2c080b9abde74502826b29263152aAndy McFadden * http://www.apache.org/licenses/LICENSE-2.0 93f64a024dec2c080b9abde74502826b29263152aAndy McFadden * 103f64a024dec2c080b9abde74502826b29263152aAndy McFadden * Unless required by applicable law or agreed to in writing, software 113f64a024dec2c080b9abde74502826b29263152aAndy McFadden * distributed under the License is distributed on an "AS IS" BASIS, 123f64a024dec2c080b9abde74502826b29263152aAndy McFadden * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133f64a024dec2c080b9abde74502826b29263152aAndy McFadden * See the License for the specific language governing permissions and 143f64a024dec2c080b9abde74502826b29263152aAndy McFadden * limitations under the License. 153f64a024dec2c080b9abde74502826b29263152aAndy McFadden */ 163f64a024dec2c080b9abde74502826b29263152aAndy McFadden 173f64a024dec2c080b9abde74502826b29263152aAndy McFadden 183f64a024dec2c080b9abde74502826b29263152aAndy McFadden/* 193f64a024dec2c080b9abde74502826b29263152aAndy McFadden * Entry point and tests that are expected to succeed. 203f64a024dec2c080b9abde74502826b29263152aAndy McFadden */ 213f64a024dec2c080b9abde74502826b29263152aAndy McFaddenpublic class Main { 223f64a024dec2c080b9abde74502826b29263152aAndy McFadden /** 233f64a024dec2c080b9abde74502826b29263152aAndy McFadden * Drives tests. 243f64a024dec2c080b9abde74502826b29263152aAndy McFadden */ 253f64a024dec2c080b9abde74502826b29263152aAndy McFadden public static void main(String[] args) { 263f64a024dec2c080b9abde74502826b29263152aAndy McFadden Main m = new Main(); 273f64a024dec2c080b9abde74502826b29263152aAndy McFadden 283f64a024dec2c080b9abde74502826b29263152aAndy McFadden m.recursiveSync(0); 293f64a024dec2c080b9abde74502826b29263152aAndy McFadden 303f64a024dec2c080b9abde74502826b29263152aAndy McFadden m.nestedMayThrow(false); 313f64a024dec2c080b9abde74502826b29263152aAndy McFadden try { 323f64a024dec2c080b9abde74502826b29263152aAndy McFadden m.nestedMayThrow(true); 333f64a024dec2c080b9abde74502826b29263152aAndy McFadden System.err.println("nestedThrow(true) did not throw"); 343f64a024dec2c080b9abde74502826b29263152aAndy McFadden } catch (MyException me) {} 353f64a024dec2c080b9abde74502826b29263152aAndy McFadden System.out.println("nestedMayThrow ok"); 363f64a024dec2c080b9abde74502826b29263152aAndy McFadden 373f64a024dec2c080b9abde74502826b29263152aAndy McFadden m.constantLock(); 383f64a024dec2c080b9abde74502826b29263152aAndy McFadden System.out.println("constantLock ok"); 393f64a024dec2c080b9abde74502826b29263152aAndy McFadden 403f64a024dec2c080b9abde74502826b29263152aAndy McFadden m.notExcessiveNesting(); 413f64a024dec2c080b9abde74502826b29263152aAndy McFadden if (false) { // TODO: remove when verification is turned on 423f64a024dec2c080b9abde74502826b29263152aAndy McFadden try { 433f64a024dec2c080b9abde74502826b29263152aAndy McFadden TooDeep.excessiveNesting(); 443f64a024dec2c080b9abde74502826b29263152aAndy McFadden System.err.println("excessiveNesting did not throw"); 453f64a024dec2c080b9abde74502826b29263152aAndy McFadden } catch (VerifyError ve) {} 463f64a024dec2c080b9abde74502826b29263152aAndy McFadden } 473f64a024dec2c080b9abde74502826b29263152aAndy McFadden System.out.println("excessiveNesting ok"); 483f64a024dec2c080b9abde74502826b29263152aAndy McFadden 493f64a024dec2c080b9abde74502826b29263152aAndy McFadden m.notNested(); 503f64a024dec2c080b9abde74502826b29263152aAndy McFadden System.out.println("notNested ok"); 513f64a024dec2c080b9abde74502826b29263152aAndy McFadden 523f64a024dec2c080b9abde74502826b29263152aAndy McFadden Object obj1 = new Object(); 533f64a024dec2c080b9abde74502826b29263152aAndy McFadden Object obj2 = new Object(); 543f64a024dec2c080b9abde74502826b29263152aAndy McFadden 553f64a024dec2c080b9abde74502826b29263152aAndy McFadden m.twoPath(obj1, obj2, 0); 563f64a024dec2c080b9abde74502826b29263152aAndy McFadden System.out.println("twoPath ok"); 573f64a024dec2c080b9abde74502826b29263152aAndy McFadden 583f64a024dec2c080b9abde74502826b29263152aAndy McFadden m.triplet(obj1, obj2, 0); 593f64a024dec2c080b9abde74502826b29263152aAndy McFadden System.out.println("triplet ok"); 603f64a024dec2c080b9abde74502826b29263152aAndy McFadden } 613f64a024dec2c080b9abde74502826b29263152aAndy McFadden 623f64a024dec2c080b9abde74502826b29263152aAndy McFadden /** 633f64a024dec2c080b9abde74502826b29263152aAndy McFadden * Recursive synchronized method. 643f64a024dec2c080b9abde74502826b29263152aAndy McFadden */ 653f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized void recursiveSync(int iter) { 663f64a024dec2c080b9abde74502826b29263152aAndy McFadden if (iter < 40) { 673f64a024dec2c080b9abde74502826b29263152aAndy McFadden recursiveSync(iter+1); 683f64a024dec2c080b9abde74502826b29263152aAndy McFadden } else { 693f64a024dec2c080b9abde74502826b29263152aAndy McFadden System.out.println("recursiveSync ok"); 703f64a024dec2c080b9abde74502826b29263152aAndy McFadden } 713f64a024dec2c080b9abde74502826b29263152aAndy McFadden } 723f64a024dec2c080b9abde74502826b29263152aAndy McFadden 733f64a024dec2c080b9abde74502826b29263152aAndy McFadden /** 743f64a024dec2c080b9abde74502826b29263152aAndy McFadden * Tests simple nesting, with and without a throw. 753f64a024dec2c080b9abde74502826b29263152aAndy McFadden */ 763f64a024dec2c080b9abde74502826b29263152aAndy McFadden void nestedMayThrow(boolean doThrow) { 773f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) { 783f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (Main.class) { 793f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (new Object()) { 803f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized(Class.class) { 813f64a024dec2c080b9abde74502826b29263152aAndy McFadden if (doThrow) { 823f64a024dec2c080b9abde74502826b29263152aAndy McFadden throw new MyException(); 833f64a024dec2c080b9abde74502826b29263152aAndy McFadden } 843f64a024dec2c080b9abde74502826b29263152aAndy McFadden } 853f64a024dec2c080b9abde74502826b29263152aAndy McFadden } 863f64a024dec2c080b9abde74502826b29263152aAndy McFadden } 873f64a024dec2c080b9abde74502826b29263152aAndy McFadden } 883f64a024dec2c080b9abde74502826b29263152aAndy McFadden } 893f64a024dec2c080b9abde74502826b29263152aAndy McFadden 903f64a024dec2c080b9abde74502826b29263152aAndy McFadden /** 913f64a024dec2c080b9abde74502826b29263152aAndy McFadden * Exercises bug 3215458. 923f64a024dec2c080b9abde74502826b29263152aAndy McFadden */ 933f64a024dec2c080b9abde74502826b29263152aAndy McFadden void constantLock() { 943f64a024dec2c080b9abde74502826b29263152aAndy McFadden Class thing = Thread.class; 953f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (Thread.class) {} 963f64a024dec2c080b9abde74502826b29263152aAndy McFadden } 973f64a024dec2c080b9abde74502826b29263152aAndy McFadden 983f64a024dec2c080b9abde74502826b29263152aAndy McFadden /** 993f64a024dec2c080b9abde74502826b29263152aAndy McFadden * Confirms that we can have 32 nested monitors on one method. 1003f64a024dec2c080b9abde74502826b29263152aAndy McFadden */ 1013f64a024dec2c080b9abde74502826b29263152aAndy McFadden void notExcessiveNesting() { 1023f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) { // 1 1033f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) { // 2 1043f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) { // 3 1053f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) { // 4 1063f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) { // 5 1073f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) { // 6 1083f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) { // 7 1093f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) { // 8 1103f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) { // 9 1113f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) { // 10 1123f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) { // 11 1133f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) { // 12 1143f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) { // 13 1153f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) { // 14 1163f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) { // 15 1173f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) { // 16 1183f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) { // 17 1193f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) { // 18 1203f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) { // 19 1213f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) { // 20 1223f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) { // 21 1233f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) { // 22 1243f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) { // 23 1253f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) { // 24 1263f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) { // 25 1273f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) { // 26 1283f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) { // 27 1293f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) { // 28 1303f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) { // 29 1313f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) { // 30 1323f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) { // 31 1333f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) { // 32 1343f64a024dec2c080b9abde74502826b29263152aAndy McFadden }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} 1353f64a024dec2c080b9abde74502826b29263152aAndy McFadden } 1363f64a024dec2c080b9abde74502826b29263152aAndy McFadden 1373f64a024dec2c080b9abde74502826b29263152aAndy McFadden /** 1383f64a024dec2c080b9abde74502826b29263152aAndy McFadden * Confirms that we can have more than 32 non-nested monitors in one 1393f64a024dec2c080b9abde74502826b29263152aAndy McFadden * method. 1403f64a024dec2c080b9abde74502826b29263152aAndy McFadden */ 1413f64a024dec2c080b9abde74502826b29263152aAndy McFadden void notNested() { 1423f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) {} // 1 1433f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) {} // 2 1443f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) {} // 3 1453f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) {} // 4 1463f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) {} // 5 1473f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) {} // 6 1483f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) {} // 7 1493f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) {} // 8 1503f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) {} // 9 1513f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) {} // 10 1523f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) {} // 11 1533f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) {} // 12 1543f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) {} // 13 1553f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) {} // 14 1563f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) {} // 15 1573f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) {} // 16 1583f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) {} // 17 1593f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) {} // 18 1603f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) {} // 19 1613f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) {} // 20 1623f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) {} // 21 1633f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) {} // 22 1643f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) {} // 23 1653f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) {} // 24 1663f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) {} // 25 1673f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) {} // 26 1683f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) {} // 27 1693f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) {} // 28 1703f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) {} // 29 1713f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) {} // 30 1723f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) {} // 31 1733f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) {} // 32 1743f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) {} // 33 1753f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (this) {} // 34 1763f64a024dec2c080b9abde74502826b29263152aAndy McFadden } 1773f64a024dec2c080b9abde74502826b29263152aAndy McFadden 1783f64a024dec2c080b9abde74502826b29263152aAndy McFadden /* does nothing but ensure that the compiler doesn't discard an object */ 1793f64a024dec2c080b9abde74502826b29263152aAndy McFadden private void doNothing(Object obj) {} 1803f64a024dec2c080b9abde74502826b29263152aAndy McFadden 1813f64a024dec2c080b9abde74502826b29263152aAndy McFadden /** 1823f64a024dec2c080b9abde74502826b29263152aAndy McFadden * Conditionally uses one of the synchronized objects. 1833f64a024dec2c080b9abde74502826b29263152aAndy McFadden */ 1843f64a024dec2c080b9abde74502826b29263152aAndy McFadden public void twoPath(Object obj1, Object obj2, int x) { 1853f64a024dec2c080b9abde74502826b29263152aAndy McFadden Object localObj; 1863f64a024dec2c080b9abde74502826b29263152aAndy McFadden 1873f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (obj1) { 1883f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized(obj2) { 1893f64a024dec2c080b9abde74502826b29263152aAndy McFadden if (x == 0) { 1903f64a024dec2c080b9abde74502826b29263152aAndy McFadden localObj = obj2; 1913f64a024dec2c080b9abde74502826b29263152aAndy McFadden } else { 1923f64a024dec2c080b9abde74502826b29263152aAndy McFadden localObj = obj1; 1933f64a024dec2c080b9abde74502826b29263152aAndy McFadden } 1943f64a024dec2c080b9abde74502826b29263152aAndy McFadden } 1953f64a024dec2c080b9abde74502826b29263152aAndy McFadden } 1963f64a024dec2c080b9abde74502826b29263152aAndy McFadden 1973f64a024dec2c080b9abde74502826b29263152aAndy McFadden doNothing(localObj); 1983f64a024dec2c080b9abde74502826b29263152aAndy McFadden } 1993f64a024dec2c080b9abde74502826b29263152aAndy McFadden 2003f64a024dec2c080b9abde74502826b29263152aAndy McFadden /** 2013f64a024dec2c080b9abde74502826b29263152aAndy McFadden * Lock the monitor two or three times, and make use of the locked or 2023f64a024dec2c080b9abde74502826b29263152aAndy McFadden * unlocked object. 2033f64a024dec2c080b9abde74502826b29263152aAndy McFadden */ 2043f64a024dec2c080b9abde74502826b29263152aAndy McFadden public void triplet(Object obj1, Object obj2, int x) { 2053f64a024dec2c080b9abde74502826b29263152aAndy McFadden Object localObj; 2063f64a024dec2c080b9abde74502826b29263152aAndy McFadden 2073f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized (obj1) { 2083f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized(obj1) { 2093f64a024dec2c080b9abde74502826b29263152aAndy McFadden if (x == 0) { 2103f64a024dec2c080b9abde74502826b29263152aAndy McFadden synchronized(obj1) { 2113f64a024dec2c080b9abde74502826b29263152aAndy McFadden localObj = obj2; 2123f64a024dec2c080b9abde74502826b29263152aAndy McFadden } 2133f64a024dec2c080b9abde74502826b29263152aAndy McFadden } else { 2143f64a024dec2c080b9abde74502826b29263152aAndy McFadden localObj = obj1; 2153f64a024dec2c080b9abde74502826b29263152aAndy McFadden } 2163f64a024dec2c080b9abde74502826b29263152aAndy McFadden } 2173f64a024dec2c080b9abde74502826b29263152aAndy McFadden } 2183f64a024dec2c080b9abde74502826b29263152aAndy McFadden 2193f64a024dec2c080b9abde74502826b29263152aAndy McFadden doNothing(localObj); 2203f64a024dec2c080b9abde74502826b29263152aAndy McFadden } 2213f64a024dec2c080b9abde74502826b29263152aAndy McFadden} 222