Esempio n. 1
0
    @Override
    protected void doWrite(boolean block) throws IOException {
      socketBufferHandler.configureWriteBufferForRead();

      long writeTimeout = getWriteTimeout();
      Selector selector = null;
      try {
        selector = pool.get();
      } catch (IOException x) {
        // Ignore
      }
      try {
        pool.write(
            socketBufferHandler.getWriteBuffer(), getSocket(), selector, writeTimeout, block);
        if (block) {
          // Make sure we are flushed
          do {
            if (getSocket().flush(true, selector, writeTimeout)) break;
          } while (true);
        }
        lastWrite = System.currentTimeMillis();
      } finally {
        if (selector != null) {
          pool.put(selector);
        }
      }
      // If there is data left in the buffer the socket will be registered for
      // write further up the stack. This is to ensure the socket is only
      // registered for write once as both container and user code can trigger
      // write registration.
    }
Esempio n. 2
0
 private int fillReadBuffer(boolean block) throws IOException {
   int nRead;
   NioChannel channel = getSocket();
   socketBufferHandler.configureReadBufferForWrite();
   if (block) {
     Selector selector = null;
     try {
       selector = pool.get();
     } catch (IOException x) {
       // Ignore
     }
     try {
       NioEndpoint.NioSocketWrapper att = (NioEndpoint.NioSocketWrapper) channel.getAttachment();
       if (att == null) {
         throw new IOException("Key must be cancelled.");
       }
       nRead =
           pool.read(
               socketBufferHandler.getReadBuffer(), channel, selector, att.getReadTimeout());
     } finally {
       if (selector != null) {
         pool.put(selector);
       }
     }
   } else {
     nRead = channel.read(socketBufferHandler.getReadBuffer());
     if (nRead == -1) {
       throw new EOFException();
     }
   }
   return nRead;
 }
Esempio n. 3
0
  /** Initialize the endpoint. */
  @Override
  public void bind() throws Exception {

    serverSock = ServerSocketChannel.open();
    socketProperties.setProperties(serverSock.socket());
    InetSocketAddress addr =
        (getAddress() != null
            ? new InetSocketAddress(getAddress(), getPort())
            : new InetSocketAddress(getPort()));
    serverSock.socket().bind(addr, getBacklog());
    serverSock.configureBlocking(true); // mimic APR behavior
    serverSock.socket().setSoTimeout(getSocketProperties().getSoTimeout());

    // Initialize thread count defaults for acceptor, poller
    if (acceptorThreadCount == 0) {
      // FIXME: Doesn't seem to work that well with multiple accept threads
      acceptorThreadCount = 1;
    }
    if (pollerThreadCount <= 0) {
      // minimum one poller thread
      pollerThreadCount = 1;
    }
    stopLatch = new CountDownLatch(pollerThreadCount);

    // Initialize SSL if needed
    initialiseSsl();

    selectorPool.open();
  }
Esempio n. 4
0
 /** Deallocate NIO memory pools, and close server socket. */
 @Override
 public void unbind() throws Exception {
   if (log.isDebugEnabled()) {
     log.debug("Destroy initiated for " + new InetSocketAddress(getAddress(), getPort()));
   }
   if (running) {
     stop();
   }
   // Close server socket
   serverSock.socket().close();
   serverSock.close();
   serverSock = null;
   destroySsl();
   super.unbind();
   if (getHandler() != null) {
     getHandler().recycle();
   }
   selectorPool.close();
   if (log.isDebugEnabled()) {
     log.debug("Destroy completed for " + new InetSocketAddress(getAddress(), getPort()));
   }
 }