using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; namespace Urho { /// /// internal class RefCountedCache { Dictionary> knownObjects = new Dictionary>(256); //based on samples (average) public int Count => knownObjects.Count; public void Add(RefCounted refCounted) { lock (knownObjects) { ReferenceHolder knownObject; if (knownObjects.TryGetValue(refCounted.Handle, out knownObject)) { knownObject?.Reference?.Dispose(); } knownObjects[refCounted.Handle] = new ReferenceHolder(refCounted, weak: refCounted.Refs() < 1); } } public bool Remove(IntPtr ptr) { lock (knownObjects) { return knownObjects.Remove(ptr); } } public ReferenceHolder Get(IntPtr ptr) { lock (knownObjects) { ReferenceHolder refCounted; knownObjects.TryGetValue(ptr, out refCounted); return refCounted; } } public void Clean() { lock (knownObjects) { foreach (var referenceHolder in knownObjects.ToArray()) { try { referenceHolder.Value?.Reference?.Dispose(); } catch (Exception exc) { Debug.WriteLine(exc); } } knownObjects.Clear(); } } } }