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
- Mouse.cs
- PerformanceCounterPermission.cs
- XPathNavigator.cs
- OleDbSchemaGuid.cs
- FileStream.cs
- WmpBitmapDecoder.cs
- HybridDictionary.cs
- XPathItem.cs
- BitmapFrameEncode.cs
- mil_commands.cs
- DocumentSequence.cs
- EventLog.cs
- SessionStateContainer.cs
- _ServiceNameStore.cs
- CompiledRegexRunnerFactory.cs
- StatusBarItemAutomationPeer.cs
- EncodingDataItem.cs
- FileDialog.cs
- HttpRawResponse.cs
- PersistenceProviderFactory.cs
- ISessionStateStore.cs
- MSAAEventDispatcher.cs
- TextHintingModeValidation.cs
- XmlStreamNodeWriter.cs
- TableDetailsRow.cs
- ServiceRoute.cs
- FormViewInsertEventArgs.cs
- ArraySortHelper.cs
- ReaderOutput.cs
- ActivityTrace.cs
- C14NUtil.cs
- DataServiceContext.cs
- ObfuscationAttribute.cs
- ProviderUtil.cs
- DiscoveryEndpointElement.cs
- TextWriter.cs
- CommonDialog.cs
- ConfigurationErrorsException.cs
- CodeExpressionCollection.cs
- MimeParameters.cs
- ClassHandlersStore.cs
- RequestTimeoutManager.cs
- CompressionTransform.cs
- Line.cs
- SymbolType.cs
- TableRowGroup.cs
- Char.cs
- AllMembershipCondition.cs
- ServiceElement.cs
- CompressEmulationStream.cs
- Crypto.cs
- EventMappingSettingsCollection.cs
- TreeNodeStyle.cs
- RenderDataDrawingContext.cs
- TakeQueryOptionExpression.cs
- NonSerializedAttribute.cs
- ConnectionsZone.cs
- AdjustableArrowCap.cs
- KernelTypeValidation.cs
- ReferencedCollectionType.cs
- EntityDataSourceDesigner.cs
- QuotedPrintableStream.cs
- SqlDataSourceFilteringEventArgs.cs
- PipelineComponent.cs
- UdpChannelFactory.cs
- SqlClientWrapperSmiStreamChars.cs
- RectangleGeometry.cs
- BuilderPropertyEntry.cs
- EntityCommandCompilationException.cs
- NativeMethodsCLR.cs
- CellLabel.cs
- TimeManager.cs
- UnauthorizedWebPart.cs
- ExtensibleClassFactory.cs
- TextSelection.cs
- ControlBuilder.cs
- StylusCollection.cs
- MsmqChannelFactory.cs
- TriggerBase.cs
- AuthenticateEventArgs.cs
- ByteStreamGeometryContext.cs
- ClientRuntimeConfig.cs
- InkCanvasSelectionAdorner.cs
- AsymmetricAlgorithm.cs
- ApplicationFileCodeDomTreeGenerator.cs
- MaskDescriptors.cs
- SqlBinder.cs
- HttpException.cs
- PackUriHelper.cs
- ToolStripButton.cs
- FullTextBreakpoint.cs
- NamespaceInfo.cs
- CqlIdentifiers.cs
- ValueChangedEventManager.cs
- ColorContext.cs
- AuthorizationSection.cs
- PersistenceTypeAttribute.cs
- EndpointIdentityExtension.cs
- DataGridSortCommandEventArgs.cs
- BinHexDecoder.cs