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);
                }
            }
Exemplo n.º 2
0
            private Object GetMessageCopy(Object message)
            {
                Object   messageCopy = message;
                IoBuffer rb          = message as IoBuffer;

                if (rb != null)
                {
                    rb.Mark();
                    IoBuffer wb = IoBuffer.Allocate(rb.Remaining);
                    wb.Put(rb);
                    wb.Flip();
                    rb.Reset();
                    messageCopy = wb;
                }
                return(messageCopy);
            }
Exemplo n.º 3
0
        public void TestOverflow()
        {
            Encoding        encoding = Encoding.UTF8;
            TextLineDecoder decoder  = new TextLineDecoder(encoding, LineDelimiter.Auto);

            decoder.MaxLineLength = 3;

            ProtocolCodecSession   session = new ProtocolCodecSession();
            IProtocolDecoderOutput output  = session.DecoderOutput;
            IoBuffer input = IoBuffer.Allocate(16);

            // Make sure the overflow exception is not thrown until
            // the delimiter is encountered.
            input.PutString("A", encoding).Flip().Mark();
            decoder.Decode(session, input.Reset().Mark(), output);
            Assert.AreEqual(0, session.DecoderOutputQueue.Count);
            decoder.Decode(session, input.Reset().Mark(), output);
            Assert.AreEqual(0, session.DecoderOutputQueue.Count);
            decoder.Decode(session, input.Reset().Mark(), output);
            Assert.AreEqual(0, session.DecoderOutputQueue.Count);
            decoder.Decode(session, input.Reset().Mark(), output);
            Assert.AreEqual(0, session.DecoderOutputQueue.Count);

            input.Clear().PutString("A\r\nB\r\n", encoding).Flip();

            try
            {
                decoder.Decode(session, input, output);
                Assert.Fail();
            }
            catch (RecoverableProtocolDecoderException)
            {
                // signifies a successful test execution
                Assert.IsTrue(true);
            }

            decoder.Decode(session, input, output);
            Assert.AreEqual(1, session.DecoderOutputQueue.Count);
            Assert.AreEqual("B", session.DecoderOutputQueue.Dequeue());

            //// Make sure OOM is not thrown.
            GC.Collect();
            //long oldFreeMemory = GC.GetTotalMemory(false);
            input = IoBuffer.Allocate(1048576 * 16).Sweep((byte)' ').Mark();

            for (int i = 0; i < 10; i++)
            {
                input.Reset();
                input.Mark();
                decoder.Decode(session, input, output);
                Assert.AreEqual(0, session.DecoderOutputQueue.Count);

                // Memory consumption should be minimal.
                //Assert.IsTrue(GC.GetTotalMemory(false) - oldFreeMemory < 1048576);
            }

            input.Clear().PutString("C\r\nD\r\n", encoding).Flip();
            try
            {
                decoder.Decode(session, input, output);
                Assert.Fail();
            }
            catch (RecoverableProtocolDecoderException)
            {
                // signifies a successful test execution
                Assert.IsTrue(true);
            }

            decoder.Decode(session, input, output);
            Assert.AreEqual(1, session.DecoderOutputQueue.Count);
            Assert.AreEqual("D", session.DecoderOutputQueue.Dequeue());

            // Memory consumption should be minimal.
            //Assert.IsTrue(GC.GetTotalMemory(false) - oldFreeMemory < 1048576);
        }