Skip to content

Commit 9895b5d

Browse files
committed
Refactor Reference.Counter to use ConcurrentDictionary for thread safety and improve reference management
1 parent 8ab8f58 commit 9895b5d

File tree

3 files changed

+15
-16
lines changed

3 files changed

+15
-16
lines changed

Assets/_PackageRoot/Runtime/ImageLoader.LoadSpriteRef.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@ public static Future<Reference<Sprite>> LoadSpriteRef(string url, Vector2 pivot,
3434
future.LoadingFromSource (() => futureRef.Loading(FutureLoadingFrom.Source));
3535
future.LoadedFromSource (sprite => futureRef.Loaded(new Reference<Sprite>(future.Url, sprite), FutureLoadedFrom.Source));
3636
future.Failed (futureRef.FailToLoad);
37-
futureRef.Canceled (future.Cancel);
37+
38+
futureRef.Canceled(future.Cancel);
3839

3940
InternalLoadSprite(future, pivot, textureFormat, ignoreImageNotFoundError);
4041
return futureRef;
@@ -43,14 +44,13 @@ public static Future<Reference<Sprite>> LoadSpriteRef(string url, Vector2 pivot,
4344
/// <summary>
4445
/// Clear all references to all loaded sprites
4546
/// </summary>
46-
/// <returns>Returns sprite asynchronously </returns>
4747
public static void ClearRef() => Reference<Sprite>.Clear();
4848

4949
/// <summary>
5050
/// Clear all references to a single loaded sprites by URL
5151
/// </summary>
5252
/// <param name="url">URL to the picture, web or local</param>
53-
/// <returns>Returns sprite asynchronously </returns>
54-
public static void ClearRef(string url) => Reference<Sprite>.Clear(url);
53+
/// <returns>Returns operation status boolean</returns>
54+
public static bool ClearRef(string url) => Reference<Sprite>.Clear(url);
5555
}
5656
}

Assets/_PackageRoot/Runtime/Reference.Counter.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,23 @@
11
using System;
2+
using System.Collections.Concurrent;
23
using System.Collections.Generic;
34

45
namespace Extensions.Unity.ImageLoader
56
{
67
public partial class Reference<T> : IDisposable
78
{
8-
private volatile static Dictionary<string, int> referenceCounters = new Dictionary<string, int>();
9+
private volatile static ConcurrentDictionary<string, int> referenceCounters = new ConcurrentDictionary<string, int>();
910
internal static void Clear()
1011
{
1112
lock (referenceCounters) referenceCounters.Clear();
1213
EventOnClearAll?.Invoke();
1314
}
14-
internal static void Clear(string url)
15+
internal static bool Clear(string url)
1516
{
16-
lock (referenceCounters) referenceCounters.Remove(url);
17+
var result = false;
18+
lock (referenceCounters) result = referenceCounters.Remove(url, out var _);
1719
EventOnClearUrl?.Invoke(url);
20+
return result;
1821
}
1922
public static int Counter(string url)
2023
{

Assets/_PackageRoot/Runtime/Reference.cs

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ internal Reference(string url, T value)
2929

3030
lock (referenceCounters)
3131
{
32-
referenceCounters[url] = Math.Max(0, referenceCounters.GetValueOrDefault(url, 0)) + 1;
32+
referenceCounters.AddOrUpdate(url, 1, (key, oldValue) => oldValue + 1);
3333
if (ImageLoader.settings.debugLevel <= DebugLevel.Log)
3434
Debug.Log($"[ImageLoader] Ref[id={id}] Reference created [{referenceCounters[url]}] URL={url}");
3535
}
@@ -62,14 +62,10 @@ public void Dispose()
6262

6363
lock (referenceCounters)
6464
{
65-
if (referenceCounters.ContainsKey(Url))
66-
referenceCounters[Url]--;
65+
referenceCounters.AddOrUpdate(Url, 0, (key, oldValue) => oldValue - 1);
6766

68-
if (referenceCounters.GetValueOrDefault(Url) < 0)
69-
{
70-
if (ImageLoader.settings.debugLevel <= DebugLevel.Warning)
71-
Debug.LogError($"[ImageLoader] Ref[id={id}] Reference dispose has negative counter URL={Url}");
72-
}
67+
if (ImageLoader.settings.debugLevel <= DebugLevel.Warning && referenceCounters.GetValueOrDefault(Url) < 0)
68+
Debug.LogWarning($"[ImageLoader] Ref[id={id}] Reference dispose has negative counter URL={Url}");
7369

7470
if (Keep)
7571
{
@@ -81,7 +77,7 @@ public void Dispose()
8177
if (ImageLoader.settings.debugLevel <= DebugLevel.Log)
8278
Debug.Log($"[ImageLoader] Ref[id={id}] Reference dispose of URL={Url}");
8379

84-
if (!referenceCounters.ContainsKey(Url) || referenceCounters[Url] == 0)
80+
if (referenceCounters.GetValueOrDefault(Url) == 0)
8581
ImageLoader.ClearMemoryCache(Url);
8682
}
8783
}

0 commit comments

Comments
 (0)