Code:
/ 4.0 / 4.0 / untmp / 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.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- versioninfo.cs
- XsdCachingReader.cs
- WebServiceMethodData.cs
- CodeCompileUnit.cs
- ErrorTableItemStyle.cs
- QueryUtil.cs
- XmlSchemaRedefine.cs
- CompositeFontFamily.cs
- BindingsCollection.cs
- ByteFacetDescriptionElement.cs
- CompressEmulationStream.cs
- TextDocumentView.cs
- Mapping.cs
- PointCollectionValueSerializer.cs
- CallContext.cs
- TickBar.cs
- CommandLineParser.cs
- BamlLocalizableResourceKey.cs
- DesignSurfaceEvent.cs
- SurrogateChar.cs
- NativeRecognizer.cs
- TransactionsSectionGroup.cs
- WebPartUtil.cs
- StylusOverProperty.cs
- ACL.cs
- DropTarget.cs
- Parser.cs
- MethodImplAttribute.cs
- SortQuery.cs
- ScrollBar.cs
- WaitHandle.cs
- Globals.cs
- ButtonColumn.cs
- NotSupportedException.cs
- CapabilitiesSection.cs
- WSIdentityFaultException.cs
- MatrixAnimationUsingKeyFrames.cs
- HebrewCalendar.cs
- ConnectionInterfaceCollection.cs
- ObjectListItemCollection.cs
- ValueUtilsSmi.cs
- HttpPostedFileWrapper.cs
- DecimalAnimation.cs
- XmlSignificantWhitespace.cs
- WebPartConnection.cs
- Coordinator.cs
- CustomErrorCollection.cs
- IfAction.cs
- PipelineModuleStepContainer.cs
- CodeSubDirectoriesCollection.cs
- Avt.cs
- ListControlConvertEventArgs.cs
- GroupJoinQueryOperator.cs
- DateTimeFormatInfoScanner.cs
- Int32CAMarshaler.cs
- WebException.cs
- Error.cs
- InstanceDataCollectionCollection.cs
- FormsAuthenticationUser.cs
- DetailsViewDeletedEventArgs.cs
- OrderPreservingPipeliningSpoolingTask.cs
- SqlGatherConsumedAliases.cs
- NetSectionGroup.cs
- ProcessHost.cs
- BuildResult.cs
- AttributeEmitter.cs
- ComponentDispatcherThread.cs
- EventHandlers.cs
- ToolStripManager.cs
- EventQueueState.cs
- UIElementAutomationPeer.cs
- Repeater.cs
- LinqDataSourceHelper.cs
- DescendentsWalker.cs
- ViewStateModeByIdAttribute.cs
- ImageInfo.cs
- RightsDocument.cs
- SecurityNegotiationException.cs
- StsCommunicationException.cs
- CasesDictionary.cs
- DataGridCellEditEndingEventArgs.cs
- TreeNodeBindingCollection.cs
- TcpWorkerProcess.cs
- ArrayEditor.cs
- RuleElement.cs
- _CookieModule.cs
- GridViewUpdateEventArgs.cs
- FileCodeGroup.cs
- XmlReflectionImporter.cs
- BitSet.cs
- XmlnsDictionary.cs
- BreakRecordTable.cs
- Stack.cs
- TerminateDesigner.cs
- Switch.cs
- XmlSchemaSequence.cs
- IdentifierElement.cs
- SystemIPInterfaceProperties.cs
- SiteMapSection.cs
- ISAPIRuntime.cs