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
- SHA1.cs
- ClientTargetSection.cs
- WebBrowserHelper.cs
- StringHandle.cs
- PropertyTabChangedEvent.cs
- ViewKeyConstraint.cs
- ConfigurationValue.cs
- ExceptionUtil.cs
- ThicknessConverter.cs
- RsaKeyGen.cs
- TableLayoutRowStyleCollection.cs
- ScaleTransform3D.cs
- WindowsListViewGroupSubsetLink.cs
- Schema.cs
- IPAddressCollection.cs
- ForwardPositionQuery.cs
- SystemColorTracker.cs
- ConvertTextFrag.cs
- PagedDataSource.cs
- PixelShader.cs
- Menu.cs
- _ListenerAsyncResult.cs
- CommentGlyph.cs
- AvtEvent.cs
- ProcessInputEventArgs.cs
- ErrorTableItemStyle.cs
- SocketInformation.cs
- WebSysDisplayNameAttribute.cs
- DataObjectAttribute.cs
- SqlClientPermission.cs
- XamlSerializer.cs
- CategoryAttribute.cs
- UiaCoreProviderApi.cs
- BatchServiceHost.cs
- SimpleLine.cs
- TextViewBase.cs
- BasicExpressionVisitor.cs
- ExtensionSimplifierMarkupObject.cs
- TextParagraphView.cs
- MSAAWinEventWrap.cs
- DBDataPermission.cs
- DefaultEventAttribute.cs
- AspNetHostingPermission.cs
- Matrix3D.cs
- ClonableStack.cs
- SelfIssuedAuthRSACryptoProvider.cs
- shaperfactory.cs
- RegistrySecurity.cs
- IncrementalReadDecoders.cs
- SecurityElement.cs
- GlyphInfoList.cs
- SaveFileDialog.cs
- SafeEventLogReadHandle.cs
- Compiler.cs
- UTF8Encoding.cs
- GenericsInstances.cs
- QueryExpr.cs
- RuntimeIdentifierPropertyAttribute.cs
- CaseInsensitiveComparer.cs
- SequenceQuery.cs
- OperandQuery.cs
- PenCursorManager.cs
- DuplicateWaitObjectException.cs
- cookiecontainer.cs
- PagerSettings.cs
- InputLanguageEventArgs.cs
- StateDesigner.TransitionInfo.cs
- XmlLangPropertyAttribute.cs
- MessageDecoder.cs
- ListBindingConverter.cs
- ContextProperty.cs
- DataControlCommands.cs
- NullableIntMinMaxAggregationOperator.cs
- EventRouteFactory.cs
- MultipartIdentifier.cs
- SolidColorBrush.cs
- RestClientProxyHandler.cs
- Label.cs
- FunctionDetailsReader.cs
- FormatVersion.cs
- SiteMapProvider.cs
- ProtocolsConfigurationEntry.cs
- EmptyElement.cs
- CachedRequestParams.cs
- OpenTypeMethods.cs
- Msmq3PoisonHandler.cs
- DataGridTextBoxColumn.cs
- PageContent.cs
- ImportedNamespaceContextItem.cs
- ColorDialog.cs
- XslAst.cs
- TracePayload.cs
- ClientRuntimeConfig.cs
- Utils.cs
- ReflectEventDescriptor.cs
- AdornerPresentationContext.cs
- PeerInputChannel.cs
- NetworkStream.cs
- HitTestDrawingContextWalker.cs
- WebGetAttribute.cs