Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / wpf / src / Core / CSharp / MS / Internal / FontCache / BufferCache.cs / 1305600 / BufferCache.cs
// -------------------------------------------------------------------------- // // File: BufferCache.cs // // Copyright (C) Microsoft Corporation. All rights reserved. // // Description: BufferCache class implementation. // //--------------------------------------------------------------------------- using System; using System.Threading; using MS.Internal.Text.TextInterface; namespace MS.Internal.FontCache { ////// A static, thread safe array cache used to minimize heap allocations. /// ////// Cached arrays are not zero initialized, and they may be larger than /// the requested number of elements. /// internal static class BufferCache { //----------------------------------------------------- // // Internal Methods // //----------------------------------------------------- #region Internal Methods ////// Attempts to release all allocated memory. Has no effect if the cache /// is locked by another thread. /// internal static void Reset() { if (Interlocked.Increment(ref _mutex) == 1) { _buffers = null; } Interlocked.Decrement(ref _mutex); } ////// Returns a GlyphMetrics[]. /// /// /// Minimum number of elements in the array. /// internal static GlyphMetrics[] GetGlyphMetrics(int length) { GlyphMetrics[] glyphMetrics = (GlyphMetrics[])GetBuffer(length, GlyphMetricsIndex); if (glyphMetrics == null) { glyphMetrics = new GlyphMetrics[length]; } return glyphMetrics; } ////// Releases a previously allocated GlyphMetrics[], possibly adding it /// to the cache. /// ////// It is not strictly necessary to call this method after receiving an /// array. The penalty is the performance hit of doing a heap allocation /// on the next request if this method is not called. /// internal static void ReleaseGlyphMetrics(GlyphMetrics[] glyphMetrics) { ReleaseBuffer(glyphMetrics, GlyphMetricsIndex); } ////// Returns a ushort[]. /// /// /// Minimum number of elements in the array. /// internal static ushort[] GetUShorts(int length) { ushort[] ushorts = (ushort[])GetBuffer(length, UShortsIndex); if (ushorts == null) { ushorts = new ushort[length]; } return ushorts; } ////// Releases a previously allocated ushort[], possibly adding it /// to the cache. /// ////// It is not strictly necessary to call this method after receiving an /// array. The penalty is the performance hit of doing a heap allocation /// on the next request if this method is not called. /// internal static void ReleaseUShorts(ushort[] ushorts) { ReleaseBuffer(ushorts, UShortsIndex); } ////// Returns a uint[]. /// /// /// Minimum number of elements in the array. /// internal static uint[] GetUInts(int length) { uint[] uints = (uint[])GetBuffer(length, UIntsIndex); if (uints == null) { uints = new uint[length]; } return uints; } ////// Releases a previously allocated uint[], possibly adding it /// to the cache. /// ////// It is not strictly necessary to call this method after receiving an /// array. The penalty is the performance hit of doing a heap allocation /// on the next request if this method is not called. /// internal static void ReleaseUInts(uint[] uints) { ReleaseBuffer(uints, UIntsIndex); } #endregion Internal Methods //------------------------------------------------------ // // Private Methods // //----------------------------------------------------- #region Private Methods ////// Searches for an array in the cache. /// /// /// Minimum number of elements in the array. /// /// /// Specifies the type of array. /// ////// A matching array if present, otherwise null. /// private static Array GetBuffer(int length, int index) { Array buffer = null; if (Interlocked.Increment(ref _mutex) == 1) { if (_buffers != null && _buffers[index] != null && length <= _buffers[index].Length) { buffer = _buffers[index]; _buffers[index] = null; } } Interlocked.Decrement(ref _mutex); return buffer; } ////// Takes ownership of an array. /// /// /// The array. May be null. /// /// /// Specifies the type of array. /// private static void ReleaseBuffer(Array buffer, int index) { if (buffer != null) { if (Interlocked.Increment(ref _mutex) == 1) { if (_buffers == null) { _buffers = new Array[BuffersLength]; } if (_buffers[index] == null || (_buffers[index].Length < buffer.Length && buffer.Length <= MaxBufferLength)) { _buffers[index] = buffer; } } Interlocked.Decrement(ref _mutex); } } #endregion Private Methods //------------------------------------------------------ // // Private Fields // //------------------------------------------------------ #region Private Fields // Max number of elements in any cached array. If a request if made for a larger array // it will always be allocated from the heap. private const int MaxBufferLength = 1024; // Indices in _buffers for each supported type. private const int GlyphMetricsIndex = 0; private const int UIntsIndex = 1; private const int UShortsIndex = 2; private const int BuffersLength = 3; // Guards access to _buffers. static private long _mutex; // Array of cached arrays, one bucker per supported type. // Currently, we cache just one array per type. A more general cache would hold N byte arrays. // However, we don't currently have any scenarios that hold more than one array of the same type // or more than two arrays of different types at the same time, so it is difficult to justify // making the implementation more complex. ComputeTypographyAvailabilities could benefit from // a more general cache (UnicodeRange.GetFullRange could use a cached array), but the savings // in profiled scenarios are small, ~16k for MSNBaml.exe. If we find a more compelling // scenario a change might be worthwhile. static private Array[] _buffers; #endregion Private Fields } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- ValidationErrorCollection.cs
- ListViewPagedDataSource.cs
- DesignerDataParameter.cs
- TreeNode.cs
- EventHandlerList.cs
- OdbcTransaction.cs
- XmlSchemaAttribute.cs
- __ConsoleStream.cs
- ForwardPositionQuery.cs
- DescendantOverDescendantQuery.cs
- BlockUIContainer.cs
- WindowsFormsSectionHandler.cs
- ObjectDataSourceSelectingEventArgs.cs
- DataControlCommands.cs
- ButtonColumn.cs
- DSASignatureFormatter.cs
- MouseActionValueSerializer.cs
- ImageConverter.cs
- unsafeIndexingFilterStream.cs
- RealProxy.cs
- ConfigXmlElement.cs
- ArrangedElement.cs
- HostSecurityManager.cs
- SchemaCollectionPreprocessor.cs
- FormsAuthenticationUserCollection.cs
- StreamAsIStream.cs
- SafeCryptoHandles.cs
- ValidationResult.cs
- ComponentResourceKeyConverter.cs
- SubclassTypeValidatorAttribute.cs
- userdatakeys.cs
- SystemEvents.cs
- HttpHandlerAction.cs
- Dictionary.cs
- SettingsSavedEventArgs.cs
- HitTestDrawingContextWalker.cs
- DataKey.cs
- SerialStream.cs
- LicenseException.cs
- WindowsImpersonationContext.cs
- CatalogPartCollection.cs
- WebPartConnectionsDisconnectVerb.cs
- SelectionListDesigner.cs
- WebScriptEnablingElement.cs
- X509CertificateTrustedIssuerElement.cs
- PropertyMetadata.cs
- ByteViewer.cs
- InvalidWMPVersionException.cs
- ViewDesigner.cs
- StoreAnnotationsMap.cs
- BaseParaClient.cs
- ScriptControlDescriptor.cs
- SvcMapFile.cs
- ErrorRuntimeConfig.cs
- NativeStructs.cs
- Guid.cs
- BitmapEffectInputData.cs
- securitycriticaldata.cs
- StringToken.cs
- TCPListener.cs
- WeakReadOnlyCollection.cs
- ListControl.cs
- CqlErrorHelper.cs
- ConnectionString.cs
- UnmanagedMemoryStreamWrapper.cs
- ValidatingReaderNodeData.cs
- SimpleApplicationHost.cs
- MatrixTransform3D.cs
- MetadataSerializer.cs
- NameTable.cs
- OutputBuffer.cs
- DataAccessor.cs
- BindingMAnagerBase.cs
- TabPage.cs
- DesignColumn.cs
- SectionUpdates.cs
- DynamicHyperLink.cs
- HMACMD5.cs
- UrlPropertyAttribute.cs
- DependencyPropertyKey.cs
- StringAttributeCollection.cs
- CodeComment.cs
- TextEncodedRawTextWriter.cs
- TimerElapsedEvenArgs.cs
- PartBasedPackageProperties.cs
- BitmapEffectInput.cs
- Object.cs
- SqlDataSourceQueryConverter.cs
- ComAdminInterfaces.cs
- RegistryKey.cs
- DocumentEventArgs.cs
- OleDbTransaction.cs
- IFlowDocumentViewer.cs
- HttpCapabilitiesSectionHandler.cs
- SelectedPathEditor.cs
- GACIdentityPermission.cs
- WebBrowserNavigatingEventHandler.cs
- MetadataArtifactLoaderXmlReaderWrapper.cs
- DSACryptoServiceProvider.cs
- AxImporter.cs