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
- ImageMetadata.cs
- _PooledStream.cs
- CqlIdentifiers.cs
- FixUpCollection.cs
- EDesignUtil.cs
- PageVisual.cs
- AmbientProperties.cs
- WindowsEditBox.cs
- FatalException.cs
- ShortcutKeysEditor.cs
- LoadItemsEventArgs.cs
- DataGridViewMethods.cs
- UIElementParaClient.cs
- SqlProcedureAttribute.cs
- VisualStyleRenderer.cs
- TheQuery.cs
- ItemsChangedEventArgs.cs
- MetadataArtifactLoaderComposite.cs
- AutoResetEvent.cs
- ControllableStoryboardAction.cs
- SqlCharStream.cs
- SourceLineInfo.cs
- ObfuscateAssemblyAttribute.cs
- DispatcherFrame.cs
- ObservableCollection.cs
- WeakEventTable.cs
- ElementHostPropertyMap.cs
- DataDocumentXPathNavigator.cs
- ProcessModelSection.cs
- Pens.cs
- WindowsComboBox.cs
- DesignTimeTemplateParser.cs
- CodeMemberProperty.cs
- CodeCommentStatement.cs
- EmbeddedMailObject.cs
- TextPenaltyModule.cs
- ProgressChangedEventArgs.cs
- XmlnsCache.cs
- CodeTypeReferenceCollection.cs
- StagingAreaInputItem.cs
- StateMachineExecutionState.cs
- Schema.cs
- WebScriptEndpoint.cs
- ReferenceTypeElement.cs
- Clipboard.cs
- CommandField.cs
- StorageAssociationSetMapping.cs
- ByteStorage.cs
- oledbconnectionstring.cs
- MulticastOption.cs
- DataServiceStreamResponse.cs
- DecimalStorage.cs
- NetTcpSectionData.cs
- ServiceMemoryGates.cs
- AssemblyBuilderData.cs
- BamlWriter.cs
- GifBitmapDecoder.cs
- WindowsImpersonationContext.cs
- ProfilePropertyNameValidator.cs
- IOException.cs
- Expressions.cs
- SystemUdpStatistics.cs
- XmlNode.cs
- SemanticAnalyzer.cs
- WindowsSolidBrush.cs
- OleDbEnumerator.cs
- XmlSchemaSimpleContent.cs
- BufferAllocator.cs
- WindowsFormsHost.cs
- iisPickupDirectory.cs
- TimeSpanValidator.cs
- TextSpan.cs
- SwitchAttribute.cs
- ExpressionConverter.cs
- X509UI.cs
- SqlDataSource.cs
- TypeCodeDomSerializer.cs
- OperatingSystem.cs
- TokenizerHelper.cs
- ListViewAutomationPeer.cs
- DefaultValueMapping.cs
- FrameworkObject.cs
- DefaultEvaluationContext.cs
- LogEntryHeaderv1Deserializer.cs
- StickyNoteHelper.cs
- ExitEventArgs.cs
- Logging.cs
- Substitution.cs
- StyleTypedPropertyAttribute.cs
- CachedBitmap.cs
- WindowsTokenRoleProvider.cs
- UserControl.cs
- EdgeProfileValidation.cs
- SecurityCapabilities.cs
- ComboBoxRenderer.cs
- BatchServiceHost.cs
- OracleDateTime.cs
- WindowsFormsLinkLabel.cs
- SecureStringHasher.cs
- ParseChildrenAsPropertiesAttribute.cs