Browse Source

Add locks in GeometryImpl for safe multithreaded access (#15153)

* Add locks in GeometryImpl for safe multithreaded access

* Change lock(this) to lock(_lock)
release/11.1.0-beta2
Bartosz Korczyński 2 years ago
committed by Max Katz
parent
commit
957276d329
  1. 22
      src/Skia/Avalonia.Skia/GeometryImpl.cs

22
src/Skia/Avalonia.Skia/GeometryImpl.cs

@ -13,6 +13,7 @@ namespace Avalonia.Skia
/// </summary>
internal abstract class GeometryImpl : IGeometryImpl
{
private readonly object _lock = new();
private PathCache _pathCache;
private SKPathMeasure? _cachedPathMeasure;
@ -45,9 +46,12 @@ namespace Avalonia.Skia
/// <inheritdoc />
public bool StrokeContains(IPen? pen, Point point)
{
_pathCache.UpdateIfNeeded(StrokePath, pen);
lock (_lock)
{
_pathCache.UpdateIfNeeded(StrokePath, pen);
return PathContainsCore(_pathCache.ExpandedPath, point);
return PathContainsCore(_pathCache.ExpandedPath, point);
}
}
/// <summary>
@ -73,8 +77,11 @@ namespace Avalonia.Skia
/// <inheritdoc />
public Rect GetRenderBounds(IPen? pen)
{
_pathCache.UpdateIfNeeded(StrokePath, pen);
return _pathCache.RenderBounds;
lock (_lock)
{
_pathCache.UpdateIfNeeded(StrokePath, pen);
return _pathCache.RenderBounds;
}
}
public IGeometryImpl GetWidenedGeometry(IPen pen)
@ -154,8 +161,11 @@ namespace Avalonia.Skia
/// </summary>
protected void InvalidateCaches()
{
_pathCache.Dispose();
_pathCache = default;
lock (_lock)
{
_pathCache.Dispose();
_pathCache = default;
}
}
private struct PathCache : IDisposable

Loading…
Cancel
Save