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
- DataContract.cs
- DbProviderFactory.cs
- SplitContainerDesigner.cs
- MissingMemberException.cs
- DisplayMemberTemplateSelector.cs
- ServerValidateEventArgs.cs
- ApplicationInfo.cs
- TreeNodeCollectionEditor.cs
- ColorAnimationUsingKeyFrames.cs
- CommandLineParser.cs
- StorageMappingItemCollection.cs
- TaiwanCalendar.cs
- ConstantSlot.cs
- EntityDataReader.cs
- safesecurityhelperavalon.cs
- BackStopAuthenticationModule.cs
- ObjectListDesigner.cs
- ConfigsHelper.cs
- DetailsViewModeEventArgs.cs
- ProgressBarHighlightConverter.cs
- GreaterThanOrEqual.cs
- BamlLocalizableResourceKey.cs
- SqlTriggerContext.cs
- SQLDateTimeStorage.cs
- ExpressionParser.cs
- DefaultParameterValueAttribute.cs
- RemotingException.cs
- EncodingInfo.cs
- CollectionViewGroupRoot.cs
- ObjectTypeMapping.cs
- WindowsMenu.cs
- WebPermission.cs
- TextFindEngine.cs
- Encoding.cs
- XmlCountingReader.cs
- DiscoveryDocumentReference.cs
- XmlSchemaFacet.cs
- GridViewSelectEventArgs.cs
- RemoteWebConfigurationHostStream.cs
- Attributes.cs
- WebPartUserCapability.cs
- EasingKeyFrames.cs
- OwnerDrawPropertyBag.cs
- _SSPISessionCache.cs
- CapabilitiesRule.cs
- DocumentOrderQuery.cs
- MemberAssignment.cs
- BinHexEncoder.cs
- CompositeTypefaceMetrics.cs
- DoubleCollection.cs
- GrammarBuilderDictation.cs
- HierarchicalDataSourceDesigner.cs
- BindingCollection.cs
- DetailsView.cs
- SchemaSetCompiler.cs
- NamedElement.cs
- Main.cs
- IntAverageAggregationOperator.cs
- QilExpression.cs
- Translator.cs
- PlatformNotSupportedException.cs
- Base64Stream.cs
- ListViewInsertionMark.cs
- QueryPrefixOp.cs
- ADConnectionHelper.cs
- DataGridViewUtilities.cs
- TagMapInfo.cs
- TypeToken.cs
- ReaderWriterLock.cs
- UIElement3D.cs
- IFlowDocumentViewer.cs
- FieldMetadata.cs
- SafeHandles.cs
- FollowerQueueCreator.cs
- filewebresponse.cs
- VBIdentifierTrimConverter.cs
- KeyValueInternalCollection.cs
- IndicFontClient.cs
- AutomationPropertyInfo.cs
- AtomServiceDocumentSerializer.cs
- SqlRemoveConstantOrderBy.cs
- EditorZone.cs
- NegationPusher.cs
- ListControl.cs
- NotifyCollectionChangedEventArgs.cs
- DataGridViewAddColumnDialog.cs
- Rule.cs
- FixedSOMContainer.cs
- AnnouncementDispatcherAsyncResult.cs
- XmlQueryType.cs
- HttpResponse.cs
- ManualWorkflowSchedulerService.cs
- CodeTypeMemberCollection.cs
- XmlAnyAttributeAttribute.cs
- PersonalizationStateQuery.cs
- NavigationService.cs
- FormsIdentity.cs
- DelegatingTypeDescriptionProvider.cs
- Serializer.cs
- AutomationProperties.cs