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
- Cloud.cs
- InputBuffer.cs
- GenericWebPart.cs
- DBSqlParserColumnCollection.cs
- PointAnimationUsingPath.cs
- SQLMembershipProvider.cs
- AnnotationDocumentPaginator.cs
- FileStream.cs
- XmlDownloadManager.cs
- ValidationRuleCollection.cs
- WebPartConnectionsEventArgs.cs
- FontClient.cs
- FormView.cs
- StringFormat.cs
- AddInController.cs
- UdpTransportSettingsElement.cs
- SessionPageStateSection.cs
- ControlParameter.cs
- BamlReader.cs
- TraceInternal.cs
- OutOfMemoryException.cs
- ToolStripArrowRenderEventArgs.cs
- ExtentKey.cs
- UInt16Storage.cs
- WindowsListViewGroupHelper.cs
- PersonalizationStateInfo.cs
- RegexCompilationInfo.cs
- ExceptionValidationRule.cs
- RepeaterItem.cs
- VirtualPathUtility.cs
- CodeExporter.cs
- WorkflowItemsPresenter.cs
- ServiceDescription.cs
- ValidationError.cs
- ValidatorCompatibilityHelper.cs
- ResourceContainerWrapper.cs
- XmlParser.cs
- DataGridViewRowHeaderCell.cs
- Viewport3DAutomationPeer.cs
- DPTypeDescriptorContext.cs
- ConditionalAttribute.cs
- TreeNodeMouseHoverEvent.cs
- DefaultTextStoreTextComposition.cs
- WebConvert.cs
- _NegotiateClient.cs
- StrongNameKeyPair.cs
- PropertyPathWorker.cs
- SortedList.cs
- StateWorkerRequest.cs
- ProgressBarRenderer.cs
- MessagePartDescription.cs
- MonitorWrapper.cs
- NavigationProperty.cs
- AsyncDataRequest.cs
- ProfileModule.cs
- IgnorePropertiesAttribute.cs
- SelectionEditor.cs
- ThemeDictionaryExtension.cs
- DataSourceXmlSerializer.cs
- XmlILIndex.cs
- DynamicDataRoute.cs
- DocumentGridPage.cs
- XmlToDatasetMap.cs
- TaiwanCalendar.cs
- ContainerVisual.cs
- DbProviderFactory.cs
- AccessKeyManager.cs
- PaintValueEventArgs.cs
- SortedSet.cs
- HealthMonitoringSection.cs
- SQLBinary.cs
- hwndwrapper.cs
- ExpressionStringBuilder.cs
- FrameworkContentElement.cs
- KeyValueSerializer.cs
- DoubleUtil.cs
- TypeSystemHelpers.cs
- FontStyles.cs
- GiveFeedbackEventArgs.cs
- FontInfo.cs
- ContextMenuStrip.cs
- ObjRef.cs
- UrlUtility.cs
- GridItemPattern.cs
- WeakReference.cs
- DispatcherFrame.cs
- IntSecurity.cs
- SiteMapNodeCollection.cs
- WorkflowTimerService.cs
- ISFClipboardData.cs
- GridErrorDlg.cs
- SystemFonts.cs
- MultipleViewProviderWrapper.cs
- KeyGestureValueSerializer.cs
- WorkflowTraceTransfer.cs
- Size.cs
- InputManager.cs
- EventLogTraceListener.cs
- WebPartEditorApplyVerb.cs
- ServiceModelSectionGroup.cs