use of com.ibm.j9ddr.vm29.pointer.generated.J9PoolPointer in project openj9 by eclipse.
the class WalkJ9PoolCommand method walkJ9Pool.
/**
* This method walks through each element in the pool and prints each elements' address.
* Elements can be in the same puddle or different, and this method do not print puddle information.
*
* @param address address of the pool
* @param out print stream
* @throws DDRInteractiveCommandException
*/
private void walkJ9Pool(long address, PrintStream out) throws DDRInteractiveCommandException {
try {
J9PoolPointer j9pool = J9PoolPointer.cast(address);
Pool pool = Pool.fromJ9Pool(j9pool, VoidPointer.class);
SlotIterator<VoidPointer> poolIterator = pool.iterator();
VoidPointer currentElement;
int i = 0;
while (poolIterator.hasNext()) {
currentElement = poolIterator.next();
out.println(String.format("\t[%d]\t=\t%s", i++, currentElement.getHexAddress()));
}
} catch (CorruptDataException e) {
throw new DDRInteractiveCommandException("Either address is not a valid pool address or pool itself is corrupted.");
}
}
use of com.ibm.j9ddr.vm29.pointer.generated.J9PoolPointer 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