docs: protected Link previousLink(Link start,
                                  Transaction transaction,
                                  long transactionUnlockPoint)
                      throws ObjectManagerException
      {
  
          if (Tracing.isAnyTracingEnabled() && trace.isEntryEnabled())
              trace.entry(this, cclass,
                          "previousLink",
                          new Object[] { start, transaction, new Long(transactionUnlockPoint) });
  
          Token previousToken = null;
          Link previousLink = null; // The link to return.
  
          if (start == null) { // Start at the tail of the list?       
              previousToken = tail;
  
          } else if (start.state == Link.stateRemoved
                     || start.state == Link.stateDeleted) {
              // Start in the body of the list, as long as the start point is not already deleted.
              // Deleted links are no loner part of the list.
              if (Tracing.isAnyTracingEnabled() && trace.isEntryEnabled())
                  trace.exit(this, cclass,
                             "previousLink",
                             "returns null" + " start link is deleted");
              return null;
          } else { // if in body but deleted.
              previousToken = start.previous;
          } // if (start == null).
  
          // Move forward through the ramaining list until we find an element
          // that is visible to this transaction.
          searchBackward: while (previousToken != null) {
              previousLink = (Link) (previousToken.getManagedObject());
              if (previousLink.state == Link.stateAdded)
                  if (!previousLink.wasLocked(transactionUnlockPoint))
                      break searchBackward;
  
              // Transaction may be null, indicaiting sateToBeAdded links are not eligible.
              if (previousLink.state == Link.stateToBeAdded
                  && transaction != null && previousLink.lockedBy(transaction))
                  break searchBackward;
              previousToken = previousLink.next; // Try the folowing link.
          } // while (previousToken != null ).
  
          if (previousToken == null) { // At the start of the list?
              if (Tracing.isAnyTracingEnabled() && trace.isEntryEnabled())
                  trace.exit(this, cclass,
                             "nextLink",
                             "returns null" + " empty list");
              return null;
          } // (previousToken == null).
  
          if (Tracing.isAnyTracingEnabled() && trace.isEntryEnabled())
              trace.exit(this, cclass,
                         "previousLink",
                         new Object[] { previousLink });
          return previousLink;
      }