blob: 069622ea4d1c1443d3dc1587bae6d86034eece8c [file] [log] [blame]
/*
* Copyright (c) 2010, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code 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 code 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 in the LICENSE file that
* accompanied this code).
*
* 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
*
* @summary converted from VM Testbase nsk/monitoring/LockTest/LockTest001.
* VM Testbase keywords: [monitoring, vm6]
*
* @library /vmTestbase
* /test/lib
* @run driver jdk.test.lib.FileInstaller . .
* @run main/othervm nsk.monitoring.LockTest.LockTest001.LockTest001
*/
package nsk.monitoring.LockTest.LockTest001;
import java.lang.management.ThreadInfo;
import java.lang.management.ManagementFactory;
import nsk.share.TestFailure;
public class LockTest001
{
private Object syncObj = new Object();
public LockTest001()
{ }
public void test()
{
int localVar0, localVar1, localVar2, localVar3, localVar4, localVar5, localVar6, localVar7, localVar8, localVar9;
int localVar10, localVar11, localVar12, localVar13, localVar14, localVar15, localVar16, localVar17, localVar18, localVar19;
int localVar20, localVar21, localVar22, localVar23, localVar24, localVar25, localVar26, localVar27, localVar28, localVar29;
int localVar30, localVar31, localVar32, localVar33, localVar34, localVar35, localVar36, localVar37, localVar38, localVar39;
int localVar40, localVar41, localVar42, localVar43, localVar44, localVar45, localVar46, localVar47, localVar48, localVar49;
String threadName = Thread.currentThread().getName();
System.out.println(threadName + ": Entering test()");
synchronized (syncObj)
{
int n = 0;
for (int i = 0; i < 10000000; i++)
n += i;
logMonitors((n & 1) >>> (n & 1));
} // end sync
logMonitors(1);
synchronized (syncObj)
{
logMonitors(2);
}
logMonitors(3);
System.out.println(threadName + ": Leaving test()");
return;
}
public static void logMonitors(int n)
{
String threadName = Thread.currentThread().getName();
java.lang.management.MonitorInfo[] monitors = java.lang.management.ManagementFactory.getThreadMXBean()
.getThreadInfo(new long[] { Thread.currentThread().getId() }, true, true)[0].getLockedMonitors();
System.out.println(threadName + ": Checkpoint #" + n + ", number of monitors: " + monitors.length);
if ((n == 3) && (monitors.length > 0))
System.out.println(threadName + ": MONITOR HELD AFTER EXITING SYNCHRONIZED BLOCK!");
for (int i = 0; i < monitors.length; i++)
{
java.lang.management.MonitorInfo monitor = monitors[i];
System.out.println(threadName + ": MonitorInfo[" + i + "]=" + monitor.toString() + ", StackDepth=" + monitor.getLockedStackDepth()
+ ", frame=" + ((monitor.getLockedStackFrame() == null) ? "No Frame" : monitor.getLockedStackFrame().toString()));
}
return;
}
public static void main(String[] argv)
{
LockTest001 lt = new LockTest001();
RunLockTest rlt = new RunLockTest(lt, 10000);
Thread t = new Thread(rlt);
System.out.println("main: About to start first thread: " + t.getName());
t.start();
synchronized (rlt)
{
while (!rlt.finishedTest)
{
try
{ rlt.wait(); }
catch (Exception e)
{ }
}
}
rlt = new RunLockTest(lt, 0);
t = new Thread(rlt);
System.out.println("main: About to start second thread: " + t.getName());
t.start();
// amount of time to wait for the thread. In case of buggy behavior, the thread will hang forever.
// but long enough to complete test on busy boxes
long endTime = System.currentTimeMillis() + 5 * 60 * 1000;
boolean isError = true;
while (System.currentTimeMillis() < endTime)
{
if (t.getState() == Thread.State.TERMINATED)
{
isError = false;
break;
}
try
{ Thread.currentThread().sleep(1000); }
catch (Exception e)
{ }
ThreadInfo[] tis = ManagementFactory.getThreadMXBean().getThreadInfo(new long[] { t.getId() }, true, true);
if (tis.length == 0)
System.out.println("Unable to find the thread " + t.getName());
else
{
ThreadInfo ti = tis[0];
if (ti == null)
System.out.println("Unable to get info for thread: " + t.getName());
else
System.out.println(t.getName() + " state: " + ti.getThreadState().toString() +
", LockName: " + ti.getLockName() + ", LockOwnerName: " + ti.getLockOwnerName());
}
}
if (!isError)
System.out.println("TEST PASSED");
else
throw new TestFailure("TEST FAILED");
return;
}
public static class RunLockTest implements Runnable
{
public LockTest001 lt;
public boolean finishedTest = false;
public long sleepLength;
public RunLockTest(LockTest001 _lt, long _sleepLength)
{
lt = _lt;
sleepLength = _sleepLength;
}
public void run()
{
lt.test();
synchronized (this)
{
finishedTest = true;
this.notify();
}
if (sleepLength > 0)
{
try
{ Thread.currentThread().sleep(sleepLength); }
catch (Exception e)
{ }
}
System.out.println(Thread.currentThread().getName() + ": exiting");
return;
}
}
}