SafeMILHandle.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ DotNET / DotNET / 8.0 / untmp / WIN_WINDOWS / lh_tools_devdiv_wpf / Windows / wcp / Core / System / Windows / Media / SafeMILHandle.cs / 1 / SafeMILHandle.cs

                            //---------------------------------------------------------------------------- 
//
// 
//    Copyright (C) Microsoft Corporation.  All rights reserved.
//  
//
// 
// Description: 
//      A safe way to deal with unmanaged MIL interface pointers.
//--------------------------------------------------------------------------- 

using System;
using System.IO;
using System.Security; 
using System.Security.Permissions;
using System.Collections; 
using System.Reflection; 
using MS.Internal;
using MS.Win32; 
using System.Diagnostics;
using System.Windows.Media;
using System.Runtime.InteropServices;
using System.Runtime.CompilerServices; 
using Microsoft.Win32.SafeHandles;
 
using UnsafeNativeMethods=MS.Win32.PresentationCore.UnsafeNativeMethods; 

namespace System.Windows.Media 
{
    internal class SafeMILHandle : SafeHandleZeroOrMinusOneIsInvalid
    {
        ///  
        /// Use this constructor if the handle isn't ready yet and later
        /// set the handle with SetHandle. SafeMILHandle owns the release 
        /// of the handle. 
        /// 
        ///  
        ///    Critical: This derives from a class that has a link demand and inheritance demand
        ///    TreatAsSafe: Ok to call constructor
        ///  
        [SecurityCritical,SecurityTreatAsSafe] 
        internal SafeMILHandle() : base(true)
        { 
        } 

        ///  
        /// Use this constructor if the handle exists at construction time.
        /// SafeMILHandle owns the release of the parameter.
        /// 
        ///  
        ///    Critical: This code calls UpdateEstimatedSize.
        ///                 It is used to keep memory around 
        ///   
        [SecurityCritical]
        internal SafeMILHandle(IntPtr handle, long estimatedSize) : base(true) 
        {
            SetHandle(handle);

            // 
            // Hint the GC at the size of the unmanaged memory associated with
            // this object.  We release pressure in the finalizer. 
            // 

            UpdateEstimatedSize(estimatedSize); 
        }

        /// 
        /// Change our size to the new size specified 
        /// 
        ///  
        ///    Critical: This code calls into AddMemoryPressure and RemoveMemoryPressure 
        ///                 both of which have link demands. It is used to keep memory around
        ///   
        [SecurityCritical]
        internal void UpdateEstimatedSize(long estimatedSize)
        {
            if (_gcPressure > 0) 
            {
                MemoryPressure.Remove(_gcPressure); 
            } 

            _gcPressure = estimatedSize; 

            if (_gcPressure > 0)
            {
                MemoryPressure.Add(_gcPressure); 
            }
        } 
 
        /// 
        /// Critical - calls unmanaged code, not treat as safe because you must 
        ///            validate that handle is a valid COM object.
        /// 
        [SecurityCritical]
        protected override bool ReleaseHandle() 
        {
            UnsafeNativeMethods.MILUnknown.ReleaseInterface(ref handle); 
 
            //
            // We've released the unmanaged memory, so remove associated 
            // GC pressure.
            //

            UpdateEstimatedSize(0); 

            return true; 
        } 

 
        //
        // Estimated size in bytes of the unmanaged memory we are holding onto
        //
 
        private long _gcPressure;
    } 
} 

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
                        

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK