/**
   * Codifies the results of the provided transaction and reports the information to the profiling
   * system.
   *
   * @param txn a finished transaction
   * @param succeeded whether {@code txn} was successful (i.e. did not abort).
   */
  private void reportDetail(Transaction txn, boolean succeeded) {
    AccessedObjectsDetailImpl detail = txnMap.remove(txn);

    // if the task failed try to determine why
    if (!succeeded) {
      // mark the type with an initial guess of unknown and then
      // try to refine it.
      detail.conflictType = ConflictType.UNKNOWN;

      // NOTE: in the current system we don't really see transactions
      // fail because of conflict with another active transaction,
      // so currently this is only for looking through a backlog
      if (backlog != null) {
        // look through the backlog for a conflict
        for (AccessedObjectsDetailImpl oldDetail : backlog) {
          if (detail.conflictsWith(oldDetail)) {
            detail.setConflict(ConflictType.ACCESS_NOT_GRANTED, oldDetail);
            break;
          }
        }
      }
    }

    // if we're keeping a backlog, then add the reported detail...if
    // the backlog is full, then evict old data until there is room
    if (backlog != null) {
      while (!backlog.offer(detail)) {
        backlog.poll();
      }
    }

    profileCollectorHandle.setAccessedObjectsDetail(detail);
  }
 /** {@inheritDoc} */
 public boolean prepare(Transaction txn) {
   AccessedObjectsDetailImpl detail = txnMap.get(txn);
   // TODO: this is the last chance to abort because of conflict,
   // when we're actually managing the contention
   detail.markPrepared();
   return false;
 }
    /** {@inheritDoc} */
    public void setObjectDescription(Transaction txn, T objId, Object description) {
      Objects.checkNull("txn", txn);
      Objects.checkNull("objId", objId);

      AccessedObjectsDetailImpl detail = txnMap.get(txn);
      if (detail == null) {
        throw new IllegalArgumentException("Unknown transaction: " + txn);
      }

      if (description != null) {
        detail.setDescription(source, objId, description);
      }
    }
    /** {@inheritDoc} */
    public void reportObjectAccess(Transaction txn, T objId, AccessType type, Object description) {
      Objects.checkNull("txn", txn);
      Objects.checkNull("objId", objId);
      Objects.checkNull("type", type);

      AccessedObjectsDetailImpl detail = txnMap.get(txn);
      if (detail == null) {
        throw new IllegalArgumentException("Unknown transaction: " + txn);
      }
      detail.addAccess(new AccessedObjectImpl(objId, type, source, detail));
      if (description != null) {
        detail.setDescription(source, objId, description);
      }
    }
 /** {@inheritDoc} */
 public Object getDescription() {
   return parent.getDescription(source, objId);
 }