PyMem_Free() private method

private PyMem_Free ( IntPtr ptr ) : void
ptr IntPtr
return void
Exemplo n.º 1
0
        internal static SlotsHolder SetupMetaSlots(Type impl, IntPtr type)
        {
            // Override type slots with those of the managed implementation.
            SlotsHolder slotsHolder = new SlotsHolder(type);

            InitializeSlots(type, impl, slotsHolder);

            // We need space for 3 PyMethodDef structs.
            int    mdefSize  = (MetaType.CustomMethods.Length + 1) * Marshal.SizeOf(typeof(PyMethodDef));
            IntPtr mdef      = Runtime.PyMem_Malloc(mdefSize);
            IntPtr mdefStart = mdef;

            foreach (var methodName in MetaType.CustomMethods)
            {
                mdef = AddCustomMetaMethod(methodName, type, mdef, slotsHolder);
            }
            mdef = WriteMethodDefSentinel(mdef);
            Debug.Assert((long)(mdefStart + mdefSize) <= (long)mdef);

            Marshal.WriteIntPtr(type, TypeOffset.tp_methods, mdefStart);

            // XXX: Hard code with mode check.
            if (Runtime.ShutdownMode != ShutdownMode.Reload)
            {
                slotsHolder.Set(TypeOffset.tp_methods, (t, offset) =>
                {
                    var p = Marshal.ReadIntPtr(t, offset);
                    Runtime.PyMem_Free(p);
                    Marshal.WriteIntPtr(t, offset, IntPtr.Zero);
                });
            }
            return(slotsHolder);
        }
Exemplo n.º 2
0
 public void Dispose()
 {
     if (_disposed)
     {
         return;
     }
     _disposed = true;
     Runtime.XDecref(ptr);
     if (mdef != IntPtr.Zero)
     {
         Runtime.PyMem_Free(mdef);
         mdef = IntPtr.Zero;
     }
 }
Exemplo n.º 3
0
        public void Release()
        {
            if (_disposed)
            {
                return;
            }
            _disposed = true;
            bool freeDef = Runtime.Refcount(ptr) == 1;

            Runtime.XDecref(ptr);
            if (freeDef && mdef != IntPtr.Zero)
            {
                Runtime.PyMem_Free(mdef);
                mdef = IntPtr.Zero;
            }
        }