Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / clr / src / BCL / System / Reflection / LoaderAllocator.cs / 1305376 / LoaderAllocator.cs
// ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== //[....] // using System; using System.Reflection; using System.Runtime.InteropServices; using System.Runtime.CompilerServices; using System.Security; using System.Collections.Generic; namespace System.Reflection { // // We can destroy the unmanaged part of collectible type only after the managed part is definitely gone and thus // nobody can call/allocate/reference anything related to the collectible assembly anymore. A call to finalizer // alone does not guarantee that the managed part is gone. A malicious code can keep a reference to some object // in a way that that survives finalization, or we can be running during shutdown where everything is finalized. // // The unmanaged LoaderAllocator keeps a reference to the managed LoaderAllocator in long weak handle. If the long // weak handle is null, we can be sure that the managed part of the LoaderAllocator is definitely gone and that it // is safe to destroy the unmanaged part. Unfortunately, we can not perform the above check in a finalizer on the // LoaderAllocator, but it can be performed on a helper object. // // The finalization does not have to be done using CriticalFinalizerObject. We have to go over all LoaderAllocators // during AppDomain shutdown anyway to avoid leaks e.g. if somebody stores reference to LoaderAllocator in a static. // internal sealed class LoaderAllocatorScout { // This field is set by the VM to atomically transfer the ownership to the managed loader allocator internal IntPtr m_nativeLoaderAllocator; [SuppressUnmanagedCodeSecurity] [SecurityCritical] [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)] private static extern bool Destroy(IntPtr nativeLoaderAllocator); [SecuritySafeCritical] ~LoaderAllocatorScout() { if (m_nativeLoaderAllocator.IsNull()) return; // Destroy returns false if the managed LoaderAllocator is still alive. if (!Destroy(m_nativeLoaderAllocator)) { // Assemblies and LoaderAllocators will be cleaned up during AppDomain shutdown in // unmanaged code // So it is ok to skip reregistration for finalization during appdomain shutdown if (!Environment.HasShutdownStarted && !AppDomain.CurrentDomain.IsFinalizingForUnload()) { // Somebody might have been holding a reference on us via weak handle. // We will keep trying. It will be hopefully released eventually. GC.ReRegisterForFinalize(this); } } } } internal sealed class LoaderAllocator { LoaderAllocator() { m_slots = new object [5]; // m_slotsUsed = 0; m_scout = new LoaderAllocatorScout(); } #pragma warning disable 169 #pragma warning disable 414 LoaderAllocatorScout m_scout; object [] m_slots; internal CerHashtablem_methodInstantiations; int m_slotsUsed; #pragma warning restore 414 #pragma warning restore 169 } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== // [....] // using System; using System.Reflection; using System.Runtime.InteropServices; using System.Runtime.CompilerServices; using System.Security; using System.Collections.Generic; namespace System.Reflection { // // We can destroy the unmanaged part of collectible type only after the managed part is definitely gone and thus // nobody can call/allocate/reference anything related to the collectible assembly anymore. A call to finalizer // alone does not guarantee that the managed part is gone. A malicious code can keep a reference to some object // in a way that that survives finalization, or we can be running during shutdown where everything is finalized. // // The unmanaged LoaderAllocator keeps a reference to the managed LoaderAllocator in long weak handle. If the long // weak handle is null, we can be sure that the managed part of the LoaderAllocator is definitely gone and that it // is safe to destroy the unmanaged part. Unfortunately, we can not perform the above check in a finalizer on the // LoaderAllocator, but it can be performed on a helper object. // // The finalization does not have to be done using CriticalFinalizerObject. We have to go over all LoaderAllocators // during AppDomain shutdown anyway to avoid leaks e.g. if somebody stores reference to LoaderAllocator in a static. // internal sealed class LoaderAllocatorScout { // This field is set by the VM to atomically transfer the ownership to the managed loader allocator internal IntPtr m_nativeLoaderAllocator; [SuppressUnmanagedCodeSecurity] [SecurityCritical] [DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)] private static extern bool Destroy(IntPtr nativeLoaderAllocator); [SecuritySafeCritical] ~LoaderAllocatorScout() { if (m_nativeLoaderAllocator.IsNull()) return; // Destroy returns false if the managed LoaderAllocator is still alive. if (!Destroy(m_nativeLoaderAllocator)) { // Assemblies and LoaderAllocators will be cleaned up during AppDomain shutdown in // unmanaged code // So it is ok to skip reregistration for finalization during appdomain shutdown if (!Environment.HasShutdownStarted && !AppDomain.CurrentDomain.IsFinalizingForUnload()) { // Somebody might have been holding a reference on us via weak handle. // We will keep trying. It will be hopefully released eventually. GC.ReRegisterForFinalize(this); } } } } internal sealed class LoaderAllocator { LoaderAllocator() { m_slots = new object [5]; // m_slotsUsed = 0; m_scout = new LoaderAllocatorScout(); } #pragma warning disable 169 #pragma warning disable 414 LoaderAllocatorScout m_scout; object [] m_slots; internal CerHashtablem_methodInstantiations; int m_slotsUsed; #pragma warning restore 414 #pragma warning restore 169 } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- X509ChainPolicy.cs
- Material.cs
- WebBrowserBase.cs
- SafeSystemMetrics.cs
- BufferAllocator.cs
- AsyncResult.cs
- EventTrigger.cs
- TypeConverter.cs
- BasicAsyncResult.cs
- EndPoint.cs
- DataGridViewRowsRemovedEventArgs.cs
- SizeF.cs
- RuntimeHelpers.cs
- SimpleFileLog.cs
- DESCryptoServiceProvider.cs
- ConditionalAttribute.cs
- SmiConnection.cs
- LongValidatorAttribute.cs
- SizeAnimation.cs
- ExeConfigurationFileMap.cs
- DependencySource.cs
- ADMembershipProvider.cs
- AttributeCollection.cs
- GreenMethods.cs
- EventLogStatus.cs
- BaseDataBoundControl.cs
- ApplicationTrust.cs
- AuthenticationManager.cs
- Parser.cs
- MediaElement.cs
- DataColumnPropertyDescriptor.cs
- TabletCollection.cs
- ResourceContainer.cs
- Operator.cs
- Formatter.cs
- GridViewAutomationPeer.cs
- ProfessionalColorTable.cs
- Token.cs
- DataSourceCacheDurationConverter.cs
- AtomServiceDocumentSerializer.cs
- TextParagraphView.cs
- Odbc32.cs
- FillBehavior.cs
- EventDescriptor.cs
- HandleRef.cs
- WindowExtensionMethods.cs
- Helper.cs
- RouteParametersHelper.cs
- CharUnicodeInfo.cs
- WebPartEditorOkVerb.cs
- DataRecord.cs
- Zone.cs
- DiscoveryClientChannelFactory.cs
- TraceProvider.cs
- SimpleBitVector32.cs
- LinqDataSourceDisposeEventArgs.cs
- MouseWheelEventArgs.cs
- FamilyTypefaceCollection.cs
- FlowPanelDesigner.cs
- WebPartRestoreVerb.cs
- IpcPort.cs
- SqlNode.cs
- Misc.cs
- CodeRegionDirective.cs
- WebPartConnectVerb.cs
- CodeRegionDirective.cs
- CustomLineCap.cs
- MemberAssignment.cs
- SystemInfo.cs
- OutputCacheEntry.cs
- PermissionSetTriple.cs
- KeyGesture.cs
- X509Certificate.cs
- XmlToDatasetMap.cs
- AttributeConverter.cs
- MarshalDirectiveException.cs
- TemplateKeyConverter.cs
- ColumnHeader.cs
- NotImplementedException.cs
- ContractNamespaceAttribute.cs
- OuterGlowBitmapEffect.cs
- FixedHyperLink.cs
- XmlNavigatorStack.cs
- _NegoStream.cs
- MetadataItem_Static.cs
- SimpleExpression.cs
- FactoryRecord.cs
- WebPageTraceListener.cs
- SctClaimSerializer.cs
- WorkflowRuntimeElement.cs
- GregorianCalendarHelper.cs
- ServicePoint.cs
- AttributeCollection.cs
- TabItem.cs
- ColumnCollection.cs
- MouseWheelEventArgs.cs
- PeerResolverMode.cs
- DataColumnCollection.cs
- MulticastDelegate.cs
- XmlComment.cs