Exemple #1
0
  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;
  }
Exemple #2
0
  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;
  }