|
|
|
@ -1,11 +1,10 @@ |
|
|
|
// Copyright (c) Six Labors.
|
|
|
|
// Copyright (c) Six Labors.
|
|
|
|
// Licensed under the Apache License, Version 2.0.
|
|
|
|
|
|
|
|
using System; |
|
|
|
using System.Buffers; |
|
|
|
using System.Runtime.CompilerServices; |
|
|
|
using System.Runtime.InteropServices; |
|
|
|
using System.Threading; |
|
|
|
using SixLabors.ImageSharp.Memory.Internals; |
|
|
|
|
|
|
|
namespace SixLabors.ImageSharp.Memory |
|
|
|
@ -22,7 +21,7 @@ namespace SixLabors.ImageSharp.Memory |
|
|
|
private readonly int poolCapacity; |
|
|
|
private readonly UniformUnmanagedMemoryPool.TrimSettings trimSettings; |
|
|
|
|
|
|
|
private UniformUnmanagedMemoryPool pool; |
|
|
|
private readonly UniformUnmanagedMemoryPool pool; |
|
|
|
private readonly UnmanagedMemoryAllocator nonPoolAllocator; |
|
|
|
|
|
|
|
public UniformUnmanagedMemoryPoolMemoryAllocator(int? maxPoolSizeMegabytes) |
|
|
|
@ -74,6 +73,12 @@ namespace SixLabors.ImageSharp.Memory |
|
|
|
this.nonPoolAllocator = new UnmanagedMemoryAllocator(unmanagedBufferSizeInBytes); |
|
|
|
} |
|
|
|
|
|
|
|
#if NETCOREAPP3_1_OR_GREATER
|
|
|
|
// This delegate allows overriding the method returning the available system memory,
|
|
|
|
// so we can test our workaround for https://github.com/dotnet/runtime/issues/65466
|
|
|
|
internal static Func<long> GetTotalAvailableMemoryBytes { get; set; } = () => GC.GetGCMemoryInfo().TotalAvailableMemoryBytes; |
|
|
|
#endif
|
|
|
|
|
|
|
|
/// <inheritdoc />
|
|
|
|
protected internal override int GetBufferCapacityInBytes() => this.poolBufferSizeInBytes; |
|
|
|
|
|
|
|
@ -152,8 +157,13 @@ namespace SixLabors.ImageSharp.Memory |
|
|
|
// https://github.com/dotnet/runtime/issues/55126#issuecomment-876779327
|
|
|
|
if (Environment.Is64BitProcess || !RuntimeInformation.FrameworkDescription.StartsWith(".NET 5.0")) |
|
|
|
{ |
|
|
|
GCMemoryInfo info = GC.GetGCMemoryInfo(); |
|
|
|
return info.TotalAvailableMemoryBytes / 8; |
|
|
|
long total = GetTotalAvailableMemoryBytes(); |
|
|
|
|
|
|
|
// Workaround for https://github.com/dotnet/runtime/issues/65466
|
|
|
|
if (total > 0) |
|
|
|
{ |
|
|
|
return total / 8; |
|
|
|
} |
|
|
|
} |
|
|
|
#endif
|
|
|
|
|
|
|
|
|