/// <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
                        }
                    }
                }
            }
Ejemplo n.º 6
0
        /// <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);
        }
Ejemplo n.º 7
0
 /// <summary>
 /// </summary>
 public LoopbackFilterChain(AbstractIoSession session)
     : base(session)
 {
     _processor = new LoopbackIoProcessor(this);
 }