Code:
/ 4.0 / 4.0 / 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. // ==++== // // 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
- ImmComposition.cs
- GeometryModel3D.cs
- ToolboxDataAttribute.cs
- WebPartCatalogAddVerb.cs
- VariableQuery.cs
- PasswordPropertyTextAttribute.cs
- XmlTextReader.cs
- SqlProcedureAttribute.cs
- OperationParameterInfo.cs
- Literal.cs
- PropertyToken.cs
- TextBounds.cs
- ScriptManagerProxy.cs
- SettingsPropertyNotFoundException.cs
- ImageCollectionCodeDomSerializer.cs
- CursorConverter.cs
- _SslStream.cs
- MainMenu.cs
- ExternalCalls.cs
- MetabaseServerConfig.cs
- Rijndael.cs
- PaintValueEventArgs.cs
- SqlMethodAttribute.cs
- CellIdBoolean.cs
- UnsafeNativeMethods.cs
- StrokeCollectionConverter.cs
- CatchBlock.cs
- QuaternionRotation3D.cs
- CodeMethodReturnStatement.cs
- BasicCellRelation.cs
- DuplexClientBase.cs
- XPathArrayIterator.cs
- SpellerHighlightLayer.cs
- CqlGenerator.cs
- CodeBlockBuilder.cs
- StateMachineSubscription.cs
- OrderPreservingPipeliningMergeHelper.cs
- ZipIOModeEnforcingStream.cs
- HashMembershipCondition.cs
- SoapHttpTransportImporter.cs
- SudsWriter.cs
- Popup.cs
- AttributeQuery.cs
- NotImplementedException.cs
- RemotingAttributes.cs
- WindowsAuthenticationModule.cs
- SSmlParser.cs
- PrefixQName.cs
- TriggerBase.cs
- CompositeScriptReferenceEventArgs.cs
- SoapClientProtocol.cs
- wgx_exports.cs
- DBCSCodePageEncoding.cs
- ReturnEventArgs.cs
- OracleNumber.cs
- HandledMouseEvent.cs
- SmiXetterAccessMap.cs
- DbProviderSpecificTypePropertyAttribute.cs
- FormatterConverter.cs
- TargetInvocationException.cs
- StringUtil.cs
- ConfigurationSchemaErrors.cs
- ResourceDescriptionAttribute.cs
- BasePattern.cs
- ThreadPoolTaskScheduler.cs
- RadioButtonStandardAdapter.cs
- HandlerBase.cs
- CompiledRegexRunner.cs
- XmlAttributes.cs
- StyleSelector.cs
- CollectionDataContractAttribute.cs
- XmlWriterTraceListener.cs
- HttpCookiesSection.cs
- StringWriter.cs
- Script.cs
- LineGeometry.cs
- BaseDataList.cs
- SocketException.cs
- CompilerError.cs
- Variant.cs
- TemplateGroupCollection.cs
- ObjectNavigationPropertyMapping.cs
- Preprocessor.cs
- PageSettings.cs
- ToolStripScrollButton.cs
- LinqDataSourceStatusEventArgs.cs
- NativeMethodsCLR.cs
- WizardStepBase.cs
- CopyOnWriteList.cs
- CellLabel.cs
- DrawingState.cs
- FontDialog.cs
- SchemaTableOptionalColumn.cs
- MemberJoinTreeNode.cs
- XmlSchemaSimpleContentExtension.cs
- RectAnimationBase.cs
- FixedSOMImage.cs
- LinqDataSourceStatusEventArgs.cs
- Message.cs
- ZipPackage.cs