public void accumulateFreeSlot(
      TransactionalIdSystemImpl idSystem,
      FreespaceCommitter freespaceCommitter,
      boolean forFreespace) {
    if (forFreespace() != forFreespace) {
      return;
    }
    if (_firstOperation == SlotChangeOperation.create) {
      return;
    }
    if (_currentOperation == SlotChangeOperation.update
        || _currentOperation == SlotChangeOperation.delete) {

      Slot slot = modifiedSlotInParentIdSystem(idSystem);
      if (Slot.isNull(slot)) {
        slot = idSystem.committedSlot(_key);
      }

      // No old slot at all can be the case if the object
      // has been deleted by another transaction and we add it again.
      if (!Slot.isNull(slot)) {
        freespaceCommitter.delayedFree(slot, freeToSystemFreespaceSystem());
      }
    }
  }
 protected void freePreviouslyModifiedSlot(FreespaceManager freespaceManager) {
   if (Slot.isNull(_newSlot)) {
     return;
   }
   free(freespaceManager, _newSlot);
   _newSlot = null;
 }
 protected void free(FreespaceManager freespaceManager, Slot slot) {
   if (slot.isNull()) {
     return;
   }
   if (freespaceManager == null) {
     return;
   }
   freespaceManager.free(slot);
 }
  public StatefulBuffer readStatefulBufferBySlot(Transaction trans, int id, Slot slot) {
    if (Slot.isNull(slot)) {
      return null;
    }

    if (DTrace.enabled) {
      DTrace.READ_SLOT.logLength(slot.address(), slot.length());
    }

    StatefulBuffer buffer = createStatefulBuffer(trans, slot.address(), slot.length());
    buffer.setID(id);
    buffer.readEncrypt(this, slot.address());
    return buffer;
  }
  public ByteArrayBuffer readBufferBySlot(Slot slot) {
    if (Slot.isNull(slot)) {
      return null;
    }

    if (DTrace.enabled) {
      DTrace.READ_SLOT.logLength(slot.address(), slot.length());
    }

    ByteArrayBuffer buffer = new ByteArrayBuffer(slot.length());

    buffer.readEncrypt(this, slot.address());
    return buffer;
  }
  public void free(Slot slot) {
    if (slot.isNull()) {
      return;

      // TODO: This should really be an IllegalArgumentException but old database files
      //       with index-based FreespaceManagers appear to deliver zeroed slots.
      // throw new IllegalArgumentException();
    }
    if (_freespaceManager == null) {
      // Can happen on early free before freespacemanager
      // is up, during conversion.
      return;
    }

    if (DTrace.enabled) {
      DTrace.FILE_FREE.logLength(slot.address(), slot.length());
    }

    _freespaceManager.free(slot);
  }
 public boolean isDeleted() {
   return slotModified() && _newSlot.isNull();
 }
 private final boolean isFreeOnRollback() {
   return !Slot.isNull(_newSlot);
 }