4 using System.Collections.Generic;
6 namespace SiliconStudio.Core
13 private List<object> disposables;
21 get {
return disposables.Count; }
32 if (disposables == null)
37 for (
int i = disposables.Count - 1; i >= 0; i--)
39 var objectToDispose = disposables[i];
40 DisposeObject(objectToDispose);
41 disposables.RemoveAt(i);
48 if (disposables == null)
49 disposables =
new List<object>();
57 public T Add<T>(T objectToDispose)
59 if (!(objectToDispose is IDisposable || objectToDispose is IntPtr || objectToDispose is
IReferencable))
60 throw new ArgumentException(
"Argument must be IDisposable, IReferenceable or IntPtr");
63 if (objectToDispose is IntPtr)
65 var memoryPtr = (IntPtr)(
object)objectToDispose;
67 throw new ArgumentException(
"Memory pointer is invalid. Memory must have been allocated with Utilties.AllocateMemory");
72 if (!disposables.Contains(objectToDispose))
74 disposables.Add(objectToDispose);
76 var referenceableObject = objectToDispose as IReferencable;
77 if (referenceableObject != null)
79 referenceableObject.AddReference();
82 return objectToDispose;
89 public void RemoveAndDispose<T>(ref T objectToDispose)
91 if (disposables != null)
93 Remove(objectToDispose);
94 DisposeObject(objectToDispose);
95 objectToDispose =
default(T);
104 public void Remove<T>(T objectToDispose)
106 if (disposables != null && disposables.Contains(objectToDispose))
108 disposables.Remove(objectToDispose);
111 if (referenceableObject != null)
113 referenceableObject.Release();
118 private void DisposeObject(
object objectToDispose)
120 if (objectToDispose == null || objectToDispose is
IReferencable)
125 var disposableObject = objectToDispose as IDisposable;
126 if (disposableObject != null)
128 disposableObject.Dispose();
132 var localData = (object)objectToDispose;
133 var dataPointer = (IntPtr)localData;
134 Utilities.FreeMemory(dataPointer);
Base interface for all referencable objects.
static bool IsMemoryAligned(IntPtr memoryPtr, int align=16)
Determines whether the specified memory pointer is aligned in memory.
A struct to dispose IDisposable, IReferencable instances and allocated unmanaged memory.
void Dispose()
Disposes all object collected by this class and clear the list. The collector can still be used for c...