use of com.ibm.j9ddr.tools.ddrinteractive.DDRInteractiveCommandException in project openj9 by eclipse.
the class DeadlockDetector method findDeadlocks.
/**
* @param out
* @throws DDRInteractiveCommandException
*/
public static void findDeadlocks(PrintStream out) throws DDRInteractiveCommandException {
// Based on JavaCoreDumpWriter::writeDeadLocks()
// Modified to work for both J9VMThreads and J9Threads.
HashMap<Integer, NativeDeadlockGraphNode> map = new HashMap<Integer, NativeDeadlockGraphNode>();
try {
J9JavaVMPointer vm = J9RASHelper.getVM(DataType.getJ9RASPointer());
HashMap<J9ObjectPointer, Object> objectMonitorsMap = DeadlockUtils.readObjectMonitors(vm);
J9ThreadLibraryPointer lib = vm.mainThread().osThread().library();
J9PoolPointer pool = lib.thread_pool();
Pool<J9ThreadPointer> threadPool = Pool.fromJ9Pool(pool, J9ThreadPointer.class);
SlotIterator<J9ThreadPointer> poolIterator = threadPool.iterator();
J9ThreadPointer osThreadPtr = null;
while (poolIterator.hasNext()) {
osThreadPtr = poolIterator.next();
DeadlockUtils.findThreadCycle(osThreadPtr, map, objectMonitorsMap);
// Is there an associated J9VMThread?
J9VMThreadPointer vmThread = J9ThreadHelper.getVMThread(osThreadPtr);
if ((null != vmThread) && (vmThread.notNull()) && vmThread.publicFlags().allBitsIn(J9Consts.J9_PUBLIC_FLAGS_HALT_THREAD_INSPECTION)) {
break;
}
}
// Identifier for each (independent) cycle.
int cycle = 0;
Iterator<Map.Entry<Integer, NativeDeadlockGraphNode>> iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
NativeDeadlockGraphNode node = iterator.next().getValue();
cycle++;
while (null != node) {
if (node.cycle > 0) {
// it means we've looped around!
if (node.cycle == cycle) {
// Output header for each deadlock:
out.println("Deadlock Detected !!!");
out.println("---------------------");
out.println();
NativeDeadlockGraphNode head = node;
boolean isCycleRoot = true;
do {
DeadlockUtils.writeDeadlockNode(node, isCycleRoot, objectMonitorsMap, out);
node = node.next;
isCycleRoot = false;
} while (node != head);
out.println(node.toString());
}
// Skip already visited nodes
break;
} else {
node.cycle = cycle;
}
node = node.next;
}
}
} catch (CorruptDataException e) {
throw new DDRInteractiveCommandException(e);
}
}
Aggregations