Esempio n. 1
0
        // 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);
        }
Esempio n. 2
0
        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);
        }