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); } }
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); }
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); }