From 6f357d94226b3206dda76674bd0b8c766d1f0837 Mon Sep 17 00:00:00 2001 From: Ivan Migalev Date: Mon, 21 Dec 2020 20:24:09 +0700 Subject: [PATCH] Additional logging for errors in ByteBufferAsyncProcessor Since exceptions in this method may indicate a fatal error in the logging subsystem, the only place we're able to log them is LogLog. --- .../Threading/ByteBufferAsyncProcessor.cs | 42 +++++++++++-------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/rd-net/Lifetimes/Threading/ByteBufferAsyncProcessor.cs b/rd-net/Lifetimes/Threading/ByteBufferAsyncProcessor.cs index 0821646ed..4dd96812f 100644 --- a/rd-net/Lifetimes/Threading/ByteBufferAsyncProcessor.cs +++ b/rd-net/Lifetimes/Threading/ByteBufferAsyncProcessor.cs @@ -483,30 +483,38 @@ [PublicAPI] public void Put(byte* start, int count) // return; // } - var ptr = 0; - while (ptr < count) + try { - Assertion.Assert(myChunkToFill.IsNotProcessed, "myChunkToFill.IsNotProcessed"); - var rest = count - ptr; - var available = ChunkSize - myChunkToFill.Ptr; - if (available > 0) + var ptr = 0; + while (ptr < count) { - var copylen = Math.Min(rest, available); - Marshal.Copy((IntPtr)(start + ptr), myChunkToFill.Data, myChunkToFill.Ptr, copylen); - myChunkToFill.Ptr += copylen; - ptr += copylen; + Assertion.Assert(myChunkToFill.IsNotProcessed, "myChunkToFill.IsNotProcessed"); + var rest = count - ptr; + var available = ChunkSize - myChunkToFill.Ptr; + if (available > 0) + { + var copylen = Math.Min(rest, available); + Marshal.Copy((IntPtr) (start + ptr), myChunkToFill.Data, myChunkToFill.Ptr, copylen); + myChunkToFill.Ptr += copylen; + ptr += copylen; + } + else + { + GrowConditionally(); + myChunkToFill = myChunkToFill.Next; + } } - else + + if (myAllDataProcessed) //speedup { - GrowConditionally(); - myChunkToFill = myChunkToFill.Next; + myAllDataProcessed = false; + Monitor.Pulse(myLock); } } - - if (myAllDataProcessed) //speedup + catch (Exception ex) { - myAllDataProcessed = false; - Monitor.Pulse(myLock); + LogLog.Error(ex); + throw; } } }