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
- MatchAttribute.cs
- FixUp.cs
- HostedHttpTransportManager.cs
- CalendarModeChangedEventArgs.cs
- ConnectionsZone.cs
- SqlExpander.cs
- ParserHooks.cs
- GeometryGroup.cs
- SrgsRule.cs
- SqlCommand.cs
- FilterElement.cs
- XMLUtil.cs
- CookieParameter.cs
- FormsIdentity.cs
- Walker.cs
- ReadContentAsBinaryHelper.cs
- EndpointAddressElementBase.cs
- GenericAuthenticationEventArgs.cs
- TcpChannelHelper.cs
- HtmlControl.cs
- ProtocolState.cs
- BindingNavigator.cs
- XmlReflectionImporter.cs
- ProgressBarRenderer.cs
- DataMember.cs
- RuleElement.cs
- Context.cs
- DataGridViewColumnCollection.cs
- MenuItem.cs
- IgnoreFileBuildProvider.cs
- CellPartitioner.cs
- Bits.cs
- AssertSection.cs
- XmlQualifiedName.cs
- TextFindEngine.cs
- DesignerActionPropertyItem.cs
- AuthorizationRule.cs
- DataGridViewElement.cs
- CodeSubDirectoriesCollection.cs
- SemanticValue.cs
- RouteParametersHelper.cs
- ReadWriteSpinLock.cs
- AnimationException.cs
- XmlValidatingReaderImpl.cs
- TrustManagerPromptUI.cs
- BitStack.cs
- DragAssistanceManager.cs
- DecoderExceptionFallback.cs
- OleServicesContext.cs
- Oci.cs
- EventLogLink.cs
- QuadTree.cs
- IIS7UserPrincipal.cs
- ToolboxBitmapAttribute.cs
- UnsafeNativeMethods.cs
- TemplatedMailWebEventProvider.cs
- VarInfo.cs
- EntityContainerEmitter.cs
- LingerOption.cs
- ReachSerializer.cs
- ReadOnlyDictionary.cs
- StandardToolWindows.cs
- TimerElapsedEvenArgs.cs
- EventWaitHandle.cs
- GridViewDeletedEventArgs.cs
- GroupStyle.cs
- FtpCachePolicyElement.cs
- ChangeProcessor.cs
- TakeQueryOptionExpression.cs
- WindowsAuthenticationEventArgs.cs
- LocalizableResourceBuilder.cs
- CompilationPass2Task.cs
- ListViewContainer.cs
- DataControlPagerLinkButton.cs
- ThreadExceptionDialog.cs
- ACE.cs
- CodeCatchClause.cs
- GestureRecognitionResult.cs
- ExpressionBindingCollection.cs
- TemplateBindingExtensionConverter.cs
- QueryResults.cs
- ParameterCollection.cs
- PropertyPathWorker.cs
- Propagator.JoinPropagator.cs
- SoapSchemaMember.cs
- BidOverLoads.cs
- InvokerUtil.cs
- BlockCollection.cs
- Duration.cs
- RequestBringIntoViewEventArgs.cs
- SpeechEvent.cs
- TrustManagerMoreInformation.cs
- CompareValidator.cs
- XmlSchemaSimpleContent.cs
- CodeTypeReferenceCollection.cs
- FlowPosition.cs
- CqlParser.cs
- xmlsaver.cs
- BuildProvidersCompiler.cs
- InvalidOperationException.cs