/** * Create an {@link AbstractPollingIoProcessor} with the given * {@link Executor} for handling I/Os events. * * @param executor * the {@link Executor} for handling I/O events */ protected AbstractPollingIoProcessor(Executor executor) { if (executor == null) { throw new IllegalArgumentException("executor"); } this.threadName = nextThreadName(); this.executor = executor; }
/** * Deal with session ready for the read or write operations, or both. */ private void process(T session) { // Process Reads if (isReadable(session) && !session.isReadSuspended()) { read(session); } // Process writes if (isWritable(session) && !session.isWriteSuspended()) { scheduleFlush(session); } }
/** * {@inheritDoc} */ @Override public final void remove(S session) { scheduleRemove(session); startupProcessor(); }
/** * {@inheritDoc} */ public final void updateTrafficMask(T session) { scheduleTrafficControl(session); wakeup(); }
/** * {@inheritDoc} */ public final void flush(T session) { if (scheduleFlush(session)) { wakeup(); } }
private boolean flushNow(T session, long currentTime) { if (!session.isConnected()) { scheduleRemove(session); return false; setInterestedInWrite(session, false); do { Object message = getWriteRequestMessage(session, req); if (message instanceof IoBuffer) { localWrittenBytes = writeBuffer(session, req, (IoBuffer)message, hasFragmentation, maxWrittenBytes - writtenBytes, currentTime); if (localWrittenBytes > 0 && ((IoBuffer)getWriteRequestMessage(session, req)).hasRemaining()) { setInterestedInWrite(session, true); return false; localWrittenBytes = writeFile(session, req, hasFragmentation, maxWrittenBytes - writtenBytes, currentTime); && ((FileRegion) message).getRemainingBytes() > 0) { writtenBytes += localWrittenBytes; setInterestedInWrite(session, true); return false; setInterestedInWrite(session, true); return false;
/** * {@inheritDoc} */ @Override public void updateTrafficControl(S session) { // try { setInterestedInRead(session, !session.isReadSuspended()); } catch (Exception e) { IoFilterChain filterChain = session.getFilterChain(); filterChain.fireExceptionCaught(e); } try { setInterestedInWrite(session, !session.getWriteRequestQueue().isEmpty(session) && !session.isWriteSuspended()); } catch (Exception e) { IoFilterChain filterChain = session.getFilterChain(); filterChain.fireExceptionCaught(e); } }
init(session); registered = true; scheduleRemove(session); IoFilterChain filterChain = session.getFilterChain(); filterChain.fireExceptionCaught(e); wakeup(); } else { ExceptionMonitor.getInstance().exceptionCaught(e); try { destroy(session); } catch (Exception e1) { ExceptionMonitor.getInstance().exceptionCaught(e1);
if (hasFragmentation) { while ((ret = read(session, buf)) > 0) { readBytes += ret; ret = read(session, buf); || !AbstractDatagramSessionConfig.class.isAssignableFrom(config.getClass()) || ((AbstractDatagramSessionConfig) config).isCloseOnPortUnreachable())) { scheduleRemove(session);
/** * Updates the traffic mask for a given session * * @param session * the session to update */ public final void updateTrafficMask(S session) { trafficControllingSessions.add(session); wakeup(); }
private void read(T session) { IoSessionConfig config = session.getConfig(); IoBuffer buf = newReadBuffer(config.getReadBufferSize()); while ((ret = read(session, buf)) > 0) { readBytes += ret; if (!buf.hasRemaining()) { ret = read(session, buf); if (ret > 0) { readBytes = ret; scheduleRemove(session); .isCloseOnPortUnreachable()) scheduleRemove(session);
SessionState state = getState(session); boolean flushedAll = flushNow(session, currentTime); if (flushedAll && !session.getWriteRequestQueue().isEmpty(session) && !session.isScheduledForFlush()) { scheduleFlush(session); scheduleRemove(session); IoFilterChain filterChain = session.getFilterChain(); filterChain.fireExceptionCaught(e); scheduleFlush(session); return;
/** * {@inheritDoc} */ @Override public final void add(S session) { if (disposed || disposing) { throw new IllegalStateException("Already disposed."); } // Adds the session to the newSession queue and starts the worker newSessions.add(session); startupProcessor(); }
/** * {@inheritDoc} */ public final void add(T session) { if (isDisposing()) { throw new IllegalStateException("Already disposed."); } // Adds the session to the newSession queue and starts the worker // newSessions.add must precede startupProcessor // for nSessions==0 case in Processor main loop newSessions.add(session); startupProcessor(); }
/** * {@inheritDoc} */ @Override public void write(S session, WriteRequest writeRequest) { WriteRequestQueue writeRequestQueue = session.getWriteRequestQueue(); writeRequestQueue.offer(session, writeRequest); if (!session.isWriteSuspended()) { this.flush(session); } }
return super.writeBuffer(session, req, buf, hasFragmentation, maxLength, currentTime); int localWrittenBytes = super.writeBuffer(session, req, buf, hasFragmentation, maxLength, currentTime); int remaining = nioBuf.remaining(); int localWrittenBytes = super.writeBuffer(session, req, buf, hasFragmentation, maxLength, currentTime);
/** * {@inheritDoc} */ @Override public void updateTrafficControl(S session) { // try { setInterestedInRead(session, !session.isReadSuspended()); } catch (Exception e) { IoFilterChain filterChain = session.getFilterChain(); filterChain.fireExceptionCaught(e); } try { setInterestedInWrite(session, !session.getWriteRequestQueue().isEmpty(session) && !session.isWriteSuspended()); } catch (Exception e) { IoFilterChain filterChain = session.getFilterChain(); filterChain.fireExceptionCaught(e); } }
if (hasFragmentation) { while ((ret = read(session, buf)) > 0) { readBytes += ret; ret = read(session, buf); || !AbstractDatagramSessionConfig.class.isAssignableFrom(config.getClass()) || ((AbstractDatagramSessionConfig) config).isCloseOnPortUnreachable())) { scheduleRemove(session);
/** * Updates the traffic mask for a given session * * @param session * the session to update */ public final void updateTrafficMask(S session) { trafficControllingSessions.add(session); wakeup(); }
/** * {@inheritDoc} */ @Override public final void add(S session) { if (disposed || disposing) { throw new IllegalStateException("Already disposed."); } // Adds the session to the newSession queue and starts the worker newSessions.add(session); startupProcessor(); }