public void close() throws Exception {
    checkOpened();

    writeLock.lock();

    try {

      while (!pendingWrites.await(60000)) {
        HornetQJournalLogger.LOGGER.couldNotGetLock(fileName);
      }

      while (!maxIOSemaphore.tryAcquire(maxIO, 60, TimeUnit.SECONDS)) {
        HornetQJournalLogger.LOGGER.couldNotGetLock(fileName);
      }

      maxIOSemaphore = null;
      if (poller != null) {
        stopPoller();
      }

      if (handler != null) {
        AsynchronousFileImpl.closeInternal(handler);
        AsynchronousFileImpl.addMax(-maxIO);
      }
      opened = false;
      handler = null;
    } finally {
      writeLock.unlock();
    }
  }
 private static boolean loadLibrary(final String name) {
   try {
     HornetQJournalLogger.LOGGER.trace(name + " being loaded");
     System.loadLibrary(name);
     if (AsynchronousFileImpl.getNativeVersion() != AsynchronousFileImpl.EXPECTED_NATIVE_VERSION) {
       HornetQJournalLogger.LOGGER.incompatibleNativeLibrary();
       return false;
     } else {
       // Initializing nanosleep
       AsynchronousFileImpl.setNanoSleepInterval(1);
       return true;
     }
   } catch (Throwable e) {
     HornetQJournalLogger.LOGGER.debug(name + " -> error loading the native library", e);
     return false;
   }
 }
  static {
    String libraries[] =
        new String[] {"HornetQAIO", "HornetQAIO64", "HornetQAIO32", "HornetQAIO_ia64"};

    for (String library : libraries) {
      if (AsynchronousFileImpl.loadLibrary(library)) {
        AsynchronousFileImpl.loaded = true;
        break;
      } else {
        HornetQJournalLogger.LOGGER.debug("Library " + library + " not found!");
      }
    }

    if (!AsynchronousFileImpl.loaded) {
      HornetQJournalLogger.LOGGER.debug("Couldn't locate LibAIO Wrapper");
    }
  }
  private void startPoller() {
    writeLock.lock();

    try {

      if (poller == null) {
        pollerLatch.countUp();
        poller = new PollerRunnable();
        try {
          pollerExecutor.execute(poller);
        } catch (Exception ex) {
          HornetQJournalLogger.LOGGER.errorStartingPoller(ex);
        }
      }
    } finally {
      writeLock.unlock();
    }
  }
  // Called by the JNI layer.. just ignore the
  // warning
  private void callbackError(
      final AIOCallback callback,
      final long sequence,
      final ByteBuffer buffer,
      final int errorCode,
      final String errorMessage) {
    HornetQJournalLogger.LOGGER.callbackError(errorMessage);

    fireExceptionListener(errorCode, errorMessage);

    maxIOSemaphore.release();

    pendingWrites.countDown();

    callbackLock.lock();

    try {
      if (sequence == -1) {
        callback.onError(errorCode, errorMessage);
      } else {
        if (sequence == nextReadSequence) {
          nextReadSequence++;
          callback.onError(errorCode, errorMessage);
          flushCallbacks();
        } else {
          pendingCallbacks.add(new ErrorCallback(sequence, callback, errorCode, errorMessage));
        }
      }
    } finally {
      callbackLock.unlock();
    }

    // The buffer is not sent on callback for read operations
    if (bufferCallback != null && buffer != null) {
      bufferCallback.bufferDone(buffer);
    }
  }
 @Override
 protected void finalize() {
   if (opened) {
     HornetQJournalLogger.LOGGER.fileFinalizedWhileOpen(fileName);
   }
 }