modules/platforms/dotnet/Apache.Ignite/Internal/Buffers/ByteArrayPool.cs (25 lines of code) (raw):

/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ namespace Apache.Ignite.Internal.Buffers { using System.Buffers; /// <summary> /// Wrapper for the standard <see cref="ArrayPool{T}.Shared"/> with safety checks in debug mode. /// </summary> internal static class ByteArrayPool { #if DEBUG /// <summary> /// Track pooled arrays in debug mode to detect double-return - the most dangerous scenario which can cause application-wide /// memory corruption, when the same array is returned from the pool twice and used concurrently. /// /// In the future there should be some built-in ways to detect this: /// https://github.com/dotnet/runtime/issues/7532. /// </summary> private static readonly System.Runtime.CompilerServices.ConditionalWeakTable<byte[], object?> ReturnedArrays = new(); #endif /// <summary> /// Retrieves a buffer that is at least the requested length. /// </summary> /// <param name="minimumLength">The minimum length of the array.</param> /// <returns>An byte array that is at least <paramref name="minimumLength" /> in length.</returns> public static byte[] Rent(int minimumLength) { var bytes = ArrayPool<byte>.Shared.Rent(minimumLength); #if DEBUG ReturnedArrays.Remove(bytes); #endif return bytes; } /// <summary> /// Returns an array to the pool that was previously obtained using the <see cref="Rent" /> method. /// </summary> /// <param name="array">A buffer to return to the pool that was previously obtained using the <see cref="Rent" /> method.</param> public static void Return(byte[] array) { #if DEBUG // Will throw when key exists. ReturnedArrays.Add(array, null); #endif ArrayPool<byte>.Shared.Return(array); } } }