/// <summary> /// </summary> public DefaultIoFilterChain(AbstractIoSession session) : base( e => new NextFilter(e), () => new HeadFilter(), () => new TailFilter() ) { if (session == null) { throw new ArgumentNullException("session"); } _session = session; }
public override void MessageSent(INextFilter nextFilter, IoSession session, IWriteRequest writeRequest) { AbstractIoSession s = session as AbstractIoSession; if (s != null) { s.IncreaseWrittenMessages(writeRequest, DateTime.Now); } // Update the statistics session.Service.Statistics.UpdateThroughput(DateTime.Now); // Propagate the message session.Handler.MessageSent(session, writeRequest.Message); }
public override void FilterWrite(INextFilter nextFilter, IoSession session, IWriteRequest writeRequest) { AbstractIoSession s = session as AbstractIoSession; if (s != null) { // Maintain counters. IoBuffer buffer = writeRequest.Message as IoBuffer; if (buffer != null) { // I/O processor implementation will call buffer.Reset() // it after the write operation is finished, because // the buffer will be specified with messageSent event. buffer.Mark(); Int32 remaining = buffer.Remaining; if (remaining == 0) { // Zero-sized buffer means the internal message delimiter s.IncreaseScheduledWriteMessages(); } else { s.IncreaseScheduledWriteBytes(remaining); } } else { s.IncreaseScheduledWriteMessages(); } } IWriteRequestQueue writeRequestQueue = session.WriteRequestQueue; if (session.WriteSuspended) { writeRequestQueue.Offer(session, writeRequest); } else if (writeRequestQueue.IsEmpty(session)) { // We can write directly the message session.Processor.Write(session, writeRequest); } else { writeRequestQueue.Offer(session, writeRequest); session.Processor.Flush(session); } }
public override void MessageReceived(INextFilter nextFilter, IoSession session, Object message) { AbstractIoSession s = session as AbstractIoSession; if (s != null) { IoBuffer buf = message as IoBuffer; if (buf == null || !buf.HasRemaining) { s.IncreaseReadMessages(DateTime.Now); } } // Update the statistics session.Service.Statistics.UpdateThroughput(DateTime.Now); // Propagate the message session.Handler.MessageReceived(session, message); // TODO IsUseReadOperation }
public override void SessionClosed(INextFilter nextFilter, IoSession session) { AbstractIoSession s = session as AbstractIoSession; try { session.Handler.SessionClosed(session); } finally { try { session.WriteRequestQueue.Dispose(session); } finally { try { s.AttributeMap.Dispose(session); } finally { session.FilterChain.Clear(); // TODO IsUseReadOperation } } } }
/// <summary> /// Initializes sessions. /// </summary> protected void InitSession <TFuture>(IoSession session, TFuture future, Action <IoSession, TFuture> initializeSession) where TFuture : IoFuture { AbstractIoSession s = session as AbstractIoSession; if (s != null) { s.AttributeMap = s.Service.SessionDataStructureFactory.GetAttributeMap(session); s.SetWriteRequestQueue(s.Service.SessionDataStructureFactory.GetWriteRequestQueue(session)); } if (future != null && future is IConnectFuture) { session.SetAttribute(DefaultIoFilterChain.SessionCreatedFuture, future); } if (initializeSession != null) { initializeSession(session, future); } FinishSessionInitialization0(session, future); }
/// <summary> /// </summary> public LoopbackFilterChain(AbstractIoSession session) : base(session) { _processor = new LoopbackIoProcessor(this); }