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 CerHashtable m_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
- Point3DKeyFrameCollection.cs
- EntityConnection.cs
- GiveFeedbackEvent.cs
- CallbackValidatorAttribute.cs
- HttpRequest.cs
- Page.cs
- MouseOverProperty.cs
- Simplifier.cs
- NativeMethods.cs
- TextAnchor.cs
- PrtCap_Base.cs
- SizeConverter.cs
- ToolStripManager.cs
- InvalidCommandTreeException.cs
- PermissionSetEnumerator.cs
- DataGridViewSortCompareEventArgs.cs
- DbMetaDataFactory.cs
- PreProcessInputEventArgs.cs
- XmlDataSourceNodeDescriptor.cs
- PostBackOptions.cs
- _AuthenticationState.cs
- XPathNodePointer.cs
- Ipv6Element.cs
- PropertyPathWorker.cs
- ClickablePoint.cs
- MultiDataTrigger.cs
- RealProxy.cs
- WorkflowDefinitionDispenser.cs
- DataGridItemCollection.cs
- SqlResolver.cs
- AsyncCompletedEventArgs.cs
- ProcessStartInfo.cs
- TextCollapsingProperties.cs
- ClonableStack.cs
- ICollection.cs
- CheckBox.cs
- VisualStyleRenderer.cs
- ToolStripDropDownClosedEventArgs.cs
- SecurityDescriptor.cs
- QilTargetType.cs
- FileLevelControlBuilderAttribute.cs
- CodeSnippetStatement.cs
- TypeGeneratedEventArgs.cs
- DataRow.cs
- basenumberconverter.cs
- Subtree.cs
- ConstraintStruct.cs
- MembershipUser.cs
- WebCategoryAttribute.cs
- ZoomPercentageConverter.cs
- DataPagerField.cs
- X509LogoTypeExtension.cs
- BackStopAuthenticationModule.cs
- XmlUtilWriter.cs
- AttributeQuery.cs
- CollectionView.cs
- PtsContext.cs
- SettingsSavedEventArgs.cs
- PropertyPathConverter.cs
- XsdSchemaFileEditor.cs
- Brush.cs
- ConditionCollection.cs
- XmlLanguage.cs
- EUCJPEncoding.cs
- Geometry.cs
- ColorKeyFrameCollection.cs
- UniqueEventHelper.cs
- DiagnosticsConfiguration.cs
- CheckBoxList.cs
- CodeVariableReferenceExpression.cs
- Choices.cs
- BooleanExpr.cs
- If.cs
- RevocationPoint.cs
- EntityViewContainer.cs
- PointHitTestParameters.cs
- Int32Converter.cs
- AnnotationObservableCollection.cs
- DataSourceXmlClassAttribute.cs
- TransformedBitmap.cs
- EtwProvider.cs
- DocumentEventArgs.cs
- WorkflowStateRollbackService.cs
- ContentPlaceHolderDesigner.cs
- ComponentCommands.cs
- ASCIIEncoding.cs
- WindowsAuthenticationModule.cs
- assertwrapper.cs
- KeyManager.cs
- HttpCookie.cs
- SectionUpdates.cs
- Errors.cs
- TextServicesCompartmentContext.cs
- BasicKeyConstraint.cs
- ListViewDeletedEventArgs.cs
- WebEventTraceProvider.cs
- PropertyInfoSet.cs
- SerializationEventsCache.cs
- FormViewDeleteEventArgs.cs
- XamlSerializerUtil.cs