private long[] getTxnIds(Collection<LockInfo> c) { long[] ret = new long[c.size()]; Iterator<LockInfo> iter = c.iterator(); int i = 0; while (iter.hasNext()) { LockInfo info = iter.next(); ret[i++] = info.getLocker().getId(); } return ret; }
private StringBuilder findDeadlock1(Set<Locker> ownerSet, Lock lock, Locker rootLocker) { Iterator<LockInfo> ownerIter = lock.getOwnersClone().iterator(); while (ownerIter.hasNext()) { LockInfo info = ownerIter.next(); Locker locker = info.getLocker(); Lock waitsFor = locker.getWaitingFor(); if (ownerSet.contains(locker) || locker == rootLocker) { /* Found a cycle. */ StringBuilder ret = new StringBuilder(); ret.append("Transaction ").append(locker.toString()); ret.append(" owns LockAddr:").append(System.identityHashCode(lock)); ret.append(" ").append(info).append("\n"); ret.append("Transaction ").append(locker.toString()); ret.append(" waits for"); if (waitsFor == null) { ret.append(" nothing"); } else { ret.append(" LockAddr:"); ret.append(System.identityHashCode(waitsFor)); } ret.append("\n"); return ret; } if (waitsFor != null) { ownerSet.add(locker); StringBuilder sb = findDeadlock1(ownerSet, waitsFor, rootLocker); if (sb != null) { String waitInfo = "Transaction " + locker + " waits for " + waitsFor + "\n"; sb.insert(0, waitInfo); return sb; } ownerSet.remove(locker); // is this necessary? } } return null; }