/// <summary> /// Releases the memory reserved by the pointer /// </summary> public static void Dispose(TPointer self) { try { if (Mapper.IsAllocated(self)) { //Console.WriteLine("Destroying multi_array {0}", this.pointer.ToInt64()); var data = GetData(self); lock (PinnedArrayTracker.ExecuteLock) { if (PinnedArrayTracker.DecReference(data)) { Mapper.SetData(self, IntPtr.Zero); } Mapper.Destroy(self); } } } finally { self.Pointer = IntPtr.Zero; } }
/// <summary> /// Sets the data pointer /// </summary> /// <param name="self">Self.</param> /// <param name="value">Value.</param> public static void SetData(TPointer self, IntPtr value) { var prevPtr = GetData(self); if (prevPtr != value) { PinnedArrayTracker.DecReference(prevPtr); PinnedArrayTracker.IncReference(value); lock (PinnedArrayTracker.ExecuteLock) { Mapper.SetData(self, value); /*if (PinnedArrayTracker.IsManagedData(value)) * Mapper.SetExternal(self, true);*/ } } }