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
- RuntimeVariableList.cs
- DesignerImageAdapter.cs
- x509utils.cs
- ValidationResult.cs
- MetadataItemSerializer.cs
- EntityWrapperFactory.cs
- SQLDateTime.cs
- WebServiceEnumData.cs
- BinaryNode.cs
- StateWorkerRequest.cs
- DesigntimeLicenseContextSerializer.cs
- ToolboxItemCollection.cs
- Properties.cs
- WindowsGrip.cs
- StatusBar.cs
- HandlerMappingMemo.cs
- LogStream.cs
- TaiwanLunisolarCalendar.cs
- EntityWithChangeTrackerStrategy.cs
- InternalDuplexChannelListener.cs
- AstNode.cs
- CodeGotoStatement.cs
- BuilderPropertyEntry.cs
- Vector.cs
- SelectionListComponentEditor.cs
- Oid.cs
- SqlCommand.cs
- ClientApiGenerator.cs
- HwndHostAutomationPeer.cs
- TreeViewImageKeyConverter.cs
- DispatchChannelSink.cs
- UnsafeNativeMethods.cs
- FormatConvertedBitmap.cs
- WebPartMinimizeVerb.cs
- RegexNode.cs
- SQLInt16.cs
- PersonalizablePropertyEntry.cs
- DesignerRegionCollection.cs
- GraphicsContext.cs
- BitmapMetadataEnumerator.cs
- XmlSchemaInclude.cs
- AsymmetricAlgorithm.cs
- RemoteX509AsymmetricSecurityKey.cs
- SinglePageViewer.cs
- LightweightCodeGenerator.cs
- DefaultValueMapping.cs
- Stackframe.cs
- FontUnitConverter.cs
- BlobPersonalizationState.cs
- GACMembershipCondition.cs
- KeyValueConfigurationCollection.cs
- DynamicActionMessageFilter.cs
- CasesDictionary.cs
- PageAsyncTaskManager.cs
- AlphaSortedEnumConverter.cs
- Buffer.cs
- glyphs.cs
- Behavior.cs
- TypeUtil.cs
- GridViewHeaderRowPresenterAutomationPeer.cs
- RegistrySecurity.cs
- XmlAttribute.cs
- WsatServiceAddress.cs
- FunctionImportElement.cs
- InputElement.cs
- CodeTypeReference.cs
- WindowManager.cs
- DefaultPropertyAttribute.cs
- XmlQueryStaticData.cs
- WpfKnownTypeInvoker.cs
- SmiContext.cs
- RuntimeCompatibilityAttribute.cs
- FontNameConverter.cs
- DateTimeHelper.cs
- CodeArrayCreateExpression.cs
- InvalidProgramException.cs
- RandomNumberGenerator.cs
- Brushes.cs
- UnsafePeerToPeerMethods.cs
- COM2Properties.cs
- ComAdminWrapper.cs
- _ConnectStream.cs
- ImplicitInputBrush.cs
- ContentType.cs
- TextModifierScope.cs
- OlePropertyStructs.cs
- SiteMapSection.cs
- OdbcHandle.cs
- OutputScopeManager.cs
- MSHTMLHost.cs
- WmlTextViewAdapter.cs
- StrongNameUtility.cs
- ListControl.cs
- AttachedAnnotationChangedEventArgs.cs
- SafeBitVector32.cs
- StorageTypeMapping.cs
- ImageDrawing.cs
- QilInvokeEarlyBound.cs
- SharedDp.cs
- ArrayList.cs