Esempio n. 1
0
        /// <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;
            }
        }
Esempio n. 2
0
        /// <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);*/
                }
            }
        }