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
- ParallelTimeline.cs
- EntryPointNotFoundException.cs
- LicenseManager.cs
- RequestCachingSection.cs
- MexBindingElement.cs
- BuildProvider.cs
- GetWinFXPath.cs
- TabletDevice.cs
- HtmlMeta.cs
- ModelUIElement3D.cs
- SerTrace.cs
- KeyboardEventArgs.cs
- SqlComparer.cs
- ViewPort3D.cs
- AnimationStorage.cs
- NumberFormatInfo.cs
- MessageFilterTable.cs
- ToolStripLabel.cs
- WorkflowDesigner.cs
- QueryCacheManager.cs
- ParsedRoute.cs
- IndentedTextWriter.cs
- ColumnTypeConverter.cs
- HtmlShimManager.cs
- FileDataSourceCache.cs
- FontNameConverter.cs
- PagedDataSource.cs
- WebPartManager.cs
- DataListItemEventArgs.cs
- UrlSyndicationContent.cs
- DataListItemCollection.cs
- HttpProfileBase.cs
- SamlAuthenticationClaimResource.cs
- BinaryFormatter.cs
- PropertyTabChangedEvent.cs
- PrinterSettings.cs
- DocumentOrderComparer.cs
- InteropBitmapSource.cs
- DataGridViewControlCollection.cs
- ExecutionProperties.cs
- Proxy.cs
- SimpleBitVector32.cs
- Column.cs
- RouteValueDictionary.cs
- CalendarButton.cs
- EnumValidator.cs
- JsonFormatMapping.cs
- CodeFieldReferenceExpression.cs
- SqlDataSourceQuery.cs
- Exceptions.cs
- FixedSOMPageElement.cs
- SoapSchemaImporter.cs
- FieldAccessException.cs
- FilteredAttributeCollection.cs
- securestring.cs
- Pens.cs
- KeyFrames.cs
- SplineKeyFrames.cs
- HwndProxyElementProvider.cs
- DiffuseMaterial.cs
- Bitmap.cs
- RoutedEventHandlerInfo.cs
- PageTheme.cs
- PassportPrincipal.cs
- ConfigXmlSignificantWhitespace.cs
- PageClientProxyGenerator.cs
- ToolStripRendererSwitcher.cs
- Point3DCollectionConverter.cs
- _NestedMultipleAsyncResult.cs
- ByteRangeDownloader.cs
- CreatingCookieEventArgs.cs
- MdImport.cs
- ContainerVisual.cs
- CompositeDuplexBindingElementImporter.cs
- NotImplementedException.cs
- XhtmlTextWriter.cs
- EpmSyndicationContentSerializer.cs
- DataGridViewRowStateChangedEventArgs.cs
- ParallelTimeline.cs
- DispatcherExceptionEventArgs.cs
- TimeManager.cs
- DataGridViewTextBoxColumn.cs
- EditorZone.cs
- SimpleMailWebEventProvider.cs
- SqlProviderManifest.cs
- CompositeActivityDesigner.cs
- WCFServiceClientProxyGenerator.cs
- TimerElapsedEvenArgs.cs
- AuthenticatingEventArgs.cs
- FacetEnabledSchemaElement.cs
- InstanceView.cs
- DivideByZeroException.cs
- DetailsViewCommandEventArgs.cs
- SafeFileHandle.cs
- ReadOnlyMetadataCollection.cs
- ParserHooks.cs
- SetUserLanguageRequest.cs
- MbpInfo.cs
- PropertyChangingEventArgs.cs
- Type.cs