diff --git a/src/Servers/Kestrel/Core/test/PipelineExtensionTests.cs b/src/Servers/Kestrel/Core/test/PipelineExtensionTests.cs index 11f7209ac2..1e5f82677d 100644 --- a/src/Servers/Kestrel/Core/test/PipelineExtensionTests.cs +++ b/src/Servers/Kestrel/Core/test/PipelineExtensionTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Shared/Buffers.MemoryPool/MemoryPoolBlock.cs b/src/Shared/Buffers.MemoryPool/MemoryPoolBlock.cs index be442d0690..e23b4679c4 100644 --- a/src/Shared/Buffers.MemoryPool/MemoryPoolBlock.cs +++ b/src/Shared/Buffers.MemoryPool/MemoryPoolBlock.cs @@ -42,11 +42,7 @@ namespace System.Buffers ~MemoryPoolBlock() { - if (Slab != null && Slab.IsActive) - { - // Need to make a new object because this one is being finalized - Pool.Return(new MemoryPoolBlock(Pool, Slab, _offset, _length)); - } + Pool.RefreshBlock(Slab, _offset, _length); } public void Dispose() @@ -58,4 +54,4 @@ namespace System.Buffers { } } -} \ No newline at end of file +} diff --git a/src/Shared/Buffers.MemoryPool/SlabMemoryPool.cs b/src/Shared/Buffers.MemoryPool/SlabMemoryPool.cs index 205beeef78..2fa3a88d60 100644 --- a/src/Shared/Buffers.MemoryPool/SlabMemoryPool.cs +++ b/src/Shared/Buffers.MemoryPool/SlabMemoryPool.cs @@ -160,6 +160,21 @@ namespace System.Buffers } } + // This method can ONLY be called from the finalizer of MemoryPoolBlock + internal void RefreshBlock(MemoryPoolSlab slab, int offset, int length) + { + lock (_disposeSync) + { + if (!_isDisposed && slab != null && slab.IsActive) + { + // Need to make a new object because this one is being finalized + // Note, this must be called within the _disposeSync lock because the block + // could be disposed at the same time as the finalizer. + Return(new MemoryPoolBlock(this, slab, offset, length)); + } + } + } + protected override void Dispose(bool disposing) { if (_isDisposed)