private void writeToLockFile(int lockSignal) {
   ByteArrayBuffer lockBuffer = newLockFileBuffer();
   lockBuffer.writeInt(lockSignal);
   lockBuffer.writeInt(lockSignal);
   write(_lockFile, lockBuffer);
   _lockFile.sync();
 }
  @Override
  public void applySlotChanges(
      Visitable<SlotChange> slotChangeTree, int slotChangeCount, Slot reservedSlot) {
    if (slotChangeCount < 1) {
      return;
    }

    Runnable commitHook = _container.commitHook();
    flushDatabaseFile();

    ensureLogAndLock();
    int length = transactionLogSlotLength(slotChangeCount);
    ByteArrayBuffer logBuffer = new ByteArrayBuffer(length);
    logBuffer.writeInt(length);
    logBuffer.writeInt(slotChangeCount);

    appendSlotChanges(logBuffer, slotChangeTree);
    write(_logFile, logBuffer);
    _logFile.sync();

    writeToLockFile(LOCK_INT);

    writeSlots(slotChangeTree);
    commitHook.run();
    flushDatabaseFile();
    writeToLockFile(0);
  }
 private boolean lockFileSignalsInterruptedTransaction() {
   openLockFile();
   ByteArrayBuffer buffer = newLockFileBuffer();
   read(_lockFile, buffer);
   for (int i = 0; i < 2; i++) {
     int checkInt = buffer.readInt();
     if (checkInt != LOCK_INT) {
       closeLockFile();
       return false;
     }
   }
   closeLockFile();
   return true;
 }
 public void completeInterruptedTransaction(int transactionId1, int transactionId2) {
   if (!File4.exists(lockFileName(_fileName))) {
     return;
   }
   if (!lockFileSignalsInterruptedTransaction()) {
     return;
   }
   ByteArrayBuffer buffer = new ByteArrayBuffer(Const4.INT_LENGTH);
   openLogFile();
   read(_logFile, buffer);
   int length = buffer.readInt();
   if (length > 0) {
     buffer = new ByteArrayBuffer(length);
     read(_logFile, buffer);
     buffer.incrementOffset(Const4.INT_LENGTH);
     readWriteSlotChanges(buffer);
   }
   deleteLockFile();
   closeLogFile();
   deleteLogFile();
 }
 private void write(Bin storage, ByteArrayBuffer buffer) {
   storage.write(0, buffer._buffer, buffer.length());
 }
 private void read(Bin storage, ByteArrayBuffer buffer) {
   storage.read(0, buffer._buffer, buffer.length());
 }