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