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
- TransactionOptions.cs
- FontStyleConverter.cs
- TemplatedWizardStep.cs
- RegularExpressionValidator.cs
- WebPartActionVerb.cs
- WebPartConnectionsConfigureVerb.cs
- CompilationLock.cs
- GroupBox.cs
- LineProperties.cs
- Mapping.cs
- RSACryptoServiceProvider.cs
- CompilerHelpers.cs
- SignatureGenerator.cs
- DataContractSet.cs
- FormattedTextSymbols.cs
- CodeStatementCollection.cs
- FixedSOMPageElement.cs
- HotSpotCollection.cs
- RevocationPoint.cs
- XmlSerializerNamespaces.cs
- Menu.cs
- XmlText.cs
- ResXDataNode.cs
- WorkflowServiceHostFactory.cs
- DataBoundControlAdapter.cs
- ImmutableCollection.cs
- TreeViewImageKeyConverter.cs
- InvalidComObjectException.cs
- FragmentQueryKB.cs
- ThousandthOfEmRealPoints.cs
- ParserExtension.cs
- DataGridViewAddColumnDialog.cs
- SortExpressionBuilder.cs
- Cursor.cs
- ContextStack.cs
- MailSettingsSection.cs
- ComNativeDescriptor.cs
- AstNode.cs
- __TransparentProxy.cs
- LoginView.cs
- ButtonBase.cs
- ContainerParaClient.cs
- HMACSHA256.cs
- WebWorkflowRole.cs
- SizeAnimationClockResource.cs
- CustomExpressionEventArgs.cs
- SystemIcmpV6Statistics.cs
- DbTransaction.cs
- WindowsEditBox.cs
- XmlKeywords.cs
- MatrixAnimationUsingKeyFrames.cs
- FileInfo.cs
- AsnEncodedData.cs
- StreamAsIStream.cs
- QueueAccessMode.cs
- SystemFonts.cs
- BCLDebug.cs
- SettingsBindableAttribute.cs
- ToolZone.cs
- MultiView.cs
- FaultFormatter.cs
- SQLChars.cs
- CopyCodeAction.cs
- BamlLocalizer.cs
- BlurEffect.cs
- UserPersonalizationStateInfo.cs
- StringSorter.cs
- TraceUtility.cs
- ChildrenQuery.cs
- FloaterParaClient.cs
- RootProjectionNode.cs
- StateDesignerConnector.cs
- UInt64.cs
- VisualTreeUtils.cs
- ChannelBase.cs
- ResizeGrip.cs
- ParameterCollection.cs
- StatusBarItem.cs
- isolationinterop.cs
- PropertiesTab.cs
- DeviceContext.cs
- TraceSection.cs
- WindowsClaimSet.cs
- TextMetrics.cs
- EntityKeyElement.cs
- BaseDataListComponentEditor.cs
- ObjectDataSourceStatusEventArgs.cs
- ObjectDataSourceStatusEventArgs.cs
- MatrixTransform3D.cs
- TimeSpanConverter.cs
- InitiatorServiceModelSecurityTokenRequirement.cs
- ReflectionTypeLoadException.cs
- StatusCommandUI.cs
- ResourceAttributes.cs
- Menu.cs
- Queue.cs
- CompilerInfo.cs
- HtmlInputImage.cs
- BatchWriter.cs
- Misc.cs