Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / wpf / src / Base / MS / Internal / IO / Packaging / TrackingMemoryStream.cs / 1305600 / TrackingMemoryStream.cs
//------------------------------------------------------------------------------ // //// Copyright (C) Microsoft Corporation. All rights reserved. // // // Description: // This is a stream that is capable of reporting data usage up to the registered // owner // // History: // 05/24/2005: IgorBel: Initial creation. // 11/08/2005: BruceMac: Change namespace // //----------------------------------------------------------------------------- using System; using System.Diagnostics; using System.IO; namespace MS.Internal.IO.Packaging { // making this class sealed as it is taking advantage of some Virtual methods // in MemoryStream(Capacity); therefore, there is a danger of subclass overriding those and unexpected // behavior changes. Consider calls from Constructor->ReportIfNecessary->Capacity // prior to unsealing this class (they would be marked as FxCop violations) internal sealed class TrackingMemoryStream : MemoryStream { // other constructors can be added later, as we need them, for now we only use the following 2 internal TrackingMemoryStream(ITrackingMemoryStreamFactory memoryStreamFactory): base() { // although we could have implemented this constructor in terms of the other constructor; we shouldn't. // It seems safer to always call the equivalent base class constructor, as we might be ignorant about // some minor differences between various MemoryStream constructors Debug.Assert(memoryStreamFactory != null); _memoryStreamFactory = memoryStreamFactory; ReportIfNeccessary(); } internal TrackingMemoryStream (ITrackingMemoryStreamFactory memoryStreamFactory, Int32 capacity) : base(capacity) { Debug.Assert(memoryStreamFactory != null); _memoryStreamFactory = memoryStreamFactory; ReportIfNeccessary(); } // Here are the overrides for members that could possible result in changes in the allocated memory public override int Read(byte[] buffer, int offset, int count) { int result = base.Read(buffer, offset, count); ReportIfNeccessary(); return result; } public override void Write(byte[] buffer, int offset, int count) { base.Write(buffer, offset, count); ReportIfNeccessary(); } public override void SetLength(long value) { base.SetLength(value); ReportIfNeccessary(); } protected override void Dispose(bool disposing) { try { if (disposing) { if (_memoryStreamFactory != null) { // release all the memory, and report it to the TrackingMemoryStreamFactory SetLength(0); Capacity = 0; ReportIfNeccessary(); _memoryStreamFactory = null; } } } finally { base.Dispose(disposing); } } private void ReportIfNeccessary () { if (this.Capacity !=_lastReportedHighWaterMark) { // we need to report the new memory being allocated as a part of the constructor _memoryStreamFactory.ReportMemoryUsageDelta(checked(this.Capacity - _lastReportedHighWaterMark)); _lastReportedHighWaterMark = this.Capacity; } } private ITrackingMemoryStreamFactory _memoryStreamFactory; private int _lastReportedHighWaterMark; } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved. //------------------------------------------------------------------------------ // //// Copyright (C) Microsoft Corporation. All rights reserved. // // // Description: // This is a stream that is capable of reporting data usage up to the registered // owner // // History: // 05/24/2005: IgorBel: Initial creation. // 11/08/2005: BruceMac: Change namespace // //----------------------------------------------------------------------------- using System; using System.Diagnostics; using System.IO; namespace MS.Internal.IO.Packaging { // making this class sealed as it is taking advantage of some Virtual methods // in MemoryStream(Capacity); therefore, there is a danger of subclass overriding those and unexpected // behavior changes. Consider calls from Constructor->ReportIfNecessary->Capacity // prior to unsealing this class (they would be marked as FxCop violations) internal sealed class TrackingMemoryStream : MemoryStream { // other constructors can be added later, as we need them, for now we only use the following 2 internal TrackingMemoryStream(ITrackingMemoryStreamFactory memoryStreamFactory): base() { // although we could have implemented this constructor in terms of the other constructor; we shouldn't. // It seems safer to always call the equivalent base class constructor, as we might be ignorant about // some minor differences between various MemoryStream constructors Debug.Assert(memoryStreamFactory != null); _memoryStreamFactory = memoryStreamFactory; ReportIfNeccessary(); } internal TrackingMemoryStream (ITrackingMemoryStreamFactory memoryStreamFactory, Int32 capacity) : base(capacity) { Debug.Assert(memoryStreamFactory != null); _memoryStreamFactory = memoryStreamFactory; ReportIfNeccessary(); } // Here are the overrides for members that could possible result in changes in the allocated memory public override int Read(byte[] buffer, int offset, int count) { int result = base.Read(buffer, offset, count); ReportIfNeccessary(); return result; } public override void Write(byte[] buffer, int offset, int count) { base.Write(buffer, offset, count); ReportIfNeccessary(); } public override void SetLength(long value) { base.SetLength(value); ReportIfNeccessary(); } protected override void Dispose(bool disposing) { try { if (disposing) { if (_memoryStreamFactory != null) { // release all the memory, and report it to the TrackingMemoryStreamFactory SetLength(0); Capacity = 0; ReportIfNeccessary(); _memoryStreamFactory = null; } } } finally { base.Dispose(disposing); } } private void ReportIfNeccessary () { if (this.Capacity !=_lastReportedHighWaterMark) { // we need to report the new memory being allocated as a part of the constructor _memoryStreamFactory.ReportMemoryUsageDelta(checked(this.Capacity - _lastReportedHighWaterMark)); _lastReportedHighWaterMark = this.Capacity; } } private ITrackingMemoryStreamFactory _memoryStreamFactory; private int _lastReportedHighWaterMark; } } // 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
- Calendar.cs
- ChangeNode.cs
- PartManifestEntry.cs
- ConstructorNeedsTagAttribute.cs
- DesignerObjectListAdapter.cs
- DefaultMemberAttribute.cs
- ContextStack.cs
- TrustManagerPromptUI.cs
- ObjectAnimationUsingKeyFrames.cs
- SmuggledIUnknown.cs
- DataContract.cs
- EntityConnection.cs
- DataFormats.cs
- QualifiedCellIdBoolean.cs
- FormCollection.cs
- XmlDocumentType.cs
- _ConnectStream.cs
- BitmapEffectCollection.cs
- VisemeEventArgs.cs
- RenderContext.cs
- UpdateExpressionVisitor.cs
- PathSegment.cs
- OdbcCommandBuilder.cs
- LoginName.cs
- DataPointer.cs
- SettingsPropertyCollection.cs
- PackWebRequest.cs
- RectangleGeometry.cs
- XmlQueryStaticData.cs
- WinEventWrap.cs
- RectAnimation.cs
- DataGridRowHeaderAutomationPeer.cs
- SqlCacheDependencyDatabase.cs
- OleDbStruct.cs
- TreeNodeBindingCollection.cs
- TextServicesContext.cs
- WebEvents.cs
- StreamWriter.cs
- NetMsmqBindingCollectionElement.cs
- PropertyPath.cs
- ScriptResourceInfo.cs
- MemoryFailPoint.cs
- ServiceDurableInstance.cs
- control.ime.cs
- FileNotFoundException.cs
- XmlConvert.cs
- CursorConverter.cs
- RedistVersionInfo.cs
- SemanticBasicElement.cs
- TransactionManager.cs
- MSAAWinEventWrap.cs
- RequestTimeoutManager.cs
- FormsAuthenticationConfiguration.cs
- UIElement.cs
- SingleTagSectionHandler.cs
- SystemDropShadowChrome.cs
- MaskDescriptor.cs
- WebPartConnectionsCancelVerb.cs
- ValueUnavailableException.cs
- WebConfigurationFileMap.cs
- PackageProperties.cs
- BitFlagsGenerator.cs
- ExpandSegmentCollection.cs
- AnnotationResourceChangedEventArgs.cs
- SqlNamer.cs
- Substitution.cs
- AsmxEndpointPickerExtension.cs
- XmlReflectionMember.cs
- Base64Encoding.cs
- StrongNameMembershipCondition.cs
- PixelFormatConverter.cs
- RequestCachePolicyConverter.cs
- EntityDataSourceMemberPath.cs
- SymbolDocumentInfo.cs
- ShaderEffect.cs
- RSAOAEPKeyExchangeDeformatter.cs
- ListBindableAttribute.cs
- FixedDocument.cs
- UTF7Encoding.cs
- WebPartVerbCollection.cs
- RunInstallerAttribute.cs
- MetadataAssemblyHelper.cs
- ResXBuildProvider.cs
- TransportChannelFactory.cs
- WebPartMenuStyle.cs
- SrgsGrammarCompiler.cs
- BackStopAuthenticationModule.cs
- WindowsAltTab.cs
- ObjectDataSourceStatusEventArgs.cs
- CredentialCache.cs
- IList.cs
- TableItemStyle.cs
- Number.cs
- Utility.cs
- ProgressBar.cs
- HtmlEncodedRawTextWriter.cs
- StylusCollection.cs
- FontFamilyConverter.cs
- FixedSOMPage.cs
- Interop.cs