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
- DebuggerAttributes.cs
- ExtensibleClassFactory.cs
- Rectangle.cs
- PermissionSetTriple.cs
- DataBoundControlHelper.cs
- ReadOnlyDataSourceView.cs
- SimpleHandlerBuildProvider.cs
- ValidationError.cs
- XmlTextReader.cs
- TypeContext.cs
- XmlBindingWorker.cs
- XmlSerializer.cs
- OrderedDictionary.cs
- ConfigurationProperty.cs
- FrameworkTextComposition.cs
- EntityDataSourceChangedEventArgs.cs
- Msec.cs
- TableHeaderCell.cs
- TextEditorTyping.cs
- SafeFileHandle.cs
- Walker.cs
- DataPagerField.cs
- TextSimpleMarkerProperties.cs
- XmlToDatasetMap.cs
- ISFTagAndGuidCache.cs
- XmlSchemaIdentityConstraint.cs
- CompressStream.cs
- TabControlCancelEvent.cs
- Popup.cs
- RightsManagementEncryptedStream.cs
- MsmqIntegrationSecurity.cs
- TempFiles.cs
- XamlVector3DCollectionSerializer.cs
- WrappedKeySecurityToken.cs
- CreateUserWizardStep.cs
- EncodingNLS.cs
- PropertyCollection.cs
- ToolStripProfessionalLowResolutionRenderer.cs
- BaseDataList.cs
- HttpPostLocalhostServerProtocol.cs
- SynchronizedInputProviderWrapper.cs
- LocatorManager.cs
- FilterException.cs
- ProfileService.cs
- AssociationTypeEmitter.cs
- CurrencyWrapper.cs
- Point3DAnimationUsingKeyFrames.cs
- ComboBoxRenderer.cs
- TypeDelegator.cs
- Avt.cs
- RadioButtonStandardAdapter.cs
- Button.cs
- FormsAuthenticationCredentials.cs
- UInt16Converter.cs
- SmiMetaData.cs
- LogRecordSequence.cs
- BuildProviderInstallComponent.cs
- XNodeValidator.cs
- TypeConverterHelper.cs
- WindowsGraphicsWrapper.cs
- CodeIdentifier.cs
- RichTextBox.cs
- PolyLineSegment.cs
- SimpleType.cs
- KeyGestureConverter.cs
- DataGridViewCell.cs
- TrackingServices.cs
- ListBoxItem.cs
- TrackBarDesigner.cs
- XPathQilFactory.cs
- CacheRequest.cs
- ServiceCredentials.cs
- MarkupObject.cs
- ConfigurationPermission.cs
- GenericXmlSecurityToken.cs
- SessionStateUtil.cs
- CodeTryCatchFinallyStatement.cs
- ContextStaticAttribute.cs
- ToolStripContentPanel.cs
- OleDbFactory.cs
- XmlKeywords.cs
- ErrorItem.cs
- TextFormattingConverter.cs
- TypeToken.cs
- DefaultClaimSet.cs
- Point3D.cs
- HtmlInputControl.cs
- VisualStyleInformation.cs
- ProxyWebPart.cs
- _LazyAsyncResult.cs
- GroupQuery.cs
- PipelineComponent.cs
- SuppressMessageAttribute.cs
- Empty.cs
- ToolStripSplitStackLayout.cs
- XmlSchemaExternal.cs
- Dynamic.cs
- MemberDomainMap.cs
- OutOfProcStateClientManager.cs
- ReferentialConstraint.cs