From 957276d329566ad7dc205ac3a1dbafdedaa91995 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartosz=20Korczy=C5=84ski?= Date: Sun, 14 Apr 2024 02:06:32 +0100 Subject: [PATCH] Add locks in GeometryImpl for safe multithreaded access (#15153) * Add locks in GeometryImpl for safe multithreaded access * Change lock(this) to lock(_lock) --- src/Skia/Avalonia.Skia/GeometryImpl.cs | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/Skia/Avalonia.Skia/GeometryImpl.cs b/src/Skia/Avalonia.Skia/GeometryImpl.cs index a5797d7fd5..1685dc9d20 100644 --- a/src/Skia/Avalonia.Skia/GeometryImpl.cs +++ b/src/Skia/Avalonia.Skia/GeometryImpl.cs @@ -13,6 +13,7 @@ namespace Avalonia.Skia /// internal abstract class GeometryImpl : IGeometryImpl { + private readonly object _lock = new(); private PathCache _pathCache; private SKPathMeasure? _cachedPathMeasure; @@ -45,9 +46,12 @@ namespace Avalonia.Skia /// 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); + } } /// @@ -73,8 +77,11 @@ namespace Avalonia.Skia /// 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 /// protected void InvalidateCaches() { - _pathCache.Dispose(); - _pathCache = default; + lock (_lock) + { + _pathCache.Dispose(); + _pathCache = default; + } } private struct PathCache : IDisposable