if (readChainPosition >= chain.length) {
// end of chain processing
IoHandler handler = getService().getIoHandler();
if (handler != null) {
IoHandlerExecutor executor = getService().getIoHandlerExecutor();
if (executor != null) {
// asynchronous event
if (message == tl.get()) {
// copy the bytebuffer
if (IS_DEBUG) {
LOG.debug("copying bytebuffer before pushing to the executor");
}
ByteBuffer original = (ByteBuffer) message;
ByteBuffer clone = ByteBuffer.allocate(original.capacity());
// copy from the beginning
original.rewind();
clone.put(original);
original.rewind();
clone.flip();
executor.execute(new ReceiveEvent(this, clone));
} else {
executor.execute(new ReceiveEvent(this, message));
}
} else {
// synchronous call (in the I/O loop)
handler.messageReceived(this, message);
}