2362N/A * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. 0N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 0N/A * This code is free software; you can redistribute it and/or modify it 0N/A * under the terms of the GNU General Public License version 2 only, as 0N/A * published by the Free Software Foundation. 0N/A * This code is distributed in the hope that it will be useful, but WITHOUT 0N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 0N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 0N/A * version 2 for more details (a copy is included in the LICENSE file that 0N/A * accompanied this code). 0N/A * You should have received a copy of the GNU General Public License version 0N/A * 2 along with this work; if not, write to the Free Software Foundation, 0N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 2362N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2362N/A * or visit www.oracle.com if you need additional information or have any 0N/A * @summary Tests deadlock in simultaneous connection and connector-server close 0N/A * @author Eamonn McManus 0N/A/* This test is somewhat dependent on implementation details. If it suddenly 0N/A * starts failing after a rewrite of the RMIConnectorServer code, you should 0N/A * consider whether it is still relevant. 0N/A// static MonitorInfo[] threadLocks(Thread t) { 0N/A// ThreadMXBean tm = ManagementFactory.getThreadMXBean(); 0N/A// ThreadInfo[] tis = tm.getThreadInfo(new long[] {t.getId()}, true, true); 0N/A// if (tis[0] == null) 0N/A// return tis[0].getLockedMonitors(); 0N/A// static void showLocks(Thread t) { 0N/A// System.out.println("Locks for " + t.getName() + ":"); 0N/A// MonitorInfo[] mis = threadLocks(t); 0N/A// System.out.println(" (no longer exists)"); 0N/A// else if (mis.length == 0) 0N/A// System.out.println(" (none)"); 0N/A// for (MonitorInfo mi : mis) 0N/A// System.out.println(" " + mi); 0N/A // Wait until thread t blocks waiting for a lock held by the calling thread, 0N/A // or until it exits. 0N/A /* If this thread is synchronized on RMIServerImpl, then 0N/A * the thread that does connectorServer.stop will acquire 0N/A * the clientList lock and then block waiting for the RMIServerImpl 0N/A * lock. Our call to super.clientClosed will then deadlock because 0N/A * it needs to acquire the clientList lock.