Browse Source

Extract UnmanagedBlob to a separated file

pull/8183/head
Max Katz 4 years ago
parent
commit
17a2a4e2e0
  1. 57
      src/Avalonia.Base/Platform/Internal/UnmanagedBlob.cs
  2. 54
      src/Avalonia.Base/Platform/StandardRuntimePlatform.cs

57
src/Avalonia.Base/Platform/Internal/UnmanagedBlob.cs

@ -0,0 +1,57 @@
using System;
using System.Runtime.InteropServices;
namespace Avalonia.Platform.Internal;
internal class UnmanagedBlob : IUnmanagedBlob
{
private IntPtr _address;
private readonly object _lock = new object();
public UnmanagedBlob(int size)
{
try
{
if (size <= 0)
throw new ArgumentException("Positive number required", nameof(size));
_address = Marshal.AllocHGlobal(size);
GC.AddMemoryPressure(size);
Size = size;
}
catch
{
GC.SuppressFinalize(this);
throw;
}
}
private void DoDispose()
{
lock (_lock)
{
if (!IsDisposed)
{
Marshal.FreeHGlobal(_address);
GC.RemoveMemoryPressure(Size);
IsDisposed = true;
_address = IntPtr.Zero;
Size = 0;
}
}
}
public void Dispose()
{
DoDispose();
GC.SuppressFinalize(this);
}
~UnmanagedBlob()
{
DoDispose();
}
public IntPtr Address => IsDisposed ? throw new ObjectDisposedException("UnmanagedBlob") : _address;
public int Size { get; private set; }
public bool IsDisposed { get; private set; }
}

54
src/Avalonia.Base/Platform/StandardRuntimePlatform.cs

@ -1,6 +1,7 @@
using System;
using System.Runtime.InteropServices;
using System.Threading;
using Avalonia.Platform.Internal;
namespace Avalonia.Platform
{
@ -12,59 +13,6 @@ namespace Avalonia.Platform
}
public IUnmanagedBlob AllocBlob(int size) => new UnmanagedBlob(size);
private class UnmanagedBlob : IUnmanagedBlob
{
private IntPtr _address;
private readonly object _lock = new object();
public UnmanagedBlob(int size)
{
try
{
if (size <= 0)
throw new ArgumentException("Positive number required", nameof(size));
_address = Marshal.AllocHGlobal(size);
GC.AddMemoryPressure(size);
Size = size;
}
catch
{
GC.SuppressFinalize(this);
throw;
}
}
private void DoDispose()
{
lock (_lock)
{
if (!IsDisposed)
{
Marshal.FreeHGlobal(_address);
GC.RemoveMemoryPressure(Size);
IsDisposed = true;
_address = IntPtr.Zero;
Size = 0;
}
}
}
public void Dispose()
{
DoDispose();
GC.SuppressFinalize(this);
}
~UnmanagedBlob()
{
DoDispose();
}
public IntPtr Address => IsDisposed ? throw new ObjectDisposedException("UnmanagedBlob") : _address;
public int Size { get; private set; }
public bool IsDisposed { get; private set; }
}
private static readonly Lazy<RuntimePlatformInfo> Info = new(() =>
{

Loading…
Cancel
Save