public Reservation reserveNext() {
      int i = 0;
      int start;

      synchronized (m_resourcePools) {
        start = ++m_next;
      }

      while (true) {
        final Reservation reservation =
            m_resourcePools[(start + i) % m_resourcePools.length].reserveNext();

        if (!reservation.isSentinel() || i == m_resourcePools.length - 1) {
          return reservation;
        }

        ++i;
      }
    }
 public void shutdown() {
   // We rely on our ResponseSender's single call to send to ensure we don't
   // free the reservation multiple times.
   m_reservation.free();
 }
    public void interruptibleRun() {
      try {
        // Did we do some work on the last pass?
        boolean idle = false;

        while (true) {
          final Reservation reservation = m_sockets.reserveNext();
          boolean holdReservation = false;

          try {
            if (reservation.isSentinel()) {
              if (idle) {
                Thread.sleep(m_delay);
              }

              idle = true;
            } else {
              final SocketWrapper socketWrapper = (SocketWrapper) reservation.getResource();

              // We don't need to synchronise access to the SocketWrapper
              // stream; access is protected through the socket set and only we
              // hold the reservation.
              final InputStream inputStream = socketWrapper.getInputStream();

              if (inputStream.available() > 0) {

                idle = false;

                final ObjectInputStream objectStream = new ObjectInputStream(inputStream);

                final Message message = (Message) objectStream.readObject();

                if (message instanceof CloseCommunicationMessage) {
                  reservation.close();
                  continue;
                }

                if (message instanceof MessageRequiringResponse) {

                  final MessageRequiringResponse messageRequiringResponse =
                      (MessageRequiringResponse) message;

                  messageRequiringResponse.setResponder(
                      new SenderWithReservation(
                          new StreamSender(socketWrapper.getOutputStream()), reservation));

                  m_messageQueue.queue(message);

                  // Whatever handles the MessageExpectingResponse takes
                  // responsibility for the reservation.
                  holdReservation = true;
                } else {
                  m_messageQueue.queue(message);
                }
              }
            }
          } catch (IOException e) {
            reservation.close();
            UncheckedInterruptedException.ioException(e);
            m_messageQueue.queue(e);
          } catch (ClassNotFoundException e) {
            reservation.close();
            m_messageQueue.queue(e);
          } catch (InterruptedException e) {
            reservation.close();
            throw new UncheckedInterruptedException(e);
          } finally {
            if (!holdReservation) {
              reservation.free();
            }
          }
        }
      } catch (ThreadSafeQueue.ShutdownException e) {
        // We've been shutdown, exit this thread.
      } finally {
        // Ensure we're shutdown.
        shutdown();
      }
    }