// Assumed that the caller releases the lock acquired here internal BufferPage getWritablePage(int writeLength) { if (_pool == null) { _pool = new ConcurrentQueue <BufferPage>(); for (int i = 0; i < MaxBufferPages; i++) { var bufferPageBytes = new byte[Math.Max(defaultPageSize, writeLength)]; var bufferPage = new BufferPage(bufferPageBytes); _pool.Enqueue(bufferPage); } } LockOutputBuffer(); if (_bufferQ.IsEmpty()) { // Q is empty, must add an empty page addBufferPage(writeLength); } else { // There is something already in the buffer. Check it out. var outPage = _bufferQ.PeekLast(); if ((outPage.PageBytes.Length - outPage.curLength) < writeLength) { // Not enough space on last page. Add another addBufferPage(writeLength); } } var retVal = _bufferQ.PeekLast(); return(retVal); }
internal static EventBuffer Deserialize(Stream readFromStream) { var _retVal = new EventBuffer(); var bufferCount = readFromStream.ReadIntFixed(); for (int i = 0; i < bufferCount; i++) { var pageSize = readFromStream.ReadIntFixed(); var pageFilled = readFromStream.ReadIntFixed(); var myBytes = new byte[pageSize]; readFromStream.Read(myBytes, 0, pageFilled); var newBufferPage = new BufferPage(myBytes); newBufferPage.curLength = pageFilled; newBufferPage.NumMessages = readFromStream.ReadIntFixed(); _retVal._bufferQ.Enqueue(ref newBufferPage); } return(_retVal); }