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
- SystemColorTracker.cs
- CreateRefExpr.cs
- CanonicalFontFamilyReference.cs
- XmlSerializerSection.cs
- altserialization.cs
- BitmapImage.cs
- TriggerCollection.cs
- SubMenuStyle.cs
- DesignerView.Commands.cs
- TraceLog.cs
- EdmType.cs
- EnterpriseServicesHelper.cs
- SessionStateModule.cs
- DateTimeConverter.cs
- OpenTypeCommon.cs
- ConfigurationValues.cs
- MetadataCacheItem.cs
- DbDeleteCommandTree.cs
- DataControlFieldHeaderCell.cs
- RelativeSource.cs
- CodeMemberMethod.cs
- FlowDecisionLabelFeature.cs
- GZipDecoder.cs
- StylusPointPropertyId.cs
- BitmapEffectDrawingContent.cs
- sqlstateclientmanager.cs
- DayRenderEvent.cs
- CertificateElement.cs
- MailSettingsSection.cs
- XmlEnumAttribute.cs
- HttpRawResponse.cs
- Process.cs
- SecondaryIndexDefinition.cs
- DataGridViewAutoSizeColumnsModeEventArgs.cs
- Run.cs
- Configuration.cs
- LoggedException.cs
- UIElementCollection.cs
- SharedStatics.cs
- DSASignatureFormatter.cs
- RSACryptoServiceProvider.cs
- BaseCollection.cs
- PropertyGrid.cs
- PointCollection.cs
- DropDownList.cs
- BookmarkCallbackWrapper.cs
- FileDataSource.cs
- oledbmetadatacollectionnames.cs
- WebResourceAttribute.cs
- ScrollViewer.cs
- FilterableAttribute.cs
- UserPreferenceChangedEventArgs.cs
- RegistryDataKey.cs
- ReaderContextStackData.cs
- LockCookie.cs
- ModelItemCollection.cs
- EditingScopeUndoUnit.cs
- EventToken.cs
- EventData.cs
- DropDownHolder.cs
- BrowserTree.cs
- Vector3dCollection.cs
- GenericEnumConverter.cs
- SetStateDesigner.cs
- HttpConfigurationSystem.cs
- ToolStrip.cs
- SpeakInfo.cs
- InvokeMethod.cs
- ViewValidator.cs
- EntityContainerAssociationSetEnd.cs
- DisplayMemberTemplateSelector.cs
- AffineTransform3D.cs
- KeyedCollection.cs
- ResolveMatchesMessage11.cs
- PrintController.cs
- DataPager.cs
- SQLInt16.cs
- ProcessModuleCollection.cs
- GridViewSelectEventArgs.cs
- DataRelationCollection.cs
- BrowserCapabilitiesCodeGenerator.cs
- Material.cs
- FixedSOMFixedBlock.cs
- RangeBase.cs
- DescendentsWalker.cs
- ParseHttpDate.cs
- WebPartConnectionsConfigureVerb.cs
- PreservationFileReader.cs
- EventLogPermissionAttribute.cs
- PersonalizationStateInfo.cs
- GenericXmlSecurityToken.cs
- BitmapEffectDrawing.cs
- PrimitiveDataContract.cs
- KeyValueSerializer.cs
- SiteMapSection.cs
- InternalsVisibleToAttribute.cs
- DrawItemEvent.cs
- TextProperties.cs
- SafeNativeMethods.cs
- StateManagedCollection.cs