Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / Orcas / QFE / wpf / src / Base / MS / Internal / IO / Packaging / TrackingMemoryStream.cs / 1 / 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
- FillErrorEventArgs.cs
- StrongNameSignatureInformation.cs
- HtmlToClrEventProxy.cs
- ISAPIWorkerRequest.cs
- AttributeEmitter.cs
- PackagePartCollection.cs
- XmlCDATASection.cs
- WebPartExportVerb.cs
- MultipleViewPattern.cs
- CellPartitioner.cs
- ProtocolsConfigurationHandler.cs
- TypeHelpers.cs
- securitycriticaldataformultiplegetandset.cs
- DropDownButton.cs
- CompiledAction.cs
- ResourceAttributes.cs
- CollaborationHelperFunctions.cs
- MILUtilities.cs
- FileDataSourceCache.cs
- CodeGen.cs
- UiaCoreApi.cs
- WebPartHelpVerb.cs
- KeyConverter.cs
- SecurityUtils.cs
- ToolStripPanelCell.cs
- StringWriter.cs
- NamespaceMapping.cs
- MessageHeader.cs
- MultiBindingExpression.cs
- figurelengthconverter.cs
- DataExchangeServiceBinder.cs
- FrameAutomationPeer.cs
- sitestring.cs
- PrimitiveList.cs
- OleDbErrorCollection.cs
- ProcessingInstructionAction.cs
- DurableInstanceContextProvider.cs
- Geometry3D.cs
- WebPartAuthorizationEventArgs.cs
- PaperSize.cs
- GeneralTransformGroup.cs
- Normalization.cs
- ToolStripPanelRenderEventArgs.cs
- InitialServerConnectionReader.cs
- SoapAttributeAttribute.cs
- PriorityBinding.cs
- SubclassTypeValidatorAttribute.cs
- AudioStateChangedEventArgs.cs
- AnimationLayer.cs
- HopperCache.cs
- StringAttributeCollection.cs
- ObjectList.cs
- CryptoHelper.cs
- EntityCommand.cs
- ExpressionEvaluator.cs
- QilStrConcatenator.cs
- CalendarBlackoutDatesCollection.cs
- WriteFileContext.cs
- JoinQueryOperator.cs
- PathFigure.cs
- BamlLocalizationDictionary.cs
- HttpMethodAttribute.cs
- SiteMap.cs
- GetFileNameResult.cs
- HandledEventArgs.cs
- XmlnsPrefixAttribute.cs
- TimerElapsedEvenArgs.cs
- TextDpi.cs
- RegisteredArrayDeclaration.cs
- Profiler.cs
- XmlSerializationGeneratedCode.cs
- UpdateTracker.cs
- FunctionDetailsReader.cs
- HttpValueCollection.cs
- XmlNodeList.cs
- PrivilegeNotHeldException.cs
- RootBrowserWindowProxy.cs
- RulePatternOps.cs
- DbSource.cs
- PauseStoryboard.cs
- Stylesheet.cs
- ReflectionPermission.cs
- VideoDrawing.cs
- CatalogZone.cs
- ApplicationProxyInternal.cs
- ConfigXmlCDataSection.cs
- CellTreeNodeVisitors.cs
- __Filters.cs
- HttpWriter.cs
- DbProviderFactory.cs
- SettingsPropertyWrongTypeException.cs
- WebPartCancelEventArgs.cs
- ObjectItemNoOpAssemblyLoader.cs
- COM2PictureConverter.cs
- DoubleLink.cs
- DirectionalLight.cs
- CompositeCollectionView.cs
- DataGridViewCellCancelEventArgs.cs
- ElementAction.cs
- RoutedEventArgs.cs