Пример #1
0
        private void ReleaseMemorySegmentsAt(IntPtr memSegPtr)
        {
            // Проходим от указанного сегмента по связям с предыдущими.
            while (memSegPtr != IntPtr.Zero)
            {
                IntPtr releaseMemSegPtr = memSegPtr;
                memSegPtr = MemorySegment.GetPrev(releaseMemSegPtr);

                // Чистим связи с другими сегментами.
                MemorySegment.SetPrev(releaseMemSegPtr, IntPtr.Zero);
                MemorySegment.SetNext(releaseMemSegPtr, IntPtr.Zero);

                _allocator.Release(releaseMemSegPtr);
            }
        }
        private IntPtr GetDefaultIntPtrCore()
        {
            IntPtr intPtr;

            if (!_defaultMemorySegments.TryDequeue(out intPtr))
            {
                intPtr = AllocDefault();
            }

            MemorySegment.SetNext(intPtr, IntPtr.Zero);
            MemorySegment.SetPrev(intPtr, IntPtr.Zero);
            MemorySegment.SetSize(intPtr, _defaultBufSize - _memSegHeaderSize);
            MemorySegment.SetUsed(intPtr, _defaultBufSize - _memSegHeaderSize);

            return(intPtr);
        }
Пример #3
0
        public override void Append(ByteBuf byteBuf)
        {
            UnmanagedByteBuf unmanagedByteBuf = (UnmanagedByteBuf)byteBuf;

            IntPtr appendixCurrentMemSegPtr = unmanagedByteBuf._memSegPtr;
            IntPtr appendixLastMemSegPtr    = unmanagedByteBuf._lastMemSegPtr;

            MemorySegment.SetNext(_lastMemSegPtr, appendixCurrentMemSegPtr);
            MemorySegment.SetPrev(appendixCurrentMemSegPtr, _lastMemSegPtr);

            _lastMemSegPtr = appendixLastMemSegPtr;
            _globalWrited += unmanagedByteBuf._globalWrited;

            // Т.к. мы все забрали у присоединяемого буфера, то буфер как обертка больше не нужен.
            // Освобождаем его.
            unmanagedByteBuf.ReleaseCore();
        }