/* * @(#)TestSync.java 1.10 06/10/10 * * Copyright 1990-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License version * 2 only, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License version 2 for more details (a copy is * included at /legal/license.txt). * * You should have received a copy of the GNU General Public License * version 2 along with this work; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA * * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa * Clara, CA 95054 or visit www.sun.com if you need additional * information or have any questions. * */ /* * @(#)TestSync.java 1.4 03/11/04 * The TestSync class tests miscellaneous uneven locking scenarios. */ class TestSyncT2Locker extends Thread { TestSyncInflater inflater; boolean done; boolean ready; boolean waiting; Object objToLock; Object request; Object requestDone; int requestType; static final int LOCK = 1; static final int UNLOCK = 2; static final int SYNC = 3; static final int UNSYNC = 4; static final int INFLATE = 5; TestSyncT2Locker(TestSyncInflater _inflater) { inflater = _inflater; ready = false; request = new Object(); requestDone = new Object(); objToLock = null; } void init() { done = false; this.start(); } void terminate() { done = true; synchronized(request) { request.notifyAll(); // Wake up locker thread. } } public void run() { while (!done) { doRun(); } } private void doRun() { // Step 2: Lock the request lock and declare the locker ready. synchronized(request) { ready = true; try { // Step 3: Wait for a request. request.wait(); ready = false; } catch (InterruptedException e) { } if (!done) { while (!waiting) { try { Thread.sleep(10); } catch (InterruptedException e) { } } // Step 7: Lock of unlock the object. if (requestType == LOCK) { TestSyncLocker.monitorEnter(objToLock); } else if (requestType == UNLOCK) { TestSyncLocker.monitorExit(objToLock); } else if (requestType == SYNC) { synchronized(objToLock) { // Now wait for the next request which should // be for unsync: synchronized(requestDone) { requestDone.notifyAll(); } doRun(); } } else if (requestType == UNSYNC) { } else if (requestType == INFLATE) { inflater.inflate(objToLock); } // Step 8: Tell the requester that we're done. synchronized(requestDone) { requestDone.notifyAll(); } } } } void monitorEnter(Object o) { request(o, LOCK); } void monitorExit(Object o) { request(o, UNLOCK); } void sync(Object o) { request(o, SYNC); } void unsync(Object o) { request(o, UNSYNC); } void inflate(Object o) { request(o, INFLATE); } private void request(Object o, int requestVal) { // Step 1: Wait for the locker thread to get ready: while (!ready) { try { Thread.sleep(10); } catch (InterruptedException e) { } } // Step 4: Lock the request lock and make a request. synchronized(request) { waiting = false; objToLock = o; requestType = requestVal; // Step 5 : Tell the locker thread to wake up and handle the // request. request.notifyAll(); } // Step 6: Lock the object to be locked and wait for // the requested to contend and notify it. synchronized(requestDone) { try { waiting = true; requestDone.wait(); } catch (InterruptedException e) { } } // The only way we can get here is if the locked boolean has been // set to true. The only way that can happen is if the locker // thread managed to wait on the object and the requester thread gets // to notify the locker thread to wake up from that wait. Hence, // contention (and therefore inflation) must have happened. } } class TestSyncInflater extends Thread { boolean done; boolean ready; boolean waiting; Object objToInflate; Object request; TestSyncInflater() { ready = false; request = new Object(); objToInflate = null; } void init() { done = false; this.start(); } void terminate() { done = true; synchronized(request) { request.notifyAll(); // Wake up inflater thread. } } public void run() { while (!done) { // Step 2: Lock the request lock and declare the inflater ready. synchronized(request) { ready = true; try { // Step 3: Wait for a request. request.wait(); ready = false; } catch (InterruptedException e) { } if (!done) { while (!waiting) { try { Thread.sleep(10); } catch (InterruptedException e) { } } // Step 7: Contend on the object to be inflated and notify // the inflater once we have contended on it. synchronized(objToInflate) { objToInflate.notifyAll(); } try { Thread.sleep(10); } catch (InterruptedException e) { } } } } } void inflate(Object o) { // Step 1: Wait for the inflater thread to get ready: while (!ready) { try { Thread.sleep(10); } catch (InterruptedException e) { } } // Step 4: Lock the request lock and make a request. synchronized(request) { waiting = false; objToInflate = o; // Step 5 : Tell the inflater thread to wake up and handle the // request. request.notifyAll(); } // Step 6: Lock the object to be inflated and wait for // the requested to contend and notify it. synchronized(objToInflate) { try { waiting = true; objToInflate.wait(); } catch (InterruptedException e) { } } // The only way we can get here is if the inflated boolean has been // set to true. The only way that can happen is if the inflater // thread managed to wait on the object and the requester thread gets // to notify the inflater thread to wake up from that wait. Hence, // contention (and therefore inflation) must have happened. } } public class TestSync { static int level = 0; static int total = 0; static int failed = 0; static int passed = 0; static TestSyncInflater inflater = new TestSyncInflater(); static TestSyncT2Locker locker = new TestSyncT2Locker(inflater); static TestSyncT2Locker t2 = locker; public static void main(String[] args) throws Exception { long maxReentryCount = 0; boolean runLargeReentryLockingTest = false; boolean needToTestUnstructuredLocks = false; int usedArg = -1; try { // Check for the "testUnstructuredLocks" arg: for (int i = 0; i < args.length; i++) { // NOTE: JDK 1.4's javac generate a catch block that catches // the same IllegalMonitorStateException that it throws. See // bug reports at // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6271353 and // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4414101. // However, the javac team has determined this to not be a bug // due to various reasons. But in CVM's case, this unfortunately // results in an infinite loop due to CVM supporting unstructured // locks. For now, we disable these tests by default for // convenience. if (args[i].equals("testUnstructuredLocks")) { needToTestUnstructuredLocks = true; usedArg = i; break; } } // Check for the "maxReentryCount" arg: for (int i = 0; i < args.length; i++) { if (i != usedArg) { maxReentryCount = Long.parseLong(args[0]); runLargeReentryLockingTest = true; } } } catch (Exception e) { maxReentryCount = 0; runLargeReentryLockingTest = false; } inflater.init(); locker.init(); testHoldsLock(); if (needToTestUnstructuredLocks) { testExcessMonitorExit(); testExcessMonitorEnter(); } if (runLargeReentryLockingTest) { testLargeReentryLocking(maxReentryCount); } locker.terminate(); inflater.terminate(); System.gc(); System.out.println(); System.out.println("Passed: " + passed); System.out.println("Failed: " + failed); System.out.println("Total: " + total); } static void monitorEnter(Object o) { TestSyncLocker.monitorEnter(o); } static void monitorExit(Object o) { TestSyncLocker.monitorExit(o); } static void inflate(Object o) { inflater.inflate(o); } static void passIf(boolean success, String message) { String status; if (success) { passed++; status = "PASSED"; } else { failed++; status = "FAILED"; } total++; System.out.println(status + " " + total + ": " + message); } static void passIf(boolean success, String message, int level, int expected) { passIf(success, message); if (!success || (level != expected)) { System.out.println(" Expected level = " + expected); System.out.println(" Actual level = " + level); } } static void decLevels(Object o) { for (int i = 0; i < 10; i++) { monitorExit(o); level--; } } //====================================================================== synchronized void syncF() { level++; level--; } synchronized void syncFX() { level++; monitorExit(this); level--; } synchronized void syncFE() { level++; monitorEnter(this); level--; } synchronized void syncFIX() { level++; inflate(this); monitorExit(this); level--; } synchronized void syncFIE() { level++; inflate(this); monitorEnter(this); level--; } synchronized void syncFXI() { level++; monitorExit(this); inflate(this); level--; } synchronized void syncFEI() { level++; monitorEnter(this); inflate(this); level--; } synchronized void syncFFX() { level++; syncFX(); level--; } synchronized void syncFFE() { level++; syncFE(); level--; } synchronized void syncFFIX() { level++; syncFIX(); level--; } synchronized void syncFFIE() { level++; syncFIE(); level--; } synchronized void syncFFXI() { level++; syncFXI(); level--; } synchronized void syncFFEI() { level++; syncFEI(); level--; } synchronized void syncFIFX() { level++; inflate(this); syncFX(); level--; } synchronized void syncFIFE() { level++; inflate(this); syncFE(); level--; } synchronized void syncFXX() { level++; monitorExit(this); monitorExit(this); level--; } synchronized void syncFEE() { level++; monitorEnter(this); monitorEnter(this); level--; } synchronized void syncFIXX() { level++; inflate(this); monitorExit(this); monitorExit(this); level--; } synchronized void syncFIEE() { level++; inflate(this); monitorEnter(this); monitorEnter(this); level--; } synchronized void syncFXIX() { level++; monitorExit(this); inflate(this); monitorExit(this); level--; } synchronized void syncFEIE() { level++; monitorEnter(this); inflate(this); monitorEnter(this); level--; } synchronized void syncFFXX() { level++; syncFXX(); level--; } synchronized void syncFFEE() { level++; syncFEE(); level--; } synchronized void syncFFIXX() { level++; syncFIXX(); level--; } synchronized void syncFFIEE() { level++; syncFIEE(); level--; } synchronized void syncFFXIX() { level++; syncFXIX(); level--; } synchronized void syncFFEIE() { level++; syncFEIE(); level--; } synchronized void syncFIFXX() { level++; inflate(this); syncFXX(); level--; } synchronized void syncFIFEE() { level++; inflate(this); syncFEE(); level--; } synchronized void syncFFFX() { level++; syncFFX(); level--; } synchronized void syncFFFE() { level++; syncFFE(); level--; } synchronized void syncFFFIX() { level++; syncFFIX(); level--; } synchronized void syncFFFIE() { level++; syncFFIE(); level--; } synchronized void syncFFIFX() { level++; syncFIFX(); level--; } synchronized void syncFFIFE() { level++; syncFIFE(); level--; } synchronized void syncFIFFX() { level++; inflate(this); syncFFX(); level--; } synchronized void syncFIFFE() { level++; inflate(this); syncFFE(); level--; } synchronized void syncFFFXX() { level++; syncFFXX(); level--; } synchronized void syncFFFEE() { level++; syncFFEE(); level--; } synchronized void syncFFFXXX() { level++; syncFFXXX(); level--; } synchronized void syncFFFEEE() { level++; syncFFEEE(); level--; } synchronized void syncFFFXE() { level++; syncFFXE(); level--; } synchronized void syncFFFEX() { level++; syncFFEX(); level--; } synchronized void syncFFFX_E() { level++; syncFFX_E(); level--; } synchronized void syncFFFE_X() { level++; syncFFE_X(); level--; } synchronized void syncFFFX__E() { level++; syncFFX(); monitorEnter(this); level--; } synchronized void syncFFFE__X() { level++; syncFFE(); monitorExit(this); level--; } synchronized void syncFXXX() { level++; monitorExit(this); monitorExit(this); monitorExit(this); level--; } synchronized void syncFEEE() { level++; monitorEnter(this); monitorEnter(this); monitorEnter(this); level--; } synchronized void syncFIXXX() { level++; inflate(this); monitorExit(this); monitorExit(this); monitorExit(this); level--; } synchronized void syncFIEEE() { level++; inflate(this); monitorEnter(this); monitorEnter(this); monitorEnter(this); level--; } synchronized void syncFXIXX() { level++; monitorExit(this); inflate(this); monitorExit(this); monitorExit(this); level--; } synchronized void syncFEIEE() { level++; monitorEnter(this); inflate(this); monitorEnter(this); monitorEnter(this); level--; } synchronized void syncFXXIX() { level++; monitorExit(this); monitorExit(this); inflate(this); monitorExit(this); level--; } synchronized void syncFEEIE() { level++; monitorEnter(this); monitorEnter(this); inflate(this); monitorEnter(this); level--; } synchronized void syncFFXXX() { level++; syncFXXX(); level--; } synchronized void syncFFEEE() { level++; syncFEEE(); level--; } synchronized void syncFFIXXX() { level++; syncFIXXX(); level--; } synchronized void syncFFIEEE() { level++; syncFIEEE(); level--; } synchronized void syncFFXIXX() { level++; syncFXIXX(); level--; } synchronized void syncFFEIEE() { level++; syncFEIEE(); level--; } synchronized void syncFIFXXX() { level++; inflate(this); syncFXXX(); level--; } synchronized void syncFIFEEE() { level++; inflate(this); syncFEEE(); level--; } synchronized void syncFXE() { level++; monitorExit(this); monitorEnter(this); level--; } synchronized void syncFEX() { level++; monitorEnter(this); monitorExit(this); level--; } synchronized void syncFXEE() { level++; monitorExit(this); monitorEnter(this); monitorEnter(this); level--; } synchronized void syncFIXE() { level++; inflate(this); monitorExit(this); monitorEnter(this); level--; } synchronized void syncFIEX() { level++; inflate(this); monitorEnter(this); monitorExit(this); level--; } synchronized void syncFXIE() { level++; monitorExit(this); inflate(this); monitorEnter(this); level--; } synchronized void syncFEIX() { level++; monitorEnter(this); inflate(this); monitorExit(this); level--; } synchronized void syncFXEI() { level++; monitorExit(this); monitorEnter(this); inflate(this); level--; } synchronized void syncFEXI() { level++; monitorEnter(this); monitorExit(this); inflate(this); level--; } synchronized void syncFFXE() { level++; syncFXE(); level--; } synchronized void syncFFEX() { level++; syncFEX(); level--; } synchronized void syncFFXEE() { level++; syncFXEE(); level--; } synchronized void syncFFIXE() { level++; syncFIXE(); level--; } synchronized void syncFFIEX() { level++; syncFIEX(); level--; } synchronized void syncFFIX_E() { level++; syncFIX(); monitorEnter(this); level--; } synchronized void syncFFIE_X() { level++; syncFIE(); monitorExit(this); level--; } synchronized void syncFFXI_E() { level++; syncFXI(); monitorEnter(this); level--; } synchronized void syncFFEI_X() { level++; syncFEI(); monitorExit(this); level--; } synchronized void syncFIFX_E() { level++; inflate(this); syncFX(); monitorEnter(this); level--; } synchronized void syncFIFE_X() { level++; inflate(this); syncFE(); monitorExit(this); level--; } synchronized void syncFFX_EI() { level++; syncFX(); monitorEnter(this); inflate(this); level--; } synchronized void syncFFE_XI() { level++; syncFE(); monitorExit(this); inflate(this); level--; } synchronized void syncFFXIE() { level++; syncFXIE(); level--; } synchronized void syncFFEIX() { level++; syncFEIX(); level--; } synchronized void syncFFXEI() { level++; syncFXEI(); level--; } synchronized void syncFFEXI() { level++; syncFEXI(); level--; } synchronized void syncFIFXE() { level++; inflate(this); syncFXE(); level--; } synchronized void syncFIFEX() { level++; inflate(this); syncFEX(); level--; } synchronized void syncFFXE_I() { level++; syncFXE(); inflate(this); level--; } synchronized void syncFFEX_I() { level++; syncFEX(); inflate(this); level--; } synchronized void syncFFX_E() { level++; syncFX(); monitorEnter(this); level--; } synchronized void syncFFE_X() { level++; syncFE(); monitorExit(this); level--; } synchronized void syncFFX_EE() { level++; syncFX(); monitorEnter(this); monitorEnter(this); level--; } synchronized void syncFSX() { level++; synchronized(this) { level++; monitorExit(this); level--; } level--; } synchronized void syncFSE() { level++; synchronized(this) { level++; monitorEnter(this); level--; } level--; } synchronized void syncFSIX() { level++; synchronized(this) { level++; inflate(this); monitorExit(this); level--; } level--; } synchronized void syncFSIE() { level++; synchronized(this) { level++; inflate(this); monitorEnter(this); level--; } level--; } synchronized void syncFISX() { level++; inflate(this); synchronized(this) { level++; monitorExit(this); level--; } level--; } synchronized void syncFISE() { level++; inflate(this); synchronized(this) { level++; monitorEnter(this); level--; } level--; } synchronized void syncFSXX() { level++; synchronized(this) { level++; monitorExit(this); monitorExit(this); level--; } level--; } synchronized void syncFSEE() { level++; synchronized(this) { level++; monitorEnter(this); monitorEnter(this); level--; } level--; } synchronized void syncFSXXX() { level++; synchronized(this) { level++; monitorExit(this); monitorExit(this); monitorExit(this); level--; } level--; } synchronized void syncFSEEE() { level++; synchronized(this) { level++; monitorEnter(this); monitorEnter(this); monitorEnter(this); level--; } level--; } synchronized void syncFSXE() { level++; synchronized(this) { level++; monitorExit(this); monitorEnter(this); level--; } level--; } synchronized void syncFSEX() { level++; synchronized(this) { level++; monitorEnter(this); monitorExit(this); level--; } level--; } synchronized void syncFSX_E() { level++; synchronized(this){ level++; monitorExit(this); level--; } monitorEnter(this); level--; } synchronized void syncFSE_X() { level++; synchronized(this){ level++; monitorEnter(this); level--; } monitorExit(this); level--; } synchronized void syncFFSX() { level++; syncFSX(); level--; } synchronized void syncFFSE() { level++; syncFSE(); level--; } synchronized void syncFFSIX() { level++; syncFSIX(); level--; } synchronized void syncFFSIE() { level++; syncFSIE(); level--; } synchronized void syncFFISX() { level++; syncFISX(); level--; } synchronized void syncFFISE() { level++; syncFISE(); level--; } synchronized void syncFIFSX() { level++; inflate(this); syncFSX(); level--; } synchronized void syncFIFSE() { level++; inflate(this); syncFSE(); level--; } synchronized void syncFFSXE() { level++; syncFSXE(); level--; } synchronized void syncFFSEX() { level++; syncFSEX(); level--; } synchronized void syncFFSX_E() { level++; syncFSX_E(); level--; } synchronized void syncFFSE_X() { level++; syncFSE_X(); level--; } synchronized void syncFFSX__E() { level++; syncFSX(); monitorEnter(this); level--; } synchronized void syncFFSE__X() { level++; syncFSE(); monitorExit(this); level--; } synchronized void syncFSSX() { level++; synchronized(this) { level++; synchronized(this) { level++; monitorExit(this); level--; } level--; } level--; } synchronized void syncFSSE() { level++; synchronized(this) { level++; synchronized(this) { level++; monitorEnter(this); level--; } level--; } level--; } synchronized void syncFSSIX() { level++; synchronized(this) { level++; synchronized(this) { level++; inflate(this); monitorExit(this); level--; } level--; } level--; } synchronized void syncFSSIE() { level++; synchronized(this) { level++; synchronized(this) { level++; inflate(this); monitorEnter(this); level--; } level--; } level--; } synchronized void syncFSISX() { level++; synchronized(this) { level++; inflate(this); synchronized(this) { level++; monitorExit(this); level--; } level--; } level--; } synchronized void syncFSISE() { level++; synchronized(this) { level++; inflate(this); synchronized(this) { level++; monitorEnter(this); level--; } level--; } level--; } synchronized void syncFISSX() { level++; inflate(this); synchronized(this) { level++; synchronized(this) { level++; monitorExit(this); level--; } level--; } level--; } synchronized void syncFISSE() { level++; inflate(this); synchronized(this) { level++; synchronized(this) { level++; monitorEnter(this); level--; } level--; } level--; } synchronized void syncFSSXX() { level++; synchronized(this) { level++; synchronized(this) { level++; monitorExit(this); monitorExit(this); level--; } level--; } level--; } synchronized void syncFSSEE() { level++; synchronized(this) { level++; synchronized(this) { level++; monitorEnter(this); monitorEnter(this); level--; } level--; } level--; } synchronized void syncFSSXXX() { level++; synchronized(this) { level++; synchronized(this) { level++; monitorExit(this); monitorExit(this); monitorExit(this); level--; } level--; } level--; } synchronized void syncFSSEEE() { level++; synchronized(this) { level++; synchronized(this) { level++; monitorEnter(this); monitorEnter(this); monitorEnter(this); level--; } level--; } level--; } synchronized void syncFSSXE() { level++; synchronized(this) { level++; synchronized(this) { level++; monitorExit(this); monitorEnter(this); level--; } level--; } level--; } synchronized void syncFSSEX() { level++; synchronized(this) { level++; synchronized(this) { level++; monitorEnter(this); monitorExit(this); level--; } level--; } level--; } synchronized void syncFSSX_E() { level++; synchronized(this) { level++; synchronized(this) { level++; monitorExit(this); level--; } monitorEnter(this); level--; } level--; } synchronized void syncFSSE_X() { level++; synchronized(this) { level++; synchronized(this) { level++; monitorEnter(this); level--; } monitorExit(this); level--; } level--; } synchronized void syncFSSX__E() { level++; synchronized(this) { level++; synchronized(this) { level++; monitorExit(this); level--; } level--; } monitorEnter(this); level--; } synchronized void syncFSSE__X() { level++; synchronized(this) { level++; synchronized(this) { level++; monitorEnter(this); level--; } level--; } monitorExit(this); level--; } synchronized void syncFSFX() { level++; synchronized(this) { level++; syncFX(); level--; } level--; } synchronized void syncFSFE() { level++; synchronized(this) { level++; syncFE(); level--; } level--; } synchronized void syncFSFIX() { level++; synchronized(this) { level++; syncFIX(); level--; } level--; } synchronized void syncFSFIE() { level++; synchronized(this) { level++; syncFIE(); level--; } level--; } synchronized void syncFSIFX() { level++; synchronized(this) { level++; inflate(this); syncFX(); level--; } level--; } synchronized void syncFSIFE() { level++; synchronized(this) { level++; inflate(this); syncFE(); level--; } level--; } synchronized void syncFISFX() { level++; inflate(this); synchronized(this) { level++; syncFX(); level--; } level--; } synchronized void syncFISFE() { level++; inflate(this); synchronized(this) { level++; syncFE(); level--; } level--; } synchronized void syncFSFXX() { level++; synchronized(this) { level++; syncFXX(); level--; } level--; } synchronized void syncFSFEE() { level++; synchronized(this) { level++; syncFEE(); level--; } level--; } synchronized void syncFSFXXX() { level++; synchronized(this) { level++; syncFXXX(); level--; } level--; } synchronized void syncFSFEEE() { level++; synchronized(this) { level++; syncFEEE(); level--; } level--; } synchronized void syncFSFXE() { level++; synchronized(this) { level++; syncFXE(); level--; } level--; } synchronized void syncFSFEX() { level++; synchronized(this) { level++; syncFEX(); level--; } level--; } synchronized void syncFSFX_E() { level++; synchronized(this) { level++; syncFX(); monitorEnter(this); level--; } level--; } synchronized void syncFSFE_X() { level++; synchronized(this) { level++; syncFE(); monitorExit(this); level--; } level--; } synchronized void syncFSFX__E() { level++; synchronized(this) { level++; syncFX(); level--; } monitorEnter(this); level--; } synchronized void syncFSFE__X() { level++; synchronized(this) { level++; syncFE(); level--; } monitorExit(this); level--; } synchronized void syncFFSXX() { level++; syncFSXX(); level--; } synchronized void syncFFSEE() { level++; syncFSEE(); level--; } synchronized void syncFFSXXX() { level++; syncFSXXX(); level--; } synchronized void syncFFSEEE() { level++; syncFSEEE(); level--; } static void testHoldsLock() { boolean success; System.out.println(""); System.out.println("Holds lock tests:"); //==================================================================== // Holds lock tests: // Case 0: holdsLock { Object o = new Object(); success = !Thread.holdsLock(o); } passIf(success, "holdsLock"); // Case 1: enter,holdsLock { Object o = new Object(); monitorEnter(o); success = Thread.holdsLock(o); monitorExit(o); } passIf(success, "enter,holdsLock"); // Case 2: enter,exit,holdsLock { Object o = new Object(); monitorEnter(o); monitorExit(o); success = !Thread.holdsLock(o); } passIf(success, "enter,exit,holdsLock"); // Case 3: enter,enter,holdsLock { Object o = new Object(); monitorEnter(o); monitorEnter(o); success = Thread.holdsLock(o); monitorExit(o); monitorExit(o); } passIf(success, "enter,enter,holdsLock"); // Case 4: enter,enter,exit,holdsLock { Object o = new Object(); monitorEnter(o); monitorEnter(o); monitorExit(o); success = Thread.holdsLock(o); monitorExit(o); } passIf(success, "enter,enter,exit,holdsLock"); // Case 5: enter,enter,exit,exit,holdsLock { Object o = new Object(); monitorEnter(o); monitorEnter(o); monitorExit(o); monitorExit(o); success = !Thread.holdsLock(o); } passIf(success, "enter,enter,exit,exit,holdsLock"); // Case 6: sync{holdsLock} { Object o = new Object(); synchronized(o) { success = Thread.holdsLock(o); } } passIf(success, "sync{holdsLock}"); // Case 7: sync{},holdsLock { Object o = new Object(); synchronized(o) {} success = !Thread.holdsLock(o); } passIf(success, "sync{},holdsLock"); // Case 8: sync{sync{holdsLock}} { Object o = new Object(); synchronized(o) { synchronized(o) { success = Thread.holdsLock(o); } } } passIf(success, "sync{sync{holdsLock}}"); // Case 9: sync{sync{},holdsLock} { Object o = new Object(); synchronized(o) { synchronized(o) {} success = Thread.holdsLock(o); } } passIf(success, "sync{sync{},holdsLock}"); // Case 10: sync{sync{}},holdsLock { Object o = new Object(); synchronized(o) { synchronized(o) {} } success = !Thread.holdsLock(o); } passIf(success, "sync{sync{}},holdsLock"); // Case 11: enter,sync{holdsLock} { Object o = new Object(); monitorEnter(o); synchronized(o) { success = Thread.holdsLock(o); } monitorExit(o); } passIf(success, "enter,sync{holdsLock}"); // Case 12: sync{enter,holdsLock,exit} { Object o = new Object(); synchronized(o) { monitorEnter(o); success = Thread.holdsLock(o); monitorExit(o); } } passIf(success, "sync{enter,holdsLock,exit}"); // Case 13: inflate,holdsLock { Object o = new Object(); inflate(o); success = !Thread.holdsLock(o); } passIf(success, "inflate,holdsLock"); // Case 14: inflate,enter,holdsLock { Object o = new Object(); inflate(o); monitorEnter(o); success = Thread.holdsLock(o); monitorExit(o); } passIf(success, "inflate,enter,holdsLock"); // Case 15: enter,inflate,holdsLock { Object o = new Object(); monitorEnter(o); inflate(o); success = Thread.holdsLock(o); monitorExit(o); } passIf(success, "enter,inflate,holdsLock"); // Case 16: enter,inflate,exit,holdsLock { Object o = new Object(); monitorEnter(o); inflate(o); monitorExit(o); success = !Thread.holdsLock(o); } passIf(success, "enter,inflate,exit,holdsLock"); // Case 17: enter,exit,inflate,holdsLock { Object o = new Object(); monitorEnter(o); monitorExit(o); inflate(o); success = !Thread.holdsLock(o); } passIf(success, "enter,exit,inflate,holdsLock"); // Case 18: enter,inflate,enter,holdsLock { Object o = new Object(); monitorEnter(o); inflate(o); monitorEnter(o); success = Thread.holdsLock(o); monitorExit(o); monitorExit(o); } passIf(success, "enter,inflate,enter,holdsLock"); // Case 19: enter,enter,inflate,holdsLock { Object o = new Object(); monitorEnter(o); monitorEnter(o); inflate(o); success = Thread.holdsLock(o); monitorExit(o); monitorExit(o); } passIf(success, "enter,enter,inflate,holdsLock"); // Case 20: enter,inflate,enter,exit,holdsLock { Object o = new Object(); monitorEnter(o); inflate(o); monitorEnter(o); monitorExit(o); success = Thread.holdsLock(o); monitorExit(o); } passIf(success, "enter,inflate,enter,exit,holdsLock"); // Case 21: enter,enter,inflate,exit,holdsLock { Object o = new Object(); monitorEnter(o); monitorEnter(o); inflate(o); monitorExit(o); success = Thread.holdsLock(o); monitorExit(o); } passIf(success, "enter,enter,inflate,exit,holdsLock"); // Case 22: enter,enter,exit,inflate,holdsLock { Object o = new Object(); monitorEnter(o); monitorEnter(o); monitorExit(o); inflate(o); success = Thread.holdsLock(o); monitorExit(o); } passIf(success, "enter,enter,exit,inflate,holdsLock"); // Case 23: enter,enter,exit,exit,inflate,holdsLock { Object o = new Object(); monitorEnter(o); monitorEnter(o); monitorExit(o); monitorExit(o); inflate(o); success = !Thread.holdsLock(o); } passIf(success, "enter,enter,exit,exit,inflate,holdsLock"); // Case 24: inflate,sync{holdsLock} { Object o = new Object(); inflate(o); synchronized(o) { success = Thread.holdsLock(o); } } passIf(success, "inflate,sync{holdsLock}"); // Case 25: sync{inflate,holdsLock} { Object o = new Object(); synchronized(o) { inflate(o); success = Thread.holdsLock(o); } } passIf(success, "sync{inflate,holdsLock}"); // Case 26: sync{},inflate,holdsLock { Object o = new Object(); synchronized(o) {} inflate(o); success = !Thread.holdsLock(o); } passIf(success, "sync{},inflate,holdsLock"); // Case 27: sync{inflate,sync{holdsLock}} { Object o = new Object(); synchronized(o) { inflate(o); synchronized(o) { success = Thread.holdsLock(o); } } } passIf(success, "sync{inflate,sync{holdsLock}}"); // Case 28: sync{sync{inflate,holdsLock}} { Object o = new Object(); synchronized(o) { synchronized(o) { inflate(o); success = Thread.holdsLock(o); } } } passIf(success, "sync{sync{holdsLock}}"); // Case 29: sync{sync{},inflate,holdsLock} { Object o = new Object(); synchronized(o) { synchronized(o) {} inflate(o); success = Thread.holdsLock(o); } } passIf(success, "sync{sync{},inflate,holdsLock}"); // Case 30: sync{sync{}},inflate,holdsLock { Object o = new Object(); synchronized(o) { synchronized(o) {} } inflate(o); success = !Thread.holdsLock(o); } passIf(success, "sync{sync{}},inflate,holdsLock"); // Case 31: enter,inflate,sync{holdsLock} { Object o = new Object(); monitorEnter(o); inflate(o); synchronized(o) { success = Thread.holdsLock(o); } monitorExit(o); } passIf(success, "enter,inflate,sync{holdsLock}"); // Case 32: enter,sync{inflate,holdsLock} { Object o = new Object(); monitorEnter(o); synchronized(o) { inflate(o); success = Thread.holdsLock(o); } monitorExit(o); } passIf(success, "enter,sync{holdsLock}"); // Case 33: sync{inflate,enter,holdsLock,exit} { Object o = new Object(); synchronized(o) { inflate(o); monitorEnter(o); success = Thread.holdsLock(o); monitorExit(o); } } passIf(success, "sync{inflate,enter,holdsLock,exit}"); // Case 34: sync{enter,inflate,holdsLock,exit} { Object o = new Object(); synchronized(o) { monitorEnter(o); inflate(o); success = Thread.holdsLock(o); monitorExit(o); } } passIf(success, "sync{enter,inflate,holdsLock,exit}"); /////////////////////////////////////////// // Case 1: t2.enter,holdsLock { Object o = new Object(); t2.monitorEnter(o); success = !Thread.holdsLock(o); t2.monitorExit(o); } passIf(success, "t2.enter,holdsLock"); // Case 2: t2.enter,t2.exit,holdsLock { Object o = new Object(); t2.monitorEnter(o); t2.monitorExit(o); success = !Thread.holdsLock(o); } passIf(success, "t2.lock,t2.exit,holdsLock"); // Case 3: t2.enter,t2.enter,holdsLock { Object o = new Object(); t2.monitorEnter(o); t2.monitorEnter(o); success = !Thread.holdsLock(o); t2.monitorExit(o); t2.monitorExit(o); } passIf(success, "t2.enter,t2.enter,holdsLock"); // Case 4: t2.enter,t2.enter,t2.exit,holdsLock { Object o = new Object(); t2.monitorEnter(o); t2.monitorEnter(o); t2.monitorExit(o); success = !Thread.holdsLock(o); t2.monitorExit(o); } passIf(success, "t2.enter,t2.enter,t2.exit,holdsLock"); // Case 5: t2.enter,t2.enter,t2.exit,t2.exit,holdsLock { Object o = new Object(); t2.monitorEnter(o); t2.monitorEnter(o); t2.monitorExit(o); t2.monitorExit(o); success = !Thread.holdsLock(o); } passIf(success, "t2.enter,t2.enter,t2.exit,t2.exit,holdsLock"); // Case 6: t2.sync{holdsLock} { Object o = new Object(); t2.sync(o); success = !Thread.holdsLock(o); t2.unsync(o); } passIf(success, "t2.sync{holdsLock}"); // Case 7: t2.sync{},holdsLock { Object o = new Object(); t2.sync(o); t2.unsync(o); success = !Thread.holdsLock(o); } passIf(success, "t2.sync{},holdsLock"); // Case 8: t2.sync{t2.sync{holdsLock}} { Object o = new Object(); t2.sync(o); t2.sync(o); success = !Thread.holdsLock(o); t2.unsync(o); t2.unsync(o); } passIf(success, "t2.sync{t2.sync{holdsLock}}"); // Case 9: t2.sync{t2.sync{},holdsLock} { Object o = new Object(); t2.sync(o); t2.sync(o); t2.unsync(o); success = !Thread.holdsLock(o); t2.unsync(o); } passIf(success, "t2.sync{t2.sync{},holdsLock}"); // Case 10: t2.sync{t2.sync{}},holdsLock { Object o = new Object(); t2.sync(o); t2.sync(o); t2.unsync(o); t2.unsync(o); success = !Thread.holdsLock(o); } passIf(success, "t2.sync{t2.sync{}},holdsLock"); // Case 11: t2.enter,t2.sync{holdsLock} { Object o = new Object(); t2.monitorEnter(o); t2.sync(o); success = !Thread.holdsLock(o); t2.unsync(o); t2.monitorExit(o); } passIf(success, "t2.enter,t2.sync{holdsLock}"); // Case 12: t2.sync{t2.enter,holdsLock,t2.exit} { Object o = new Object(); t2.sync(o); t2.monitorEnter(o); success = !Thread.holdsLock(o); t2.monitorExit(o); t2.unsync(o); } passIf(success, "t2.sync{t2.enter,holdsLock,t2.exit}"); // Case 13: t2.inflate,holdsLock { Object o = new Object(); t2.inflate(o); success = !Thread.holdsLock(o); } passIf(success, "t2.inflate,holdsLock"); // Case 14: t2.inflate,t2.enter,holdsLock { Object o = new Object(); t2.inflate(o); t2.monitorEnter(o); success = !Thread.holdsLock(o); t2.monitorExit(o); } passIf(success, "t2.inflate,t2.enter,holdsLock"); // Case 15: t2.enter,t2.inflate,holdsLock { Object o = new Object(); t2.monitorEnter(o); t2.inflate(o); success = !Thread.holdsLock(o); t2.monitorExit(o); } passIf(success, "t2.enter,t2.inflate,holdsLock"); // Case 16: t2.enter,t2.inflate,t2.exit,holdsLock { Object o = new Object(); t2.monitorEnter(o); t2.inflate(o); t2.monitorExit(o); success = !Thread.holdsLock(o); } passIf(success, "t2.enter,t2.inflate,t2.exit,holdsLock"); // Case 17: t2.enter,t2.exit,t2.inflate,holdsLock { Object o = new Object(); monitorEnter(o); monitorExit(o); inflate(o); success = !Thread.holdsLock(o); } passIf(success, "enter,exit,inflate,holdsLock"); // Case 18: t2.enter,t2.inflate,t2.enter,holdsLock { Object o = new Object(); t2.monitorEnter(o); t2.inflate(o); t2.monitorEnter(o); success = !Thread.holdsLock(o); t2.monitorExit(o); t2.monitorExit(o); } passIf(success, "t2.enter,t2.inflate,t2.enter,holdsLock"); // Case 19: t2.enter,t2.enter,t2.inflate,holdsLock { Object o = new Object(); t2.monitorEnter(o); t2.monitorEnter(o); t2.inflate(o); success = !Thread.holdsLock(o); t2.monitorExit(o); t2.monitorExit(o); } passIf(success, "t2.enter,t2.enter,t2.inflate,holdsLock"); // Case 20: t2.enter,t2.inflate,t2.enter,t2.exit,holdsLock { Object o = new Object(); t2.monitorEnter(o); t2.inflate(o); t2.monitorEnter(o); t2.monitorExit(o); success = !Thread.holdsLock(o); t2.monitorExit(o); } passIf(success, "t2.enter,t2.inflate,t2.enter,t2.exit,holdsLock"); // Case 21: t2.enter,t2.enter,t2.inflate,t2.exit,holdsLock { Object o = new Object(); t2.monitorEnter(o); t2.monitorEnter(o); t2.inflate(o); t2.monitorExit(o); success = !Thread.holdsLock(o); t2.monitorExit(o); } passIf(success, "t2.enter,t2.enter,t2.inflate,t2.exit,holdsLock"); // Case 22: t2.enter,t2.enter,t2.exit,t2.inflate,holdsLock { Object o = new Object(); t2.monitorEnter(o); t2.monitorEnter(o); t2.monitorExit(o); t2.inflate(o); success = !Thread.holdsLock(o); t2.monitorExit(o); } passIf(success, "t2.enter,t2.enter,t2.exit,t2.inflate,holdsLock"); // Case 23: t2.enter,t2.enter,t2.exit,t2.exit,t2.inflate,holdsLock { Object o = new Object(); t2.monitorEnter(o); t2.monitorEnter(o); t2.monitorExit(o); t2.monitorExit(o); t2.inflate(o); success = !Thread.holdsLock(o); } passIf(success, "t2.enter,t2.enter,t2.exit,t2.exit,t2.inflate,holdsLock"); // Case 24: t2.inflate,t2.sync{holdsLock} { Object o = new Object(); t2.inflate(o); t2.sync(o); success = !Thread.holdsLock(o); t2.unsync(o); } passIf(success, "t2.inflate,t2.sync{holdsLock}"); // Case 25: t2.sync{t2.inflate,holdsLock} { Object o = new Object(); t2.sync(o); t2.inflate(o); success = !Thread.holdsLock(o); t2.unsync(o); } passIf(success, "t2.sync{t2.inflate,holdsLock}"); // Case 26: t2.sync{},t2.inflate,holdsLock { Object o = new Object(); t2.sync(o); t2.unsync(o); t2.inflate(o); success = !Thread.holdsLock(o); } passIf(success, "t2.sync{},t2.inflate,holdsLock"); // Case 27: t2.sync{t2.inflate,t2.sync{holdsLock}} { Object o = new Object(); t2.sync(o); t2.inflate(o); t2.sync(o); success = !Thread.holdsLock(o); t2.unsync(o); t2.unsync(o); } passIf(success, "t2.sync{t2.inflate,t2.sync{holdsLock}}"); // Case 28: t2.sync{t2.sync{t2.inflate,holdsLock}} { Object o = new Object(); t2.sync(o); t2.sync(o); t2.inflate(o); success = !Thread.holdsLock(o); t2.unsync(o); t2.unsync(o); } passIf(success, "t2.sync{t2.sync{holdsLock}}"); // Case 29: t2.sync{t2.sync{},t2.inflate,holdsLock} { Object o = new Object(); t2.sync(o); t2.sync(o); t2.unsync(o); t2.inflate(o); success = !Thread.holdsLock(o); t2.unsync(o); } passIf(success, "t2.sync{t2.sync{},t2.inflate,holdsLock}"); // Case 30: t2.sync{t2.sync{}},t2.inflate,holdsLock { Object o = new Object(); t2.sync(o); t2.sync(o); t2.unsync(o); t2.unsync(o); t2.inflate(o); success = !Thread.holdsLock(o); } passIf(success, "t2.sync{t2.sync{}},t2.inflate,holdsLock"); // Case 31: t2.enter,t2.inflate,t2.sync{holdsLock} { Object o = new Object(); t2.monitorEnter(o); t2.inflate(o); t2.sync(o); success = !Thread.holdsLock(o); t2.unsync(o); t2.monitorExit(o); } passIf(success, "t2.enter,t2.inflate,t2.sync{holdsLock}"); // Case 32: t2.enter,t2.sync{t2.inflate,holdsLock} { Object o = new Object(); t2.monitorEnter(o); t2.sync(o); t2.inflate(o); success = !Thread.holdsLock(o); t2.unsync(o); t2.monitorExit(o); } passIf(success, "t2.enter,t2.sync{holdsLock}"); // Case 33: t2.sync{t2.inflate,t2.enter,holdsLock,t2.exit} { Object o = new Object(); t2.sync(o); t2.inflate(o); t2.monitorEnter(o); success = !Thread.holdsLock(o); t2.monitorExit(o); t2.unsync(o); } passIf(success, "t2.sync{t2.inflate,t2.enter,holdsLock,t2.exit}"); // Case 34: t2.sync{t2.enter,t2.inflate,holdsLock,t2.exit} { Object o = new Object(); t2.sync(o); t2.monitorEnter(o); t2.inflate(o); success = !Thread.holdsLock(o); t2.monitorExit(o); t2.unsync(o); } passIf(success, "t2.sync{t2.enter,t2.inflate,holdsLock,t2.exit}"); } static void testLargeReentryLocking(long maxReentryCount) { System.out.println(""); System.out.println("Large monitorenter reentry tests:"); { long i = 0; Object o = new Object(); boolean success = false; System.out.print("Testing large monenter reentry "); try { for (i = 0; i < maxReentryCount; i++) { //System.out.println(" monenter " + i); if (i % 10000 == 1) { System.out.print("."); } monitorEnter(o); } } catch (IllegalMonitorStateException e) { System.out.println(""); System.out.println(" Caught " + e + " at the " + i + "th entry"); // Clean up the uneven monitorEnters above: for (long j = 0; j < i; j++) { monitorExit(o); } success = true; } if (!success) { System.out.println(""); } passIf(success, "large monitor reentry"); } { long i = 0; Object o = new Object(); boolean success = false; System.out.print("Testing large inflated monenter test "); inflate(o); try { for (i = 0; i < maxReentryCount; i++) { //System.out.println(" monenter " + i); if (i % 10000 == 1) { System.out.print("."); } monitorEnter(o); } } catch (IllegalMonitorStateException e) { System.out.println(""); System.out.println(" Caught " + e + " at the " + i + "th entry"); // Clean up the uneven monitorEnters above: for (long j = 0; j < i; j++) { monitorExit(o); } success = true; } if (!success) { System.out.println(""); } passIf(success, "inflated large monitor reentry"); } } static void testExcessMonitorEnter() { boolean success; System.out.println(""); System.out.println("Excess monitorenter tests:"); //==================================================================== // Excess monitorexit on synchronized blocks: // Case 0: enter,sync{} success = false; level = 0; try { Object o = new Object(); monitorEnter(o); level++; synchronized(o) { level++; level--; } level--; decLevels(o); } catch (IllegalMonitorStateException e) { if (level == -1) { success = true; } } passIf(success, "enter,sync{}", level, -1); // Case 1: sync{enter} success = false; level = 0; try { Object o = new Object(); level++; synchronized(o) { level++; monitorEnter(o); level--; } level--; decLevels(o); } catch (IllegalMonitorStateException e) { if (level == -1) { success = true; } } passIf(success, "sync{enter}", level, -1); // Case 2: sync{sync{enter}} success = false; level = 0; try { Object o = new Object(); level++; synchronized(o) { level++; synchronized(o) { level++; monitorEnter(o); level--; } level--; } level--; decLevels(o); } catch (IllegalMonitorStateException e) { if (level == -1) { success = true; } } passIf(success, "sync{sync{enter}}", level, -1); // Case 3: sync{sync{enter,enter}} success = false; level = 0; try { Object o = new Object(); level++; synchronized(o) { level++; synchronized(o) { level++; monitorEnter(o); monitorEnter(o); level--; } level--; } level--; decLevels(o); } catch (IllegalMonitorStateException e) { if (level == -2) { success = true; } } passIf(success, "sync{sync{enter,enter}}", level, -2); // Case 4: sync{sync{enter,enter,enter}} success = false; level = 0; try { Object o = new Object(); level++; synchronized(o) { level++; synchronized(o) { level++; monitorEnter(o); monitorEnter(o); monitorEnter(o); level--; } level--; } level--; decLevels(o); } catch (IllegalMonitorStateException e) { if (level == -3) { success = true; } } passIf(success, "sync{sync{enter,enter,enter}}", level, -3); // Case 5: sync{exit,enter,enter} success = false; level = 0; try { Object o = new Object(); level++; synchronized(o) { level++; monitorExit(o); monitorEnter(o); monitorEnter(o); level--; } level--; decLevels(o); } catch (IllegalMonitorStateException e) { if (level == -1) { success = true; } } passIf(success, "sync{exit,enter,enter}", level, -1); // Case 6: sync{sync{exit,enter,enter}} success = false; level = 0; try { Object o = new Object(); level++; synchronized(o) { level++; synchronized(o) { level++; monitorExit(o); monitorEnter(o); monitorEnter(o); level--; } level--; } level--; decLevels(o); } catch (IllegalMonitorStateException e) { if (level == -1) { success = true; } } passIf(success, "sync{sync{exit,enter,enter}}", level, -1); // Case 7: sync{sync{exit},enter,enter} success = false; level = 0; try { Object o = new Object(); level++; synchronized(o) { level++; synchronized(o) { level++; monitorExit(o); level--; } monitorEnter(o); monitorEnter(o); level--; } level--; decLevels(o); } catch (IllegalMonitorStateException e) { if (level == -1) { success = true; } } passIf(success, "sync{sync{exit},enter,enter}", level, -1); //==================================================================== // Excess monitorenter on synchronized methods: // Case 0: enter,fsync{} success = false; level = 0; try { TestSync t = new TestSync(); monitorEnter(t); level++; t.syncF(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -1) { success = true; } } passIf(success, "enter,fsync{}", level, -1); // Case 1: fsync{enter} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFE(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -1) { success = true; } } passIf(success, "fsync{enter}", level, -1); // Case 2: fsync{fsync{enter}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFE(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -1) { success = true; } } passIf(success, "fsync{fsync{enter}}", level, -1); // Case 3: fsync{fsync{enter,enter}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFEE(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -2) { success = true; } } passIf(success, "fsync{fsync{enter,enter}}", level, -2); // Case 4: fsync{fsync{enter,enter,enter}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFEEE(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -3) { success = true; } } passIf(success, "fsync{fsync{enter,enter,enter}}", level, -3); // Case 5: fsync{exit,enter,enter} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFXEE(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -1) { success = true; } } passIf(success, "fsync{exit,enter,enter}", level, -1); // Case 5: fsync{enter,exit} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFEX(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "fsync{enter,exit}", level, 0); // Case 6: fsync{fsync{exit,enter,enter}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFXEE(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -1) { success = true; } } passIf(success, "fsync{fsync{exit,enter,enter}}", level, -1); // Case 6: fsync{fsync{enter,exit}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFEX(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "fsync{fsync{enter,exit}}", level, 0); // Case 7: fsync{fsync{exit},enter,enter} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFX_EE(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -1) { success = true; } } passIf(success, "fsync{fsync{exit},enter,enter}", level, -1); // Case 7: fsync{fsync{enter},exit} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFE_X(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "fsync{fsync{enter},exit}", level, 0); //==================================================================== // Excess monitorenter on a mixture of synchronized methods and blocks: // Case 1: sync{fsync{enter}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFE(); level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -1) { success = true; } } passIf(success, "sync{fsync{enter}}", level, -1); // Case 2: fsync{sync{enter}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSE(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -1) { success = true; } } passIf(success, "fsync{sync{enter}}", level, -1); // Case 3: sync{fsync{enter,enter}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFEE(); level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -2) { success = true; } } passIf(success, "sync{fsync{enter,enter}}", level, -2); // Case 4: fsync{sync{enter,enter}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFSEE(); level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -2) { success = true; } } passIf(success, "fsync{sync{enter,entre}}", level, -2); // Case 5: sync{fsync{enter,enter,enter}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFEEE(); level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -3) { success = true; } } passIf(success, "sync{fsync{enter,enter,enter}}", level, -3); // Case 6: fsync{sync{enter,enter,enter}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFSEEE(); level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -3) { success = true; } } passIf(success, "fsync{sync{enter,enter,enter}}", level, -3); // Case 7: sync{fsync{enter,exit}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFEX(); level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "sync{fsync{enter,exit}}", level, 0); // Case 8: fsync{sync{enter,exit}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFSXE(); level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "fsync{sync{enter,exit}}", level, 0); // Case 9: sync{fsync{enter},exit} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFE(); monitorExit(t); level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "sync{fsync{enter},exit}", level, 0); // Case 10: fsync{sync{enter},exit} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSE_X(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "fsync{sync{exit},enter}", level, 0); //==================================================================== // Excess monitorexit on a mixture of synchronized methods and blocks // with re-entrant syncs: // Case 1: sync{sync{sync{enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; synchronized(t) { level++; synchronized(t) { level++; monitorEnter(t); level--; } level--; } level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -1) { success = true; } } passIf(success, "sync{sync{sync{enter}}}", level, -1); // Case 2: sync{sync{fsync{enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; synchronized(t) { level++; t.syncFE(); level--; } level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -1) { success = true; } } passIf(success, "sync{sync{fsync{enter}}}", level, -1); // Case 3: sync{fync{sync{enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFSE(); level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -1) { success = true; } } passIf(success, "sync{fsync{sync{enter}}}", level, -1); // Case 4: sync{fync{fsync{enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFFE(); level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -1) { success = true; } } passIf(success, "sync{fsync{fsync{enter}}}", level, -1); // Case 5: fsync{sync{sync{enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSSE(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -1) { success = true; } } passIf(success, "fsync{sync{sync{enter}}}", level, -1); // Case 6: fsync{sync{fsync{enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSFE(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -1) { success = true; } } passIf(success, "fsync{sync{fsync{enter}}}", level, -1); // Case 7: fsync{fsync{sync{enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFSE(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -1) { success = true; } } passIf(success, "fsync{fsync{sync{enter}}}", level, -1); // Case 8: fsync{fsync{fsync{enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFFE(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -1) { success = true; } } passIf(success, "fsync{fsync{fsync{enter}}}", level, -1); // Case 9: sync{sync{sync{enter,enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; synchronized(t) { level++; synchronized(t) { level++; monitorEnter(t); monitorEnter(t); level--; } level--; } level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -2) { success = true; } } passIf(success, "sync{sync{sync{enter,enter}}}", level, -2); // Case 10: sync{sync{fsync{enter,enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; synchronized(t) { level++; t.syncFEE(); level--; } level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -2) { success = true; } } passIf(success, "sync{sync{fsync{enter,enter}}}", level, -2); // Case 11: sync{fync{sync{enter,enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFSEE(); level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -2) { success = true; } } passIf(success, "sync{fsync{sync{enter,enter}}}", level, -2); // Case 12: sync{fync{fsync{enter,enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFFEE(); level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -2) { success = true; } } passIf(success, "sync{fsync{fsync{enter,enter}}}", level, -2); // Case 13: fsync{sync{sync{enter,enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSSEE(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -2) { success = true; } } passIf(success, "fsync{sync{sync{enter,enter}}}", level, -2); // Case 14: fsync{sync{fsync{enter,enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSFEE(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -2) { success = true; } } passIf(success, "fsync{sync{fsync{enter,enter}}}", level, -2); // Case 15: fsync{fsync{sync{enter,enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFSEE(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -2) { success = true; } } passIf(success, "fsync{fsync{sync{enter,enter}}}", level, -2); // Case 16: fsync{fsync{fsync{enter,enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFFEE(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -2) { success = true; } } passIf(success, "fsync{fsync{fsync{enter,enter}}}", level, -2); // Case 17: sync{sync{sync{enter,enter,enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; synchronized(t) { level++; synchronized(t) { level++; monitorEnter(t); monitorEnter(t); monitorEnter(t); level--; } level--; } level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -3) { success = true; } } passIf(success, "sync{sync{sync{enter,enter,enter}}}", level, -3); // Case 18: sync{sync{fsync{enter,enter,enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; synchronized(t) { level++; t.syncFEEE(); level--; } level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -3) { success = true; } } passIf(success, "sync{sync{fsync{enter,enter,enter}}}", level, -3); // Case 19: sync{fync{sync{enter,enter,enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFSEEE(); level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -3) { success = true; } } passIf(success, "sync{fsync{sync{enter,enter,enter}}}", level, -3); // Case 20: sync{fync{fsync{enter,enter,enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFFEEE(); level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -3) { success = true; } } passIf(success, "sync{fsync{fsync{enter,enter,enter}}}", level, -3); // Case 21: fsync{sync{sync{enter,enter,enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSSEEE(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -3) { success = true; } } passIf(success, "fsync{sync{sync{enter,enter,enter}}}", level, -3); // Case 22: fsync{sync{fsync{enter,enter,enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSFEEE(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -3) { success = true; } } passIf(success, "fsync{sync{fsync{enter,enter,enter}}}", level, -3); // Case 23: fsync{fsync{sync{enter,enter,enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFSEEE(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -3) { success = true; } } passIf(success, "fsync{fsync{sync{enter,enter,enter}}}", level, -3); // Case 24: fsync{fsync{fsync{enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFFEEE(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -3) { success = true; } } passIf(success, "fsync{fsync{fsync{enter,enter,enter}}}", level, -3); // Case 25: sync{sync{sync{enter,exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; synchronized(t) { level++; synchronized(t) { level++; monitorEnter(t); monitorExit(t); level--; } level--; } level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "sync{sync{sync{enter,exit}}}", level, 0); // Case 26: sync{sync{fsync{enter,exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; synchronized(t) { level++; t.syncFEX(); level--; } level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "sync{sync{fsync{enter,exit}}}", level, 0); // Case 27: sync{fync{sync{enter,exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFSEX(); level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "sync{fsync{sync{enter,exit}}}", level, 0); // Case 28: sync{fync{fsync{enter,exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFFEX(); level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "sync{fsync{fsync{enter,exit}}}", level, 0); // Case 29: fsync{sync{sync{enter,exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSSEX(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "fsync{sync{sync{enter,exit}}}", level, 0); // Case 30: fsync{sync{fsync{enter,exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSFEX(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "fsync{sync{fsync{enter,exit}}}", level, 0); // Case 31: fsync{fsync{sync{enter,exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFSEX(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "fsync{fsync{sync{enter,exit}}}", level, 0); // Case 32: fsync{fsync{fsync{enter,exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFFEX(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "fsync{fsync{fsync{enter,exit}}}", level, 0); // Case 33: sync{sync{sync{enter},exit}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; synchronized(t) { level++; synchronized(t) { level++; monitorEnter(t); level--; } monitorExit(t); level--; } level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "sync{sync{sync{enter},exit}}", level, 0); // Case 34: sync{sync{fsync{enter},exit}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; synchronized(t) { level++; t.syncFE(); level--; } monitorExit(t); level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "sync{sync{fsync{enter},exit}}", level, 0); // Case 35: sync{fync{sync{enter},exit}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFSE_X(); level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "sync{fsync{sync{enter},exit}}", level, 0); // Case 36: sync{fync{fsync{enter},exit}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFFE_X(); level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "sync{fsync{fsync{enter},exit}}", level, 0); // Case 37: fsync{sync{sync{enter},exit}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSSE_X(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "fsync{sync{sync{enter},exit}}", level, 0); // Case 38: fsync{sync{fsync{enter},exit}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSFE_X(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "fsync{sync{fsync{enter},exit}}", level, 0); // Case 39: fsync{fsync{sync{enter},exit}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFSE_X(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "fsync{fsync{sync{enter},exit}}", level, 0); // Case 40: fsync{fsync{fsync{enter},exit}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFFE_X(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "fsync{fsync{fsync{enter},exit}}", level, 0); // Case 41: sync{sync{sync{enter}},exit} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; synchronized(t) { level++; synchronized(t) { level++; monitorEnter(t); level--; } level--; } monitorExit(t); level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "sync{sync{sync{enter}},exit}", level, 0); // Case 42: sync{sync{fsync{enter}},exit} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; synchronized(t) { level++; t.syncFE(); level--; } monitorExit(t); level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "sync{sync{fsync{enter}},exit}", level, 0); // Case 43: sync{fync{sync{enter}},exit} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFSE(); monitorExit(t); level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "sync{fsync{sync{enter}},exit}", level, 0); // Case 44: sync{fync{fsync{enter}},exit} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFFE(); monitorExit(t); level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "sync{fsync{fsync{enter}},exit}", level, 0); // Case 45: fsync{sync{sync{enter}},exit} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSSE__X(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "fsync{sync{sync{enter}},exit}", level, 0); // Case 46: fsync{sync{fsync{enter}},exit} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSFE__X(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "fsync{sync{fsync{enter}},exit}", level, 0); // Case 47: fsync{fsync{sync{enter}},exit} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFSE__X(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "fsync{fsync{sync{enter}},exit}", level, 0); // Case 48: fsync{fsync{fsync{enter}},exit} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFFE__X(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "fsync{fsync{fsync{enter}},exit}", level, 0); //==================================================================== // Inflation Test: //==================================================================== // Excess monitorexit on synchronized blocks: // Case 1: sync{inflate,enter} success = false; level = 0; try { Object o = new Object(); level++; synchronized(o) { level++; inflate(o); monitorEnter(o); level--; } level--; decLevels(o); } catch (IllegalMonitorStateException e) { if (level == -1) { success = true; } } passIf(success, "sync{inflate,enter}", level, -1); // Case 2: sync{sync{inflate,enter}} success = false; level = 0; try { Object o = new Object(); level++; synchronized(o) { level++; synchronized(o) { level++; inflate(o); monitorEnter(o); level--; } level--; } level--; decLevels(o); } catch (IllegalMonitorStateException e) { if (level == -1) { success = true; } } passIf(success, "sync{sync{inflate,enter}}", level, -1); // Case 2a: sync{inflate,sync{enter}} success = false; level = 0; try { Object o = new Object(); level++; synchronized(o) { level++; inflate(o); synchronized(o) { level++; monitorEnter(o); level--; } level--; } level--; decLevels(o); } catch (IllegalMonitorStateException e) { if (level == -1) { success = true; } } passIf(success, "sync{inflate,sync{enter}}", level, -1); // Case 3: sync{sync{inflate,enter,enter}} success = false; level = 0; try { Object o = new Object(); level++; synchronized(o) { level++; synchronized(o) { level++; inflate(o); monitorEnter(o); monitorEnter(o); level--; } level--; } level--; decLevels(o); } catch (IllegalMonitorStateException e) { if (level == -2) { success = true; } } passIf(success, "sync{sync{inflate,enter,enter}}", level, -2); // Case 3a: sync{sync{enter,inflate,enter}} success = false; level = 0; try { Object o = new Object(); level++; synchronized(o) { level++; synchronized(o) { level++; monitorEnter(o); inflate(o); monitorEnter(o); level--; } level--; } level--; decLevels(o); } catch (IllegalMonitorStateException e) { if (level == -2) { success = true; } } passIf(success, "sync{sync{enter,inflate,enter}}", level, -2); // Case 3b: sync{inflate,sync{enter,enter}} success = false; level = 0; try { Object o = new Object(); level++; synchronized(o) { level++; inflate(o); synchronized(o) { level++; monitorEnter(o); monitorEnter(o); level--; } level--; } level--; decLevels(o); } catch (IllegalMonitorStateException e) { if (level == -2) { success = true; } } passIf(success, "sync{inflate,sync{enter,enter}}", level, -2); // Case 4: sync{sync{inflate,enter,enter,enter}} success = false; level = 0; try { Object o = new Object(); level++; synchronized(o) { level++; synchronized(o) { level++; inflate(o); monitorEnter(o); monitorEnter(o); monitorEnter(o); level--; } level--; } level--; decLevels(o); } catch (IllegalMonitorStateException e) { if (level == -3) { success = true; } } passIf(success, "sync{sync{inflate,enter,enter,enter}}", level, -3); // Case 4: sync{sync{enter,inflate,enter,enter}} success = false; level = 0; try { Object o = new Object(); level++; synchronized(o) { level++; synchronized(o) { level++; monitorEnter(o); inflate(o); monitorEnter(o); monitorEnter(o); level--; } level--; } level--; decLevels(o); } catch (IllegalMonitorStateException e) { if (level == -3) { success = true; } } passIf(success, "sync{sync{enter,inflate,enter,enter}}", level, -3); // Case 4: sync{sync{enter,inflate,enter,enter}} success = false; level = 0; try { Object o = new Object(); level++; synchronized(o) { level++; inflate(o); synchronized(o) { level++; monitorEnter(o); monitorEnter(o); monitorEnter(o); level--; } level--; } level--; decLevels(o); } catch (IllegalMonitorStateException e) { if (level == -3) { success = true; } } passIf(success, "sync{inflate,sync{enter,enter,enter}}", level, -3); // Case 5: sync{inflate,enter,exit} success = false; level = 0; try { Object o = new Object(); level++; synchronized(o) { level++; inflate(o); monitorEnter(o); monitorExit(o); level--; } level--; decLevels(o); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "sync{inflate,enter,exit}", level, 0); // Case 6: sync{sync{inflate,enter,exit}} success = false; level = 0; try { Object o = new Object(); level++; synchronized(o) { level++; synchronized(o) { level++; inflate(o); monitorEnter(o); monitorExit(o); level--; } level--; } level--; decLevels(o); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "sync{sync{inflate,enter,exit}}", level, 0); // Case 6: sync{sync{enter,inflate,exit}} success = false; level = 0; try { Object o = new Object(); level++; synchronized(o) { level++; synchronized(o) { level++; monitorEnter(o); inflate(o); monitorExit(o); level--; } level--; } level--; decLevels(o); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "sync{sync{enter,inflate,exit}}", level, 0); // Case 6: sync{sync{enter,exit,inflate}} success = false; level = 0; try { Object o = new Object(); level++; synchronized(o) { level++; synchronized(o) { level++; monitorEnter(o); monitorExit(o); inflate(o); level--; } level--; } level--; decLevels(o); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "sync{sync{enter,exit,inflate}}", level, 0); // Case 6: sync{inflate,sync{enter,exit}} success = false; level = 0; try { Object o = new Object(); level++; synchronized(o) { level++; inflate(o); synchronized(o) { level++; monitorEnter(o); monitorExit(o); level--; } level--; } level--; decLevels(o); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "sync{inflate,sync{enter,exit}}", level, 0); // Case 6: sync{sync{enter,exit},inflate} success = false; level = 0; try { Object o = new Object(); level++; synchronized(o) { level++; synchronized(o) { level++; monitorEnter(o); monitorExit(o); level--; } inflate(o); level--; } level--; decLevels(o); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "sync{sync{enter,exit},inflate}", level, 0); // Case 7: sync{sync{inflated,enter},exit} success = false; level = 0; try { Object o = new Object(); level++; synchronized(o) { level++; synchronized(o) { level++; inflate(o); monitorEnter(o); level--; } monitorExit(o); level--; } level--; decLevels(o); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "sync{sync{inflated,enter},exit}", level, 0); // Case 7: sync{inflated,sync{enter},exit} success = false; level = 0; try { Object o = new Object(); level++; synchronized(o) { level++; inflate(o); synchronized(o) { level++; monitorEnter(o); level--; } monitorExit(o); level--; } level--; decLevels(o); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "sync{inflated,sync{enter},exit}", level, 0); // Case 7: sync{sync{enter},exit,inflated} success = false; level = 0; try { Object o = new Object(); level++; synchronized(o) { level++; synchronized(o) { level++; monitorEnter(o); level--; } monitorExit(o); inflate(o); level--; } level--; decLevels(o); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "sync{sync{enter},exit,inflated}", level, 0); //==================================================================== // Excess monitorenter on synchronized methods: // Case 1: fsync{inflate,enter} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFIE(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -1) { success = true; } } passIf(success, "fsync{inflate,enter}", level, -1); // Case 2: fsync{fsync{inflate,enter}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFIE(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -1) { success = true; } } passIf(success, "fsync{fsync{inflate,enter}}", level, -1); // Case 2: fsync{fsync{enter,inflate}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFEI(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -1) { success = true; } } passIf(success, "fsync{fsync{enter,inflate}}", level, -1); // Case 2: fsync{inflate,fsync{enter}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFIFE(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -1) { success = true; } } passIf(success, "fsync{inflate,fsync{enter}}", level, -1); // Case 3: fsync{fsync{inflate,enter,enter}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFIEE(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -2) { success = true; } } passIf(success, "fsync{fsync{inflate,enter,enter}}", level, -2); // Case 3: fsync{fsync{enter,inflate,enter}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFEIE(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -2) { success = true; } } passIf(success, "fsync{fsync{enter,inflate,enter}}", level, -2); // Case 3: fsync{inflate,fsync{enter,enter}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFIFEE(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -2) { success = true; } } passIf(success, "fsync{inflate,fsync{enter,enter}}", level, -2); // Case 4: fsync{fsync{inflate,enter,enter,enter}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFIEEE(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -3) { success = true; } } passIf(success, "fsync{fsync{inflate,enter,enter,enter}}", level, -3); // Case 4: fsync{fsync{enter,inflate,enter,enter}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFEIEE(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -3) { success = true; } } passIf(success, "fsync{fsync{enter,inflate,enter,enter}}", level, -3); // Case 4: fsync{inflate,fsync{enter,enter,enter}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFIFEEE(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -3) { success = true; } } passIf(success, "fsync{inflate,fsync{enter,enter,enter}}", level, -3); // Case 5: fsync{inflate,enter,exit} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFIEX(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "fsync{inflate,enter,exit}", level, 0); // Case 5: fsync{enter,exit,inflate} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFEXI(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "fsync{enter,exit,inflate}", level, 0); // Case 6: fsync{fsync{inflate,enter,exit}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFIEX(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "fsync{fsync{inflate,enter,exit}}", level, 0); // Case 6: fsync{fsync{enter,inflate,exit}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFEIX(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "fsync{fsync{enter,inflate,exit}}", level, 0); // Case 6: fsync{fsync{enter,exit,inflate}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFEXI(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "fsync{fsync{enter,exit,inflate}}", level, 0); // Case 6: fsync{inflate,fsync{enter,exit}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFIFEX(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "fsync{inflate,fsync{enter,exit}}", level, 0); // Case 6: fsync{fsync{enter,exit},inflate} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFEX_I(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "fsync{fsync{enter,exit},inflate}", level, 0); // Case 7: fsync{fsync{inflate,enter},exit} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFIE_X(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "fsync{fsync{inflate,enter},exit}", level, 0); // Case 7: fsync{fsync{enter,inflate},exit} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFEI_X(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "fsync{fsync{enter,inflate},exit}", level, 0); // Case 7: fsync{inflate,fsync{enter},exit} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFIFE_X(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "fsync{inflate,fsync{enter},exit}", level, 0); // Case 7: fsync{fsync{enter},exit,inflate} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFE_XI(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "fsync{fsync{enter},exit,inflate}", level, 0); /* //==================================================================== // Excess monitorexit on a mixture of synchronized methods and blocks: // Case 1: sync{fsync{enter}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFE(); level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -1) { success = true; } } passIf(success, "sync{fsync{enter}}", level, -1); // Case 2: fsync{sync{enter}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSE(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -1) { success = true; } } passIf(success, "fsync{sync{enter}}", level, -1); // Case 3: sync{fsync{enter,enter}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFEE(); level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -2) { success = true; } } passIf(success, "sync{fsync{enter,enter}}", level, -2); // Case 4: fsync{sync{enter,enter}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFSEE(); level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -2) { success = true; } } passIf(success, "fsync{sync{enter,enter}}", level, -2); // Case 5: sync{fsync{enter,enter,enter}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFEEE(); level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -3) { success = true; } } passIf(success, "sync{fsync{enter,enter,enter}}", level, -3); // Case 6: fsync{sync{enter,enter,enter}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFSEEE(); level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -3) { success = true; } } passIf(success, "fsync{sync{enter,enter,enter}}", level, -3); // Case 7: sync{fsync{enter,exit}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFEX(); level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "sync{fsync{enter,exit}}", level, 0); // Case 8: fsync{sync{enter,exit}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFSEX(); level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "fsync{sync{enter,exit}}", level, 0); // Case 9: sync{fsync{enter},exit} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFE(); monitorExit(t); level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "sync{fsync{enter},exit}", level, 0); // Case 10: fsync{sync{enter},exit} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSE_X(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "fsync{sync{enter},exit}", level, 0); */ //==================================================================== // Excess monitorenter on a mixture of synchronized methods and blocks // with re-entrant syncs: // Case 1: sync{sync{sync{inflate,enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; synchronized(t) { level++; synchronized(t) { level++; inflate(t); monitorEnter(t); level--; } level--; } level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -1) { success = true; } } passIf(success, "sync{sync{sync{inflate,enter}}}", level, -1); // Case 2: sync{sync{fsync{inflate,enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; synchronized(t) { level++; t.syncFIE(); level--; } level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -1) { success = true; } } passIf(success, "sync{sync{fsync{inflate,enter}}}", level, -1); // Case 3: sync{fync{sync{inflate,enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFSIE(); level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -1) { success = true; } } passIf(success, "sync{fsync{sync{inflate,enter}}}", level, -1); // Case 4: sync{fync{fsync{inflate,enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFFIE(); level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -1) { success = true; } } passIf(success, "sync{fsync{fsync{inflate,enter}}}", level, -1); // Case 5: fsync{sync{sync{inflate,enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSSIE(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -1) { success = true; } } passIf(success, "fsync{sync{sync{inflate,enter}}}", level, -1); // Case 6: fsync{sync{fsync{inflate,enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSFIE(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -1) { success = true; } } passIf(success, "fsync{sync{fsync{inflate,enter}}}", level, -1); // Case 7: fsync{fsync{sync{inflate,enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFSIE(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -1) { success = true; } } passIf(success, "fsync{fsync{sync{inflate,enter}}}", level, -1); // Case 8: fsync{fsync{fsync{inflate,enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFFIE(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -1) { success = true; } } passIf(success, "fsync{fsync{fsync{inflate,enter}}}", level, -1); // Case 1: sync{sync{inflate,sync{enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; synchronized(t) { level++; inflate(t); synchronized(t) { level++; monitorEnter(t); level--; } level--; } level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -1) { success = true; } } passIf(success, "sync{sync{inflate,sync{enter}}}", level, -1); // Case 2: sync{sync{inflate,fsync{enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; synchronized(t) { level++; inflate(t); t.syncFE(); level--; } level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -1) { success = true; } } passIf(success, "sync{sync{inflate,fsync{enter}}}", level, -1); // Case 3: sync{fync{inflate,sync{enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFISE(); level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -1) { success = true; } } passIf(success, "sync{fsync{inflate,sync{enter}}}", level, -1); // Case 4: sync{fync{inflate,fsync{enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFIFE(); level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -1) { success = true; } } passIf(success, "sync{fsync{inflate,fsync{enter}}}", level, -1); // Case 5: fsync{sync{inflate,sync{enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSISE(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -1) { success = true; } } passIf(success, "fsync{sync{inflate,sync{enter}}}", level, -1); // Case 6: fsync{sync{inflate,fsync{enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSIFE(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -1) { success = true; } } passIf(success, "fsync{sync{inflate,fsync{enter}}}", level, -1); // Case 7: fsync{fsync{inflate,sync{enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFISE(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -1) { success = true; } } passIf(success, "fsync{fsync{inflate,sync{enter}}}", level, -1); // Case 8: fsync{fsync{inflate,fsync{enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFIFE(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -1) { success = true; } } passIf(success, "fsync{fsync{inflate,fsync{enter}}}", level, -1); // Case 1: sync{inflate,sync{sync{enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; inflate(t); synchronized(t) { level++; synchronized(t) { level++; monitorEnter(t); level--; } level--; } level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -1) { success = true; } } passIf(success, "sync{inflate,sync{sync{enter}}}", level, -1); // Case 2: sync{inflate,sync{fsync{enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; inflate(t); synchronized(t) { level++; t.syncFE(); level--; } level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -1) { success = true; } } passIf(success, "sync{inflate,sync{fsync{enter}}}", level, -1); // Case 3: sync{inflate,fync{sync{enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; inflate(t); t.syncFSE(); level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -1) { success = true; } } passIf(success, "sync{inflate,fsync{sync{enter}}}", level, -1); // Case 4: sync{inflate,fync{fsync{enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; inflate(t); t.syncFIFE(); level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -1) { success = true; } } passIf(success, "sync{inflate,fsync{fsync{enter}}}", level, -1); // Case 5: fsync{inflate,sync{sync{enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFISSE(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -1) { success = true; } } passIf(success, "fsync{inflate,sync{sync{enter}}}", level, -1); // Case 6: fsync{inflate,sync{fsync{enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFISFE(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -1) { success = true; } } passIf(success, "fsync{inflate,sync{fsync{enter}}}", level, -1); // Case 7: fsync{inflate,fsync{sync{enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFIFSE(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -1) { success = true; } } passIf(success, "fsync{inflate,fsync{sync{enter}}}", level, -1); // Case 8: fsync{inflate,fsync{fsync{enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFIFFE(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -1) { success = true; } } passIf(success, "fsync{inflate,fsync{fsync{enter}}}", level, -1); /* // Case 9: sync{sync{sync{enter,enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; synchronized(t) { level++; synchronized(t) { level++; monitorEnter(t); monitorEnter(t); level--; } level--; } level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -2) { success = true; } } passIf(success, "sync{sync{sync{enter,enter}}}", level, -2); // Case 10: sync{sync{fsync{enter,enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; synchronized(t) { level++; t.syncFEE(); level--; } level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -2) { success = true; } } passIf(success, "sync{sync{fsync{enter,enter}}}", level, -2); // Case 11: sync{fync{sync{enter,enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFSEE(); level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -2) { success = true; } } passIf(success, "sync{fsync{sync{enter,enter}}}", level, -2); // Case 12: sync{fync{fsync{enter,enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFFEE(); level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -2) { success = true; } } passIf(success, "sync{fsync{fsync{enter,enter}}}", level, -2); // Case 13: fsync{sync{sync{enter,enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSSEE(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -2) { success = true; } } passIf(success, "fsync{sync{sync{enter,enter}}}", level, -2); // Case 14: fsync{sync{fsync{enter,enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSFEE(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -2) { success = true; } } passIf(success, "fsync{sync{fsync{enter,enter}}}", level, -2); // Case 15: fsync{fsync{sync{enter,enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFSEE(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -2) { success = true; } } passIf(success, "fsync{fsync{sync{enter,enter}}}", level, -2); // Case 16: fsync{fsync{fsync{enter,enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFFEE(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -2) { success = true; } } passIf(success, "fsync{fsync{fsync{enter,enter}}}", level, -2); // Case 17: sync{sync{sync{enter,enter,enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; synchronized(t) { level++; synchronized(t) { level++; monitorEnter(t); monitorEnter(t); monitorEnter(t); level--; } level--; } level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -3) { success = true; } } passIf(success, "sync{sync{sync{enter,enter,enter}}}", level, -3); // Case 18: sync{sync{fsync{enter,enter,enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; synchronized(t) { level++; t.syncFEEE(); level--; } level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -3) { success = true; } } passIf(success, "sync{sync{fsync{enter,enter,enter}}}", level, -3); // Case 19: sync{fync{sync{enter,enter,enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFSEEE(); level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -3) { success = true; } } passIf(success, "sync{fsync{sync{enter,enter,enter}}}", level, -3); // Case 20: sync{fync{fsync{enter,enter,enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFFEEE(); level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -3) { success = true; } } passIf(success, "sync{fsync{fsync{enter,enter,enter}}}", level, -3); // Case 21: fsync{sync{sync{enter,enter,enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSSEEE(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -3) { success = true; } } passIf(success, "fsync{sync{sync{enter,enter,enter}}}", level, -3); // Case 22: fsync{sync{fsync{enter,enter,enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSFEEE(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -3) { success = true; } } passIf(success, "fsync{sync{fsync{enter,enter,enter}}}", level, -3); // Case 23: fsync{fsync{sync{enter,enter,enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFSEEE(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -3) { success = true; } } passIf(success, "fsync{fsync{sync{enter,enter,enter}}}", level, -3); // Case 24: fsync{fsync{fsync{enter}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFFEEE(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == -3) { success = true; } } passIf(success, "fsync{fsync{fsync{enter,enter,enter}}}", level, -3); // Case 25: sync{sync{sync{enter,exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; synchronized(t) { level++; synchronized(t) { level++; monitorEnter(t); monitorExit(t); level--; } level--; } level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "sync{sync{sync{enter,exit}}}", level, 0); // Case 26: sync{sync{fsync{enter,exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; synchronized(t) { level++; t.syncFXE(); level--; } level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "sync{sync{fsync{enter,exit}}}", level, 0); // Case 27: sync{fync{sync{enter,exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFSXE(); level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "sync{fsync{sync{enter,exit}}}", level, 0); // Case 28: sync{fync{fsync{enter,exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFFXE(); level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "sync{fsync{fsync{enter,exit}}}", level, 0); // Case 29: fsync{sync{sync{enter,exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSSXE(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "fsync{sync{sync{enter,exit}}}", level, 0); // Case 30: fsync{sync{fsync{enter,exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSFXE(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "fsync{sync{fsync{enter,exit}}}", level, 0); // Case 31: fsync{fsync{sync{enter,exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFSXE(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "fsync{fsync{sync{enter,exit}}}", level, 0); // Case 32: fsync{fsync{fsync{enter,exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFFXE(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "fsync{fsync{fsync{enter,exit}}}", level, 0); // Case 33: sync{sync{sync{enter},exit}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; synchronized(t) { level++; synchronized(t) { level++; monitorEnter(t); level--; } monitorExit(t); level--; } level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "sync{sync{sync{enter},exit}}", level, 0); // Case 34: sync{sync{fsync{enter},exit}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; synchronized(t) { level++; t.syncFX(); level--; } monitorExit(t); level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "sync{sync{fsync{enter},exit}}", level, 0); // Case 35: sync{fync{sync{enter},exit}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFSX_E(); level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "sync{fsync{sync{enter},exit}}", level, 0); // Case 36: sync{fync{fsync{enter},exit}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFFX_E(); level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "sync{fsync{fsync{enter},exit}}", level, 0); // Case 37: fsync{sync{sync{enter},exit}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSSX_E(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "fsync{sync{sync{enter},exit}}", level, 0); // Case 38: fsync{sync{fsync{enter},exit}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSFX_E(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "fsync{sync{fsync{enter},exit}}", level, 0); // Case 39: fsync{fsync{sync{enter},exit}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFSX_E(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "fsync{fsync{sync{enter},exit}}", level, 0); // Case 40: fsync{fsync{fsync{enter},exit}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFFX_E(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "fsync{fsync{fsync{enter},exit}}", level, 0); // Case 41: sync{sync{sync{enter}},exit} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; synchronized(t) { level++; synchronized(t) { level++; monitorEnter(t); level--; } level--; } monitorExit(t); level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "sync{sync{sync{enter}},exit}", level, 0); // Case 42: sync{sync{fsync{enter}},exit} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; synchronized(t) { level++; t.syncFX(); level--; } monitorExit(t); level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "sync{sync{fsync{enter}},exit}", level, 0); // Case 43: sync{fync{sync{enter}},exit} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFSX(); monitorExit(t); level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "sync{fsync{sync{enter}},exit}", level, 0); // Case 44: sync{fync{fsync{enter}},exit} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFFX(); monitorExit(t); level--; } level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "sync{fsync{fsync{enter}},exit}", level, 0); // Case 45: fsync{sync{sync{enter}},exit} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSSX__E(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "fsync{sync{sync{enter}},exit}", level, 0); // Case 46: fsync{sync{fsync{enter}},exit} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSFX__E(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "fsync{sync{fsync{enter}},exit}", level, 0); // Case 47: fsync{fsync{sync{enter}},exit} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFSX__E(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "fsync{fsync{sync{enter}},exit}", level, 0); // Case 48: fsync{fsync{fsync{enter}},exit} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFFX__E(); level--; decLevels(t); } catch (IllegalMonitorStateException e) { if (level == 0) { success = true; } } passIf(success, "fsync{fsync{fsync{enter}},exit}", level, 0); */ // } static void testExcessMonitorExit() { boolean success; System.out.println(""); System.out.println("Excess monitorexit tests:"); //==================================================================== // Excess monitorexit on synchronized blocks: // Case 1: sync{exit} success = false; level = 0; try { Object o = new Object(); level++; synchronized(o) { level++; monitorExit(o); level--; } level--; } catch (IllegalMonitorStateException e) { if (level == 1) { success = true; } } passIf(success, "sync{exit}", level, 1); // Case 2: sync{sync{exit}} success = false; level = 0; try { Object o = new Object(); level++; synchronized(o) { level++; synchronized(o) { level++; monitorExit(o); level--; } level--; } level--; } catch (IllegalMonitorStateException e) { if (level == 1) { success = true; } } passIf(success, "sync{sync{exit}}", level, 1); // Case 3: sync{sync{exit,exit}} success = false; level = 0; try { Object o = new Object(); level++; synchronized(o) { level++; synchronized(o) { level++; monitorExit(o); monitorExit(o); level--; } level--; } level--; } catch (IllegalMonitorStateException e) { if (level == 2) { success = true; } } passIf(success, "sync{sync{exit,exit}}", level, 2); // Case 4: sync{sync{exit,exit,exit}} success = false; level = 0; try { Object o = new Object(); level++; synchronized(o) { level++; synchronized(o) { level++; monitorExit(o); monitorExit(o); monitorExit(o); level--; } level--; } level--; } catch (IllegalMonitorStateException e) { if (level == 3) { success = true; } } passIf(success, "sync{sync{exit,exit,exit}}", level, 3); // Case 5: sync{exit,enter} success = true; level = 0; try { Object o = new Object(); level++; synchronized(o) { level++; monitorExit(o); monitorEnter(o); level--; } level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "sync{exit,enter}", level, 0); // Case 6: sync{sync{exit,enter}} success = true; level = 0; try { Object o = new Object(); level++; synchronized(o) { level++; synchronized(o) { level++; monitorExit(o); monitorEnter(o); level--; } level--; } level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "sync{sync{exit,enter}}", level, 0); // Case 7: sync{sync{exit},enter} success = true; level = 0; try { Object o = new Object(); level++; synchronized(o) { level++; synchronized(o) { level++; monitorExit(o); level--; } monitorEnter(o); level--; } level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "sync{sync{exit},enter}", level, 0); //==================================================================== // Excess monitorexit on synchronized methods: // Case 1: fsync{exit} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFX(); level--; } catch (IllegalMonitorStateException e) { if (level == 1) { success = true; } } passIf(success, "fsync{exit}", level, 1); // Case 2: fsync{fsync{exit}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFX(); level--; } catch (IllegalMonitorStateException e) { if (level == 1) { success = true; } } passIf(success, "fsync{fsync{exit}}", level, 1); // Case 3: fsync{fsync{exit,exit}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFXX(); level--; } catch (IllegalMonitorStateException e) { if (level == 2) { success = true; } } passIf(success, "fsync{fsync{exit,exit}}", level, 2); // Case 4: fsync{fsync{exit,exit,exit}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFXXX(); level--; } catch (IllegalMonitorStateException e) { if (level == 3) { success = true; } } passIf(success, "fsync{fsync{exit,exit,exit}}", level, 3); // Case 5: fsync{exit,enter} success = true; level = 0; try { TestSync t = new TestSync(); level++; t.syncFXE(); level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "fsync{exit,enter}", level, 0); // Case 6: fsync{fsync{exit,enter}} success = true; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFXE(); level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "fsync{fsync{exit,enter}}", level, 0); // Case 7: fsync{fsync{exit},enter} success = true; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFX_E(); level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "fsync{fsync{exit},enter}", level, 0); //==================================================================== // Excess monitorexit on a mixture of synchronized methods and blocks: // Case 1: sync{fsync{exit}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFX(); level--; } level--; } catch (IllegalMonitorStateException e) { if (level == 1) { success = true; } } passIf(success, "sync{fsync{exit}}", level, 1); // Case 2: fsync{sync{exit}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSX(); level--; } catch (IllegalMonitorStateException e) { if (level == 1) { success = true; } } passIf(success, "fsync{sync{exit}}", level, 1); // Case 3: sync{fsync{exit,exit}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFXX(); level--; } level--; } catch (IllegalMonitorStateException e) { if (level == 2) { success = true; } } passIf(success, "sync{fsync{exit,exit}}", level, 2); // Case 4: fsync{sync{exit,exit}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFSXX(); level--; } level--; } catch (IllegalMonitorStateException e) { if (level == 2) { success = true; } } passIf(success, "fsync{sync{exit,exit}}", level, 2); // Case 5: sync{fsync{exit,exit,exit}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFXXX(); level--; } level--; } catch (IllegalMonitorStateException e) { if (level == 3) { success = true; } } passIf(success, "sync{fsync{exit,exit,exit}}", level, 3); // Case 6: fsync{sync{exit,exit,exit}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFSXXX(); level--; } level--; } catch (IllegalMonitorStateException e) { if (level == 3) { success = true; } } passIf(success, "fsync{sync{exit,exit,exit}}", level, 3); // Case 7: sync{fsync{exit,enter}} success = true; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFXE(); level--; } level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "sync{fsync{exit,enter}}", level, 0); // Case 8: fsync{sync{exit,enter}} success = true; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFSXE(); level--; } level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "fsync{sync{exit,enter}}", level, 0); // Case 9: sync{fsync{exit},enter} success = true; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFX(); monitorEnter(t); level--; } level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "sync{fsync{exit},enter}", level, 0); // Case 10: fsync{sync{exit},enter} success = true; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSX_E(); level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "fsync{sync{exit},enter}", level, 0); //==================================================================== // Excess monitorexit on a mixture of synchronized methods and blocks // with re-entrant syncs: // Case 1: sync{sync{sync{exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; synchronized(t) { level++; synchronized(t) { level++; monitorExit(t); level--; } level--; } level--; } level--; } catch (IllegalMonitorStateException e) { if (level == 1) { success = true; } } passIf(success, "sync{sync{sync{exit}}}", level, 1); // Case 2: sync{sync{fsync{exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; synchronized(t) { level++; t.syncFX(); level--; } level--; } level--; } catch (IllegalMonitorStateException e) { if (level == 1) { success = true; } } passIf(success, "sync{sync{fsync{exit}}}", level, 1); // Case 3: sync{fync{sync{exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFSX(); level--; } level--; } catch (IllegalMonitorStateException e) { if (level == 1) { success = true; } } passIf(success, "sync{fsync{sync{exit}}}", level, 1); // Case 4: sync{fync{fsync{exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFFX(); level--; } level--; } catch (IllegalMonitorStateException e) { if (level == 1) { success = true; } } passIf(success, "sync{fsync{fsync{exit}}}", level, 1); // Case 5: fsync{sync{sync{exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSSX(); level--; } catch (IllegalMonitorStateException e) { if (level == 1) { success = true; } } passIf(success, "fsync{sync{sync{exit}}}", level, 1); // Case 6: fsync{sync{fsync{exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSFX(); level--; } catch (IllegalMonitorStateException e) { if (level == 1) { success = true; } } passIf(success, "fsync{sync{fsync{exit}}}", level, 1); // Case 7: fsync{fsync{sync{exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFSX(); level--; } catch (IllegalMonitorStateException e) { if (level == 1) { success = true; } } passIf(success, "fsync{fsync{sync{exit}}}", level, 1); // Case 8: fsync{fsync{fsync{exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFFX(); level--; } catch (IllegalMonitorStateException e) { if (level == 1) { success = true; } } passIf(success, "fsync{fsync{fsync{exit}}}", level, 1); // Case 9: sync{sync{sync{exit,exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; synchronized(t) { level++; synchronized(t) { level++; monitorExit(t); monitorExit(t); level--; } level--; } level--; } level--; } catch (IllegalMonitorStateException e) { if (level == 2) { success = true; } } passIf(success, "sync{sync{sync{exit,exit}}}", level, 2); // Case 10: sync{sync{fsync{exit,exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; synchronized(t) { level++; t.syncFXX(); level--; } level--; } level--; } catch (IllegalMonitorStateException e) { if (level == 2) { success = true; } } passIf(success, "sync{sync{fsync{exit,exit}}}", level, 2); // Case 11: sync{fync{sync{exit,exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFSXX(); level--; } level--; } catch (IllegalMonitorStateException e) { if (level == 2) { success = true; } } passIf(success, "sync{fsync{sync{exit,exit}}}", level, 2); // Case 12: sync{fync{fsync{exit,exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFFXX(); level--; } level--; } catch (IllegalMonitorStateException e) { if (level == 2) { success = true; } } passIf(success, "sync{fsync{fsync{exit,exit}}}", level, 2); // Case 13: fsync{sync{sync{exit,exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSSXX(); level--; } catch (IllegalMonitorStateException e) { if (level == 2) { success = true; } } passIf(success, "fsync{sync{sync{exit,exit}}}", level, 2); // Case 14: fsync{sync{fsync{exit,exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSFXX(); level--; } catch (IllegalMonitorStateException e) { if (level == 2) { success = true; } } passIf(success, "fsync{sync{fsync{exit,exit}}}", level, 2); // Case 15: fsync{fsync{sync{exit,exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFSXX(); level--; } catch (IllegalMonitorStateException e) { if (level == 2) { success = true; } } passIf(success, "fsync{fsync{sync{exit,exit}}}", level, 2); // Case 16: fsync{fsync{fsync{exit,exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFFXX(); level--; } catch (IllegalMonitorStateException e) { if (level == 2) { success = true; } } passIf(success, "fsync{fsync{fsync{exit,exit}}}", level, 2); // Case 17: sync{sync{sync{exit,exit,exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; synchronized(t) { level++; synchronized(t) { level++; monitorExit(t); monitorExit(t); monitorExit(t); level--; } level--; } level--; } level--; } catch (IllegalMonitorStateException e) { if (level == 3) { success = true; } } passIf(success, "sync{sync{sync{exit,exit,exit}}}", level, 3); // Case 18: sync{sync{fsync{exit,exit,exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; synchronized(t) { level++; t.syncFXXX(); level--; } level--; } level--; } catch (IllegalMonitorStateException e) { if (level == 3) { success = true; } } passIf(success, "sync{sync{fsync{exit,exit,exit}}}", level, 3); // Case 19: sync{fync{sync{exit,exit,exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFSXXX(); level--; } level--; } catch (IllegalMonitorStateException e) { if (level == 3) { success = true; } } passIf(success, "sync{fsync{sync{exit,exit,exit}}}", level, 3); // Case 20: sync{fync{fsync{exit,exit,exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFFXXX(); level--; } level--; } catch (IllegalMonitorStateException e) { if (level == 3) { success = true; } } passIf(success, "sync{fsync{fsync{exit,exit,exit}}}", level, 3); // Case 21: fsync{sync{sync{exit,exit,exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSSXXX(); level--; } catch (IllegalMonitorStateException e) { if (level == 3) { success = true; } } passIf(success, "fsync{sync{sync{exit,exit,exit}}}", level, 3); // Case 22: fsync{sync{fsync{exit,exit,exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSFXXX(); level--; } catch (IllegalMonitorStateException e) { if (level == 3) { success = true; } } passIf(success, "fsync{sync{fsync{exit,exit,exit}}}", level, 3); // Case 23: fsync{fsync{sync{exit,exit,exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFSXXX(); level--; } catch (IllegalMonitorStateException e) { if (level == 3) { success = true; } } passIf(success, "fsync{fsync{sync{exit,exit,exit}}}", level, 3); // Case 24: fsync{fsync{fsync{exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFFXXX(); level--; } catch (IllegalMonitorStateException e) { if (level == 3) { success = true; } } passIf(success, "fsync{fsync{fsync{exit,exit,exit}}}", level, 3); // Case 25: sync{sync{sync{exit,enter}}} success = true; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; synchronized(t) { level++; synchronized(t) { level++; monitorExit(t); monitorEnter(t); level--; } level--; } level--; } level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "sync{sync{sync{exit,enter}}}", level, 0); // Case 26: sync{sync{fsync{exit,enter}}} success = true; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; synchronized(t) { level++; t.syncFXE(); level--; } level--; } level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "sync{sync{fsync{exit,enter}}}", level, 0); // Case 27: sync{fync{sync{exit,enter}}} success = true; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFSXE(); level--; } level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "sync{fsync{sync{exit,enter}}}", level, 0); // Case 28: sync{fync{fsync{exit,enter}}} success = true; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFFXE(); level--; } level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "sync{fsync{fsync{exit,enter}}}", level, 0); // Case 29: fsync{sync{sync{exit,enter}}} success = true; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSSXE(); level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "fsync{sync{sync{exit,enter}}}", level, 0); // Case 30: fsync{sync{fsync{exit,enter}}} success = true; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSFXE(); level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "fsync{sync{fsync{exit,enter}}}", level, 0); // Case 31: fsync{fsync{sync{exit,enter}}} success = true; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFSXE(); level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "fsync{fsync{sync{exit,enter}}}", level, 0); // Case 32: fsync{fsync{fsync{exit,enter}}} success = true; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFFXE(); level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "fsync{fsync{fsync{exit,enter}}}", level, 0); // Case 33: sync{sync{sync{exit},enter}} success = true; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; synchronized(t) { level++; synchronized(t) { level++; monitorExit(t); level--; } monitorEnter(t); level--; } level--; } level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "sync{sync{sync{exit},enter}}", level, 0); // Case 34: sync{sync{fsync{exit},enter}} success = true; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; synchronized(t) { level++; t.syncFX(); level--; } monitorEnter(t); level--; } level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "sync{sync{fsync{exit},enter}}", level, 0); // Case 35: sync{fync{sync{exit},enter}} success = true; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFSX_E(); level--; } level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "sync{fsync{sync{exit},enter}}", level, 0); // Case 36: sync{fync{fsync{exit},enter}} success = true; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFFX_E(); level--; } level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "sync{fsync{fsync{exit},enter}}", level, 0); // Case 37: fsync{sync{sync{exit},enter}} success = true; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSSX_E(); level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "fsync{sync{sync{exit},enter}}", level, 0); // Case 38: fsync{sync{fsync{exit},enter}} success = true; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSFX_E(); level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "fsync{sync{fsync{exit},enter}}", level, 0); // Case 39: fsync{fsync{sync{exit},enter}} success = true; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFSX_E(); level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "fsync{fsync{sync{exit},enter}}", level, 0); // Case 40: fsync{fsync{fsync{exit},enter}} success = true; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFFX_E(); level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "fsync{fsync{fsync{exit},enter}}", level, 0); // Case 41: sync{sync{sync{exit}},enter} success = true; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; synchronized(t) { level++; synchronized(t) { level++; monitorExit(t); level--; } level--; } monitorEnter(t); level--; } level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "sync{sync{sync{exit}},enter}", level, 0); // Case 42: sync{sync{fsync{exit}},enter} success = true; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; synchronized(t) { level++; t.syncFX(); level--; } monitorEnter(t); level--; } level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "sync{sync{fsync{exit}},enter}", level, 0); // Case 43: sync{fync{sync{exit}},enter} success = true; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFSX(); monitorEnter(t); level--; } level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "sync{fsync{sync{exit}},enter}", level, 0); // Case 44: sync{fync{fsync{exit}},enter} success = true; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFFX(); monitorEnter(t); level--; } level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "sync{fsync{fsync{exit}},enter}", level, 0); // Case 45: fsync{sync{sync{exit}},enter} success = true; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSSX__E(); level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "fsync{sync{sync{exit}},enter}", level, 0); // Case 46: fsync{sync{fsync{exit}},enter} success = true; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSFX__E(); level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "fsync{sync{fsync{exit}},enter}", level, 0); // Case 47: fsync{fsync{sync{exit}},enter} success = true; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFSX__E(); level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "fsync{fsync{sync{exit}},enter}", level, 0); // Case 48: fsync{fsync{fsync{exit}},enter} success = true; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFFX__E(); level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "fsync{fsync{fsync{exit}},enter}", level, 0); //==================================================================== // Inflation Test: //==================================================================== // Excess monitorexit on synchronized blocks: // Case 1: sync{inflate,exit} success = false; level = 0; try { Object o = new Object(); level++; synchronized(o) { level++; inflate(o); monitorExit(o); level--; } level--; } catch (IllegalMonitorStateException e) { if (level == 1) { success = true; } } passIf(success, "sync{inflate,exit}", level, 1); // Case 2: sync{sync{inflate,exit}} success = false; level = 0; try { Object o = new Object(); level++; synchronized(o) { level++; synchronized(o) { level++; inflate(o); monitorExit(o); level--; } level--; } level--; } catch (IllegalMonitorStateException e) { if (level == 1) { success = true; } } passIf(success, "sync{sync{inflate,exit}}", level, 1); // Case 2a: sync{inflate,sync{exit}} success = false; level = 0; try { Object o = new Object(); level++; synchronized(o) { level++; inflate(o); synchronized(o) { level++; monitorExit(o); level--; } level--; } level--; } catch (IllegalMonitorStateException e) { if (level == 1) { success = true; } } passIf(success, "sync{inflate,sync{exit}}", level, 1); // Case 3: sync{sync{inflate,exit,exit}} success = false; level = 0; try { Object o = new Object(); level++; synchronized(o) { level++; synchronized(o) { level++; inflate(o); monitorExit(o); monitorExit(o); level--; } level--; } level--; } catch (IllegalMonitorStateException e) { if (level == 2) { success = true; } } passIf(success, "sync{sync{inflate,exit,exit}}", level, 2); // Case 3a: sync{sync{exit,inflate,exit}} success = false; level = 0; try { Object o = new Object(); level++; synchronized(o) { level++; synchronized(o) { level++; monitorExit(o); inflate(o); monitorExit(o); level--; } level--; } level--; } catch (IllegalMonitorStateException e) { if (level == 2) { success = true; } } passIf(success, "sync{sync{exit,inflate,exit}}", level, 2); // Case 3b: sync{inflate,sync{exit,exit}} success = false; level = 0; try { Object o = new Object(); level++; synchronized(o) { level++; inflate(o); synchronized(o) { level++; monitorExit(o); monitorExit(o); level--; } level--; } level--; } catch (IllegalMonitorStateException e) { if (level == 2) { success = true; } } passIf(success, "sync{inflate,sync{exit,exit}}", level, 2); // Case 4: sync{sync{inflate,exit,exit,exit}} success = false; level = 0; try { Object o = new Object(); level++; synchronized(o) { level++; synchronized(o) { level++; inflate(o); monitorExit(o); monitorExit(o); monitorExit(o); level--; } level--; } level--; } catch (IllegalMonitorStateException e) { if (level == 3) { success = true; } } passIf(success, "sync{sync{inflate,exit,exit,exit}}", level, 3); // Case 4: sync{sync{exit,inflate,exit,exit}} success = false; level = 0; try { Object o = new Object(); level++; synchronized(o) { level++; synchronized(o) { level++; monitorExit(o); inflate(o); monitorExit(o); monitorExit(o); level--; } level--; } level--; } catch (IllegalMonitorStateException e) { if (level == 3) { success = true; } } passIf(success, "sync{sync{exit,inflate,exit,exit}}", level, 3); // Case 4: sync{sync{exit,inflate,exit,exit}} success = false; level = 0; try { Object o = new Object(); level++; synchronized(o) { level++; inflate(o); synchronized(o) { level++; monitorExit(o); monitorExit(o); monitorExit(o); level--; } level--; } level--; } catch (IllegalMonitorStateException e) { if (level == 3) { success = true; } } passIf(success, "sync{inflate,sync{exit,exit,exit}}", level, 3); // Case 5: sync{inflate,exit,enter} success = true; level = 0; try { Object o = new Object(); level++; synchronized(o) { level++; inflate(o); monitorExit(o); monitorEnter(o); level--; } level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "sync{inflate,exit,enter}", level, 0); // Case 6: sync{sync{inflate,exit,enter}} success = true; level = 0; try { Object o = new Object(); level++; synchronized(o) { level++; synchronized(o) { level++; inflate(o); monitorExit(o); monitorEnter(o); level--; } level--; } level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "sync{sync{inflate,exit,enter}}", level, 0); // Case 6: sync{sync{exit,inflate,enter}} success = true; level = 0; try { Object o = new Object(); level++; synchronized(o) { level++; synchronized(o) { level++; monitorExit(o); inflate(o); monitorEnter(o); level--; } level--; } level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "sync{sync{exit,inflate,enter}}", level, 0); // Case 6: sync{sync{exit,enter,inflate}} success = true; level = 0; try { Object o = new Object(); level++; synchronized(o) { level++; synchronized(o) { level++; monitorExit(o); monitorEnter(o); inflate(o); level--; } level--; } level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "sync{sync{exit,enter,inflate}}", level, 0); // Case 6: sync{inflate,sync{exit,enter}} success = true; level = 0; try { Object o = new Object(); level++; synchronized(o) { level++; inflate(o); synchronized(o) { level++; monitorExit(o); monitorEnter(o); level--; } level--; } level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "sync{inflate,sync{exit,enter}}", level, 0); // Case 6: sync{sync{exit,enter},inflate} success = true; level = 0; try { Object o = new Object(); level++; synchronized(o) { level++; synchronized(o) { level++; monitorExit(o); monitorEnter(o); level--; } inflate(o); level--; } level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "sync{sync{exit,enter},inflate}", level, 0); // Case 7: sync{sync{inflated,exit},enter} success = true; level = 0; try { Object o = new Object(); level++; synchronized(o) { level++; synchronized(o) { level++; inflate(o); monitorExit(o); level--; } monitorEnter(o); level--; } level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "sync{sync{inflated,exit},enter}", level, 0); // Case 7: sync{inflated,sync{exit},enter} success = true; level = 0; try { Object o = new Object(); level++; synchronized(o) { level++; inflate(o); synchronized(o) { level++; monitorExit(o); level--; } monitorEnter(o); level--; } level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "sync{inflated,sync{exit},enter}", level, 0); // Case 7: sync{sync{exit},enter,inflated} success = true; level = 0; try { Object o = new Object(); level++; synchronized(o) { level++; synchronized(o) { level++; monitorExit(o); level--; } monitorEnter(o); inflate(o); level--; } level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "sync{sync{exit},enter,inflated}", level, 0); //==================================================================== // Excess monitorexit on synchronized methods: // Case 1: fsync{inflate,exit} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFIX(); level--; } catch (IllegalMonitorStateException e) { if (level == 1) { success = true; } } passIf(success, "fsync{inflate,exit}", level, 1); // Case 2: fsync{fsync{inflate,exit}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFIX(); level--; } catch (IllegalMonitorStateException e) { if (level == 1) { success = true; } } passIf(success, "fsync{fsync{inflate,exit}}", level, 1); // Case 2: fsync{fsync{exit,inflate}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFXI(); level--; } catch (IllegalMonitorStateException e) { if (level == 1) { success = true; } } passIf(success, "fsync{fsync{exit,inflate}}", level, 1); // Case 2: fsync{inflate,fsync{exit}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFIFX(); level--; } catch (IllegalMonitorStateException e) { if (level == 1) { success = true; } } passIf(success, "fsync{inflate,fsync{exit}}", level, 1); // Case 3: fsync{fsync{inflate,exit,exit}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFIXX(); level--; } catch (IllegalMonitorStateException e) { if (level == 2) { success = true; } } passIf(success, "fsync{fsync{inflate,exit,exit}}", level, 2); // Case 3: fsync{fsync{exit,inflate,exit}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFXIX(); level--; } catch (IllegalMonitorStateException e) { if (level == 2) { success = true; } } passIf(success, "fsync{fsync{exit,inflate,exit}}", level, 2); // Case 3: fsync{inflate,fsync{exit,exit}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFIFXX(); level--; } catch (IllegalMonitorStateException e) { if (level == 2) { success = true; } } passIf(success, "fsync{inflate,fsync{exit,exit}}", level, 2); // Case 4: fsync{fsync{inflate,exit,exit,exit}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFIXXX(); level--; } catch (IllegalMonitorStateException e) { if (level == 3) { success = true; } } passIf(success, "fsync{fsync{inflate,exit,exit,exit}}", level, 3); // Case 4: fsync{fsync{exit,inflate,exit,exit}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFXIXX(); level--; } catch (IllegalMonitorStateException e) { if (level == 3) { success = true; } } passIf(success, "fsync{fsync{exit,inflate,exit,exit}}", level, 3); // Case 4: fsync{inflate,fsync{exit,exit,exit}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFIFXXX(); level--; } catch (IllegalMonitorStateException e) { if (level == 3) { success = true; } } passIf(success, "fsync{inflate,fsync{exit,exit,exit}}", level, 3); // Case 5: fsync{inflate,exit,enter} success = true; level = 0; try { TestSync t = new TestSync(); level++; t.syncFIXE(); level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "fsync{inflate,exit,enter}", level, 0); // Case 5: fsync{exit,enter,inflate} success = true; level = 0; try { TestSync t = new TestSync(); level++; t.syncFXEI(); level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "fsync{exit,enter,inflate}", level, 0); // Case 6: fsync{fsync{inflate,exit,enter}} success = true; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFIXE(); level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "fsync{fsync{inflate,exit,enter}}", level, 0); // Case 6: fsync{fsync{exit,inflate,enter}} success = true; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFXIE(); level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "fsync{fsync{exit,inflate,enter}}", level, 0); // Case 6: fsync{fsync{exit,enter,inflate}} success = true; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFXEI(); level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "fsync{fsync{exit,enter,inflate}}", level, 0); // Case 6: fsync{inflate,fsync{exit,enter}} success = true; level = 0; try { TestSync t = new TestSync(); level++; t.syncFIFXE(); level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "fsync{inflate,fsync{exit,enter}}", level, 0); // Case 6: fsync{fsync{exit,enter},inflate} success = true; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFXE_I(); level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "fsync{fsync{exit,enter},inflate}", level, 0); // Case 7: fsync{fsync{inflate,exit},enter} success = true; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFIX_E(); level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "fsync{fsync{inflate,exit},enter}", level, 0); // Case 7: fsync{fsync{exit,inflate},enter} success = true; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFXI_E(); level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "fsync{fsync{exit,inflate},enter}", level, 0); // Case 7: fsync{inflate,fsync{exit},enter} success = true; level = 0; try { TestSync t = new TestSync(); level++; t.syncFIFX_E(); level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "fsync{inflate,fsync{exit},enter}", level, 0); // Case 7: fsync{fsync{exit},enter,inflate} success = true; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFX_EI(); level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "fsync{fsync{exit},enter,inflate}", level, 0); /* //==================================================================== // Excess monitorexit on a mixture of synchronized methods and blocks: // Case 1: sync{fsync{exit}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFX(); level--; } level--; } catch (IllegalMonitorStateException e) { if (level == 1) { success = true; } } passIf(success, "sync{fsync{exit}}", level, 1); // Case 2: fsync{sync{exit}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSX(); level--; } catch (IllegalMonitorStateException e) { if (level == 1) { success = true; } } passIf(success, "fsync{sync{exit}}", level, 1); // Case 3: sync{fsync{exit,exit}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFXX(); level--; } level--; } catch (IllegalMonitorStateException e) { if (level == 2) { success = true; } } passIf(success, "sync{fsync{exit,exit}}", level, 2); // Case 4: fsync{sync{exit,exit}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFSXX(); level--; } level--; } catch (IllegalMonitorStateException e) { if (level == 2) { success = true; } } passIf(success, "fsync{sync{exit,exit}}", level, 2); // Case 5: sync{fsync{exit,exit,exit}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFXXX(); level--; } level--; } catch (IllegalMonitorStateException e) { if (level == 3) { success = true; } } passIf(success, "sync{fsync{exit,exit,exit}}", level, 3); // Case 6: fsync{sync{exit,exit,exit}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFSXXX(); level--; } level--; } catch (IllegalMonitorStateException e) { if (level == 3) { success = true; } } passIf(success, "fsync{sync{exit,exit,exit}}", level, 3); // Case 7: sync{fsync{exit,enter}} success = true; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFXE(); level--; } level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "sync{fsync{exit,enter}}", level, 0); // Case 8: fsync{sync{exit,enter}} success = true; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFSXE(); level--; } level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "fsync{sync{exit,enter}}", level, 0); // Case 9: sync{fsync{exit},enter} success = true; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFX(); monitorEnter(t); level--; } level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "sync{fsync{exit},enter}", level, 0); // Case 10: fsync{sync{exit},enter} success = true; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSX_E(); level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "fsync{sync{exit},enter}", level, 0); */ //==================================================================== // Excess monitorexit on a mixture of synchronized methods and blocks // with re-entrant syncs: // Case 1: sync{sync{sync{inflate,exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; synchronized(t) { level++; synchronized(t) { level++; inflate(t); monitorExit(t); level--; } level--; } level--; } level--; } catch (IllegalMonitorStateException e) { if (level == 1) { success = true; } } passIf(success, "sync{sync{sync{inflate,exit}}}", level, 1); // Case 2: sync{sync{fsync{inflate,exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; synchronized(t) { level++; t.syncFIX(); level--; } level--; } level--; } catch (IllegalMonitorStateException e) { if (level == 1) { success = true; } } passIf(success, "sync{sync{fsync{inflate,exit}}}", level, 1); // Case 3: sync{fync{sync{inflate,exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFSIX(); level--; } level--; } catch (IllegalMonitorStateException e) { if (level == 1) { success = true; } } passIf(success, "sync{fsync{sync{inflate,exit}}}", level, 1); // Case 4: sync{fync{fsync{inflate,exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFFIX(); level--; } level--; } catch (IllegalMonitorStateException e) { if (level == 1) { success = true; } } passIf(success, "sync{fsync{fsync{inflate,exit}}}", level, 1); // Case 5: fsync{sync{sync{inflate,exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSSIX(); level--; } catch (IllegalMonitorStateException e) { if (level == 1) { success = true; } } passIf(success, "fsync{sync{sync{inflate,exit}}}", level, 1); // Case 6: fsync{sync{fsync{inflate,exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSFIX(); level--; } catch (IllegalMonitorStateException e) { if (level == 1) { success = true; } } passIf(success, "fsync{sync{fsync{inflate,exit}}}", level, 1); // Case 7: fsync{fsync{sync{inflate,exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFSIX(); level--; } catch (IllegalMonitorStateException e) { if (level == 1) { success = true; } } passIf(success, "fsync{fsync{sync{inflate,exit}}}", level, 1); // Case 8: fsync{fsync{fsync{inflate,exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFFIX(); level--; } catch (IllegalMonitorStateException e) { if (level == 1) { success = true; } } passIf(success, "fsync{fsync{fsync{inflate,exit}}}", level, 1); // Case 1: sync{sync{inflate,sync{exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; synchronized(t) { level++; inflate(t); synchronized(t) { level++; monitorExit(t); level--; } level--; } level--; } level--; } catch (IllegalMonitorStateException e) { if (level == 1) { success = true; } } passIf(success, "sync{sync{inflate,sync{exit}}}", level, 1); // Case 2: sync{sync{inflate,fsync{exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; synchronized(t) { level++; inflate(t); t.syncFX(); level--; } level--; } level--; } catch (IllegalMonitorStateException e) { if (level == 1) { success = true; } } passIf(success, "sync{sync{inflate,fsync{exit}}}", level, 1); // Case 3: sync{fync{inflate,sync{exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFISX(); level--; } level--; } catch (IllegalMonitorStateException e) { if (level == 1) { success = true; } } passIf(success, "sync{fsync{inflate,sync{exit}}}", level, 1); // Case 4: sync{fync{inflate,fsync{exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFIFX(); level--; } level--; } catch (IllegalMonitorStateException e) { if (level == 1) { success = true; } } passIf(success, "sync{fsync{inflate,fsync{exit}}}", level, 1); // Case 5: fsync{sync{inflate,sync{exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSISX(); level--; } catch (IllegalMonitorStateException e) { if (level == 1) { success = true; } } passIf(success, "fsync{sync{inflate,sync{exit}}}", level, 1); // Case 6: fsync{sync{inflate,fsync{exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSIFX(); level--; } catch (IllegalMonitorStateException e) { if (level == 1) { success = true; } } passIf(success, "fsync{sync{inflate,fsync{exit}}}", level, 1); // Case 7: fsync{fsync{inflate,sync{exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFISX(); level--; } catch (IllegalMonitorStateException e) { if (level == 1) { success = true; } } passIf(success, "fsync{fsync{inflate,sync{exit}}}", level, 1); // Case 8: fsync{fsync{inflate,fsync{exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFIFX(); level--; } catch (IllegalMonitorStateException e) { if (level == 1) { success = true; } } passIf(success, "fsync{fsync{inflate,fsync{exit}}}", level, 1); // Case 1: sync{inflate,sync{sync{exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; inflate(t); synchronized(t) { level++; synchronized(t) { level++; monitorExit(t); level--; } level--; } level--; } level--; } catch (IllegalMonitorStateException e) { if (level == 1) { success = true; } } passIf(success, "sync{inflate,sync{sync{exit}}}", level, 1); // Case 2: sync{inflate,sync{fsync{exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; inflate(t); synchronized(t) { level++; t.syncFX(); level--; } level--; } level--; } catch (IllegalMonitorStateException e) { if (level == 1) { success = true; } } passIf(success, "sync{inflate,sync{fsync{exit}}}", level, 1); // Case 3: sync{inflate,fync{sync{exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; inflate(t); t.syncFSX(); level--; } level--; } catch (IllegalMonitorStateException e) { if (level == 1) { success = true; } } passIf(success, "sync{inflate,fsync{sync{exit}}}", level, 1); // Case 4: sync{inflate,fync{fsync{exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; inflate(t); t.syncFIFX(); level--; } level--; } catch (IllegalMonitorStateException e) { if (level == 1) { success = true; } } passIf(success, "sync{inflate,fsync{fsync{exit}}}", level, 1); // Case 5: fsync{inflate,sync{sync{exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFISSX(); level--; } catch (IllegalMonitorStateException e) { if (level == 1) { success = true; } } passIf(success, "fsync{inflate,sync{sync{exit}}}", level, 1); // Case 6: fsync{inflate,sync{fsync{exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFISFX(); level--; } catch (IllegalMonitorStateException e) { if (level == 1) { success = true; } } passIf(success, "fsync{inflate,sync{fsync{exit}}}", level, 1); // Case 7: fsync{inflate,fsync{sync{exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFIFSX(); level--; } catch (IllegalMonitorStateException e) { if (level == 1) { success = true; } } passIf(success, "fsync{inflate,fsync{sync{exit}}}", level, 1); // Case 8: fsync{inflate,fsync{fsync{exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFIFFX(); level--; } catch (IllegalMonitorStateException e) { if (level == 1) { success = true; } } passIf(success, "fsync{inflate,fsync{fsync{exit}}}", level, 1); /* // Case 9: sync{sync{sync{exit,exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; synchronized(t) { level++; synchronized(t) { level++; monitorExit(t); monitorExit(t); level--; } level--; } level--; } level--; } catch (IllegalMonitorStateException e) { if (level == 2) { success = true; } } passIf(success, "sync{sync{sync{exit,exit}}}", level, 2); // Case 10: sync{sync{fsync{exit,exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; synchronized(t) { level++; t.syncFXX(); level--; } level--; } level--; } catch (IllegalMonitorStateException e) { if (level == 2) { success = true; } } passIf(success, "sync{sync{fsync{exit,exit}}}", level, 2); // Case 11: sync{fync{sync{exit,exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFSXX(); level--; } level--; } catch (IllegalMonitorStateException e) { if (level == 2) { success = true; } } passIf(success, "sync{fsync{sync{exit,exit}}}", level, 2); // Case 12: sync{fync{fsync{exit,exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFFXX(); level--; } level--; } catch (IllegalMonitorStateException e) { if (level == 2) { success = true; } } passIf(success, "sync{fsync{fsync{exit,exit}}}", level, 2); // Case 13: fsync{sync{sync{exit,exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSSXX(); level--; } catch (IllegalMonitorStateException e) { if (level == 2) { success = true; } } passIf(success, "fsync{sync{sync{exit,exit}}}", level, 2); // Case 14: fsync{sync{fsync{exit,exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSFXX(); level--; } catch (IllegalMonitorStateException e) { if (level == 2) { success = true; } } passIf(success, "fsync{sync{fsync{exit,exit}}}", level, 2); // Case 15: fsync{fsync{sync{exit,exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFSXX(); level--; } catch (IllegalMonitorStateException e) { if (level == 2) { success = true; } } passIf(success, "fsync{fsync{sync{exit,exit}}}", level, 2); // Case 16: fsync{fsync{fsync{exit,exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFFXX(); level--; } catch (IllegalMonitorStateException e) { if (level == 2) { success = true; } } passIf(success, "fsync{fsync{fsync{exit,exit}}}", level, 2); // Case 17: sync{sync{sync{exit,exit,exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; synchronized(t) { level++; synchronized(t) { level++; monitorExit(t); monitorExit(t); monitorExit(t); level--; } level--; } level--; } level--; } catch (IllegalMonitorStateException e) { if (level == 3) { success = true; } } passIf(success, "sync{sync{sync{exit,exit,exit}}}", level, 3); // Case 18: sync{sync{fsync{exit,exit,exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; synchronized(t) { level++; t.syncFXXX(); level--; } level--; } level--; } catch (IllegalMonitorStateException e) { if (level == 3) { success = true; } } passIf(success, "sync{sync{fsync{exit,exit,exit}}}", level, 3); // Case 19: sync{fync{sync{exit,exit,exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFSXXX(); level--; } level--; } catch (IllegalMonitorStateException e) { if (level == 3) { success = true; } } passIf(success, "sync{fsync{sync{exit,exit,exit}}}", level, 3); // Case 20: sync{fync{fsync{exit,exit,exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFFXXX(); level--; } level--; } catch (IllegalMonitorStateException e) { if (level == 3) { success = true; } } passIf(success, "sync{fsync{fsync{exit,exit,exit}}}", level, 3); // Case 21: fsync{sync{sync{exit,exit,exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSSXXX(); level--; } catch (IllegalMonitorStateException e) { if (level == 3) { success = true; } } passIf(success, "fsync{sync{sync{exit,exit,exit}}}", level, 3); // Case 22: fsync{sync{fsync{exit,exit,exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSFXXX(); level--; } catch (IllegalMonitorStateException e) { if (level == 3) { success = true; } } passIf(success, "fsync{sync{fsync{exit,exit,exit}}}", level, 3); // Case 23: fsync{fsync{sync{exit,exit,exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFSXXX(); level--; } catch (IllegalMonitorStateException e) { if (level == 3) { success = true; } } passIf(success, "fsync{fsync{sync{exit,exit,exit}}}", level, 3); // Case 24: fsync{fsync{fsync{exit}}} success = false; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFFXXX(); level--; } catch (IllegalMonitorStateException e) { if (level == 3) { success = true; } } passIf(success, "fsync{fsync{fsync{exit,exit,exit}}}", level, 3); // Case 25: sync{sync{sync{exit,enter}}} success = true; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; synchronized(t) { level++; synchronized(t) { level++; monitorExit(t); monitorEnter(t); level--; } level--; } level--; } level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "sync{sync{sync{exit,enter}}}", level, 0); // Case 26: sync{sync{fsync{exit,enter}}} success = true; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; synchronized(t) { level++; t.syncFXE(); level--; } level--; } level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "sync{sync{fsync{exit,enter}}}", level, 0); // Case 27: sync{fync{sync{exit,enter}}} success = true; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFSXE(); level--; } level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "sync{fsync{sync{exit,enter}}}", level, 0); // Case 28: sync{fync{fsync{exit,enter}}} success = true; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFFXE(); level--; } level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "sync{fsync{fsync{exit,enter}}}", level, 0); // Case 29: fsync{sync{sync{exit,enter}}} success = true; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSSXE(); level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "fsync{sync{sync{exit,enter}}}", level, 0); // Case 30: fsync{sync{fsync{exit,enter}}} success = true; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSFXE(); level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "fsync{sync{fsync{exit,enter}}}", level, 0); // Case 31: fsync{fsync{sync{exit,enter}}} success = true; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFSXE(); level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "fsync{fsync{sync{exit,enter}}}", level, 0); // Case 32: fsync{fsync{fsync{exit,enter}}} success = true; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFFXE(); level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "fsync{fsync{fsync{exit,enter}}}", level, 0); // Case 33: sync{sync{sync{exit},enter}} success = true; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; synchronized(t) { level++; synchronized(t) { level++; monitorExit(t); level--; } monitorEnter(t); level--; } level--; } level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "sync{sync{sync{exit},enter}}", level, 0); // Case 34: sync{sync{fsync{exit},enter}} success = true; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; synchronized(t) { level++; t.syncFX(); level--; } monitorEnter(t); level--; } level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "sync{sync{fsync{exit},enter}}", level, 0); // Case 35: sync{fync{sync{exit},enter}} success = true; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFSX_E(); level--; } level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "sync{fsync{sync{exit},enter}}", level, 0); // Case 36: sync{fync{fsync{exit},enter}} success = true; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFFX_E(); level--; } level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "sync{fsync{fsync{exit},enter}}", level, 0); // Case 37: fsync{sync{sync{exit},enter}} success = true; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSSX_E(); level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "fsync{sync{sync{exit},enter}}", level, 0); // Case 38: fsync{sync{fsync{exit},enter}} success = true; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSFX_E(); level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "fsync{sync{fsync{exit},enter}}", level, 0); // Case 39: fsync{fsync{sync{exit},enter}} success = true; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFSX_E(); level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "fsync{fsync{sync{exit},enter}}", level, 0); // Case 40: fsync{fsync{fsync{exit},enter}} success = true; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFFX_E(); level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "fsync{fsync{fsync{exit},enter}}", level, 0); // Case 41: sync{sync{sync{exit}},enter} success = true; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; synchronized(t) { level++; synchronized(t) { level++; monitorExit(t); level--; } level--; } monitorEnter(t); level--; } level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "sync{sync{sync{exit}},enter}", level, 0); // Case 42: sync{sync{fsync{exit}},enter} success = true; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; synchronized(t) { level++; t.syncFX(); level--; } monitorEnter(t); level--; } level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "sync{sync{fsync{exit}},enter}", level, 0); // Case 43: sync{fync{sync{exit}},enter} success = true; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFSX(); monitorEnter(t); level--; } level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "sync{fsync{sync{exit}},enter}", level, 0); // Case 44: sync{fync{fsync{exit}},enter} success = true; level = 0; try { TestSync t = new TestSync(); level++; synchronized(t) { level++; t.syncFFX(); monitorEnter(t); level--; } level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "sync{fsync{fsync{exit}},enter}", level, 0); // Case 45: fsync{sync{sync{exit}},enter} success = true; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSSX__E(); level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "fsync{sync{sync{exit}},enter}", level, 0); // Case 46: fsync{sync{fsync{exit}},enter} success = true; level = 0; try { TestSync t = new TestSync(); level++; t.syncFSFX__E(); level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "fsync{sync{fsync{exit}},enter}", level, 0); // Case 47: fsync{fsync{sync{exit}},enter} success = true; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFSX__E(); level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "fsync{fsync{sync{exit}},enter}", level, 0); // Case 48: fsync{fsync{fsync{exit}},enter} success = true; level = 0; try { TestSync t = new TestSync(); level++; t.syncFFFX__E(); level--; } catch (IllegalMonitorStateException e) { success = false; } passIf(success, "fsync{fsync{fsync{exit}},enter}", level, 0); */ // } }