package org.eclipse.osgi.framework.util;
import java.lang.management.LockInfo;
import java.lang.management.ManagementFactory;
import java.lang.management.MonitorInfo;
import java.lang.management.ThreadInfo;
import java.lang.management.ThreadMXBean;
public class ThreadInfoReport extends RuntimeException {
private static final long serialVersionUID = 1L;
public ThreadInfoReport(String failedMonitor) {
super(getThreadDump(failedMonitor));
}
public static String getThreadDump(String failedMonitor) {
long currentId = Thread.currentThread().getId();
ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
StringBuilder dump = new StringBuilder("Thread dump");
ThreadInfo[] infos = threadMXBean.dumpAllThreads(threadMXBean.isObjectMonitorUsageSupported(), threadMXBean.isSynchronizerUsageSupported());
for (ThreadInfo info : infos) {
dumpThreadIDNameState(info, dump);
dumpLockInfo(currentId, failedMonitor, info, dump);
dumpStackTrace(info, dump);
}
return dump.toString();
}
private static void dumpThreadIDNameState(ThreadInfo info, StringBuilder dump) {
dump.append('\n').append('\n');
dump.append("ThreadId: ").append(info.getThreadId());
dump.append(" ThreadName: ").append(info.getThreadName());
dump.append(" ThreadState: ").append(info.getThreadState());
}
private static void dumpLockInfo(long currentId, String failedMonitor, ThreadInfo info, StringBuilder dump) {
dump.append('\n');
dump.append(" Blocked On: ");
LockInfo blockedOn = info.getLockInfo();
if (blockedOn == null) {
if (currentId == info.getThreadId() && failedMonitor != null) {
dump.append(failedMonitor);
} else {
dump.append("none");
}
} else {
dump.append(blockedOn.toString());
dump.append(" LockOwnerId: ").append(info.getLockOwnerId());
dump.append(" LockOwnerName: ").append(info.getLockOwnerName());
}
dump.append('\n');
dump.append(" Synchronizers Locked: ");
LockInfo[] synchronizers = info.getLockedSynchronizers();
if (synchronizers.length == 0) {
dump.append("none");
} else {
for (LockInfo sync : synchronizers) {
dump.append('\n');
dump.append(" ").append(sync.toString());
}
}
dump.append('\n');
dump.append(" Monitors Locked: ");
MonitorInfo[] monitors = info.getLockedMonitors();
if (monitors.length == 0) {
dump.append("none");
}
for (MonitorInfo monitor : monitors) {
dump.append('\n');
dump.append(" ").append(monitor.toString());
}
dump.append('\n');
}
private static void dumpStackTrace(ThreadInfo info, StringBuilder dump) {
dump.append(" Stack Trace: ");
for (StackTraceElement e : info.getStackTrace()) {
dump.append('\n').append(" ").append(e);
}
}
}