protected override void Dispose()

in src/Elastic.Transport/Components/Providers/RecyclableMemoryStream.cs [256:310]


	protected override void Dispose(bool disposing)
	{
		if (Interlocked.CompareExchange(ref _disposedState, 1, 0) != 0)
		{
			string doubleDisposeStack = null;
			if (_memoryManager.GenerateCallStacks) doubleDisposeStack = Environment.StackTrace;

			RecyclableMemoryStreamManager.EventsWriter.MemoryStreamDoubleDispose(_id, _tag,
				AllocationStack,
				DisposeStack,
				doubleDisposeStack);
			return;
		}

		RecyclableMemoryStreamManager.EventsWriter.MemoryStreamDisposed(_id, _tag);

		if (_memoryManager.GenerateCallStacks) DisposeStack = Environment.StackTrace;

		if (disposing)
		{
			_memoryManager.ReportStreamDisposed();

			GC.SuppressFinalize(this);
		}
		else
		{
			// We're being finalized.

			RecyclableMemoryStreamManager.EventsWriter.MemoryStreamFinalized(_id, _tag, AllocationStack);

			if (AppDomain.CurrentDomain.IsFinalizingForUnload())
			{
				// If we're being finalized because of a shutdown, don't go any further.
				// We have no idea what's already been cleaned up. Triggering events may cause
				// a crash.
				base.Dispose(false);
				return;
			}

			_memoryManager.ReportStreamFinalized();
		}

		_memoryManager.ReportStreamLength(_length);

		if (_largeBuffer != null) _memoryManager.ReturnLargeBuffer(_largeBuffer, _tag);

		if (_dirtyBuffers != null)
			foreach (var buffer in _dirtyBuffers)
				_memoryManager.ReturnLargeBuffer(buffer, _tag);

		_memoryManager.ReturnBlocks(_blocks, _tag);
		_blocks.Clear();

		base.Dispose(disposing);
	}