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
- DynamicMetaObjectBinder.cs
- DbConnectionStringCommon.cs
- MailMessageEventArgs.cs
- MetaType.cs
- ColorConverter.cs
- NodeCounter.cs
- MenuItemStyleCollection.cs
- WpfWebRequestHelper.cs
- UriWriter.cs
- MultiPropertyDescriptorGridEntry.cs
- ClearTypeHintValidation.cs
- BoolExpression.cs
- SQLConvert.cs
- AppLevelCompilationSectionCache.cs
- PasswordTextNavigator.cs
- TextAction.cs
- __ComObject.cs
- Table.cs
- RuleSetCollection.cs
- ImageUrlEditor.cs
- SqlFacetAttribute.cs
- HtmlEmptyTagControlBuilder.cs
- Hash.cs
- EntryPointNotFoundException.cs
- HttpListenerRequest.cs
- WindowsStatic.cs
- EditCommandColumn.cs
- SmiEventSink_Default.cs
- QilXmlWriter.cs
- StrokeIntersection.cs
- ItemsPresenter.cs
- XPathPatternBuilder.cs
- UrlUtility.cs
- XmlSchemaExternal.cs
- CanonicalFontFamilyReference.cs
- ResourceSetExpression.cs
- UIntPtr.cs
- WeakReferenceEnumerator.cs
- CreateUserWizard.cs
- JoinTreeNode.cs
- BuildProvider.cs
- EnumCodeDomSerializer.cs
- AbstractSvcMapFileLoader.cs
- NetCodeGroup.cs
- XmlValueConverter.cs
- WorkflowInstanceRecord.cs
- ParseNumbers.cs
- EncryptedPackageFilter.cs
- HttpModuleActionCollection.cs
- ConfigXmlSignificantWhitespace.cs
- FontNamesConverter.cs
- ConnectionManagementSection.cs
- WebPartTransformerCollection.cs
- FunctionQuery.cs
- StoreItemCollection.cs
- Function.cs
- StylusButtonCollection.cs
- LabelAutomationPeer.cs
- PersonalizationStateInfo.cs
- XpsDigitalSignature.cs
- ResolvedKeyFrameEntry.cs
- TreeWalker.cs
- Application.cs
- Int16AnimationUsingKeyFrames.cs
- FormCollection.cs
- CustomAssemblyResolver.cs
- MembershipUser.cs
- SQLDoubleStorage.cs
- WebResponse.cs
- AssemblyHelper.cs
- TextElementAutomationPeer.cs
- SchemaMerger.cs
- DeclarativeCatalogPart.cs
- ManipulationStartedEventArgs.cs
- MetroSerializationManager.cs
- LinkLabelLinkClickedEvent.cs
- SplitterCancelEvent.cs
- SerializationInfoEnumerator.cs
- ContextInformation.cs
- StructuredType.cs
- GlyphRunDrawing.cs
- WorkflowDurableInstance.cs
- ToolStripPanel.cs
- FormattedText.cs
- ManagementScope.cs
- GeneratedCodeAttribute.cs
- RSAPKCS1SignatureDeformatter.cs
- SqlEnums.cs
- MimeReturn.cs
- XamlSerializerUtil.cs
- XPathConvert.cs
- ViewGenResults.cs
- CommonGetThemePartSize.cs
- DataGridViewButtonCell.cs
- WindowProviderWrapper.cs
- OAVariantLib.cs
- _AcceptOverlappedAsyncResult.cs
- COM2IProvidePropertyBuilderHandler.cs
- CustomMenuItemCollection.cs
- XmlCharCheckingWriter.cs