Code:
/ 4.0 / 4.0 / untmp / 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.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- BitmapImage.cs
- Exceptions.cs
- GenerateTemporaryTargetAssembly.cs
- TypeUsage.cs
- PassportAuthentication.cs
- FontUnitConverter.cs
- DocumentViewerBaseAutomationPeer.cs
- HttpCookieCollection.cs
- SequentialUshortCollection.cs
- HttpRuntime.cs
- XmlSchemaAttributeGroupRef.cs
- QueryStatement.cs
- EntityDataSourceChangingEventArgs.cs
- Route.cs
- SessionStateContainer.cs
- ExtensibleClassFactory.cs
- RegexRunner.cs
- Mutex.cs
- XmlLinkedNode.cs
- CodeAttributeDeclarationCollection.cs
- MetabaseSettings.cs
- XPathChildIterator.cs
- httpapplicationstate.cs
- SystemUnicastIPAddressInformation.cs
- ParsedAttributeCollection.cs
- WebBrowserContainer.cs
- ErrorWrapper.cs
- XmlHierarchyData.cs
- WindowsListViewScroll.cs
- XmlNamedNodeMap.cs
- QueueProcessor.cs
- SqlInternalConnection.cs
- RewritingPass.cs
- HostingEnvironmentSection.cs
- LineSegment.cs
- Mapping.cs
- SqlAliaser.cs
- SelectionRangeConverter.cs
- EntityKeyElement.cs
- OrderedDictionaryStateHelper.cs
- _FtpDataStream.cs
- HiddenFieldPageStatePersister.cs
- RelatedEnd.cs
- KoreanLunisolarCalendar.cs
- ControlPaint.cs
- ExpressionList.cs
- CompareValidator.cs
- HttpRuntime.cs
- XmlSchemaSet.cs
- ToolboxItemCollection.cs
- followingquery.cs
- DefaultEventAttribute.cs
- RichTextBoxAutomationPeer.cs
- LogPolicy.cs
- XmlCodeExporter.cs
- ListMarkerLine.cs
- HttpCacheParams.cs
- ArgIterator.cs
- DataGridViewMethods.cs
- HandleTable.cs
- ImageAttributes.cs
- ProcessModelSection.cs
- DataGridRow.cs
- shaperfactory.cs
- KeyedHashAlgorithm.cs
- ToolStripDesigner.cs
- AnnotationElement.cs
- XPathExpr.cs
- XmlSchemaType.cs
- EntityDataSourceViewSchema.cs
- StringSorter.cs
- HttpResponseInternalBase.cs
- MimePart.cs
- AuthenticationModuleElementCollection.cs
- XmlQueryRuntime.cs
- XPathPatternParser.cs
- MarkupCompilePass1.cs
- CollectionConverter.cs
- FontNamesConverter.cs
- AncillaryOps.cs
- IImplicitResourceProvider.cs
- DataGridCaption.cs
- FaultImportOptions.cs
- ExpressionBuilder.cs
- ScrollBarAutomationPeer.cs
- DataGridViewCellConverter.cs
- CheckedPointers.cs
- Listbox.cs
- TreeNodeClickEventArgs.cs
- WindowsRichEdit.cs
- CollectionContainer.cs
- Int16Storage.cs
- RNGCryptoServiceProvider.cs
- DataStreamFromComStream.cs
- InteropAutomationProvider.cs
- ITreeGenerator.cs
- TextElementAutomationPeer.cs
- CryptoHelper.cs
- WhereQueryOperator.cs
- Stack.cs