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
- HttpPostServerProtocol.cs
- XPathNodeIterator.cs
- RoleGroupCollection.cs
- HwndTarget.cs
- SmtpClient.cs
- ConnectionManagementElement.cs
- _SpnDictionary.cs
- LicenseProviderAttribute.cs
- BooleanFunctions.cs
- LabelLiteral.cs
- ListViewItemEventArgs.cs
- DesignerDataParameter.cs
- CryptoApi.cs
- InternalUserCancelledException.cs
- NullNotAllowedCollection.cs
- SemanticBasicElement.cs
- RelationshipConstraintValidator.cs
- SharedDp.cs
- HtmlListAdapter.cs
- RegistryKey.cs
- XmlExceptionHelper.cs
- ClonableStack.cs
- ApplicationDirectoryMembershipCondition.cs
- RegisteredDisposeScript.cs
- Pair.cs
- SQLMembershipProvider.cs
- GlyphInfoList.cs
- RC2CryptoServiceProvider.cs
- ReferenceService.cs
- ListItemParagraph.cs
- BigIntegerStorage.cs
- SqlMetaData.cs
- SchemaContext.cs
- NeedSkipTokenVisitor.cs
- MatchingStyle.cs
- TransformConverter.cs
- DetailsViewRowCollection.cs
- CodeMemberEvent.cs
- WindowsSysHeader.cs
- SecurityContextTokenCache.cs
- ListBindableAttribute.cs
- BamlResourceDeserializer.cs
- LazyTextWriterCreator.cs
- Material.cs
- DebugInfoExpression.cs
- ClientTargetSection.cs
- BindingExpressionBase.cs
- PrivateUnsafeNativeCompoundFileMethods.cs
- Mapping.cs
- SessionStateItemCollection.cs
- HelpInfo.cs
- IpcServerChannel.cs
- XmlLoader.cs
- GetCryptoTransformRequest.cs
- contentDescriptor.cs
- SafePipeHandle.cs
- TreeNode.cs
- TripleDESCryptoServiceProvider.cs
- ErrorWebPart.cs
- Emitter.cs
- DataGridCellEditEndingEventArgs.cs
- SiteMapPath.cs
- DirectionalLight.cs
- ReferenceAssemblyAttribute.cs
- LoadGrammarCompletedEventArgs.cs
- ElementsClipboardData.cs
- XmlBoundElement.cs
- ContextStaticAttribute.cs
- Object.cs
- DoubleLink.cs
- BufferedOutputStream.cs
- SelectionItemPattern.cs
- Content.cs
- HoistedLocals.cs
- StringConcat.cs
- PackageStore.cs
- ParseNumbers.cs
- FlowSwitchDesigner.xaml.cs
- SoapFault.cs
- ProviderUtil.cs
- SqlVisitor.cs
- documentation.cs
- PartitionResolver.cs
- DataGridState.cs
- EventProviderWriter.cs
- TransactionProxy.cs
- XmlDocument.cs
- SapiRecoContext.cs
- DataObject.cs
- ContainerVisual.cs
- XamlBrushSerializer.cs
- AssemblyName.cs
- SetterBaseCollection.cs
- FixedSOMPage.cs
- EditorZoneBase.cs
- StateRuntime.cs
- Matrix.cs
- ClientBuildManager.cs
- NumericUpDownAcceleration.cs
- VersionPair.cs