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
- NavigationHelper.cs
- DbModificationClause.cs
- WMIInterop.cs
- ProviderException.cs
- SqlServer2KCompatibilityAnnotation.cs
- InteropBitmapSource.cs
- CompilerResults.cs
- OrderedDictionaryStateHelper.cs
- FormatException.cs
- ConstructorBuilder.cs
- TextInfo.cs
- BinaryMethodMessage.cs
- StylusLogic.cs
- KeyEvent.cs
- Graphics.cs
- FontWeight.cs
- TextRenderer.cs
- BuildProvidersCompiler.cs
- SystemIPv6InterfaceProperties.cs
- GuidConverter.cs
- GridViewColumnCollection.cs
- MemberExpression.cs
- TagMapCollection.cs
- exports.cs
- X500Name.cs
- DemultiplexingDispatchMessageFormatter.cs
- ColumnResult.cs
- FaultHandlingFilter.cs
- PackageProperties.cs
- SecurityTokenContainer.cs
- ProtocolsConfiguration.cs
- AutomationElementCollection.cs
- DrawingVisualDrawingContext.cs
- IODescriptionAttribute.cs
- IisTraceWebEventProvider.cs
- CompilerCollection.cs
- HasCopySemanticsAttribute.cs
- FileFormatException.cs
- Symbol.cs
- WriteStateInfoBase.cs
- PropertyGeneratedEventArgs.cs
- AspNetRouteServiceHttpHandler.cs
- TypedRowHandler.cs
- EntityTemplateUserControl.cs
- XmlSchemaSimpleContentRestriction.cs
- SqlDelegatedTransaction.cs
- Table.cs
- ProcessModelSection.cs
- TargetParameterCountException.cs
- DataGridLinkButton.cs
- ObjectAssociationEndMapping.cs
- MimeMultiPart.cs
- TextSelectionProcessor.cs
- ClickablePoint.cs
- GlyphsSerializer.cs
- RegistrySecurity.cs
- ObjectComplexPropertyMapping.cs
- WindowsTreeView.cs
- QueryContext.cs
- EntityDataSourceWrapperCollection.cs
- NgenServicingAttributes.cs
- PriorityChain.cs
- RawStylusSystemGestureInputReport.cs
- EmptyWithCancelationCheckWorkItem.cs
- SqlDataSourceEnumerator.cs
- DrawTreeNodeEventArgs.cs
- DATA_BLOB.cs
- MethodToken.cs
- ScriptingAuthenticationServiceSection.cs
- GridViewRowEventArgs.cs
- ColorEditor.cs
- WebPartDisplayModeEventArgs.cs
- CryptoProvider.cs
- IdentityNotMappedException.cs
- MarginCollapsingState.cs
- SrgsRule.cs
- OpCodes.cs
- DependencyPropertyConverter.cs
- ProgressBar.cs
- ListChangedEventArgs.cs
- sapiproxy.cs
- DateTimeOffset.cs
- ParseChildrenAsPropertiesAttribute.cs
- SafeNativeMethods.cs
- KoreanCalendar.cs
- HyperLinkField.cs
- versioninfo.cs
- ButtonBaseAdapter.cs
- CryptoStream.cs
- SizeLimitedCache.cs
- HyperLinkStyle.cs
- ResourceDictionary.cs
- BasePattern.cs
- TagPrefixCollection.cs
- Substitution.cs
- AssemblyAttributesGoHere.cs
- CodeNamespaceImport.cs
- ActivityFunc.cs
- Win32PrintDialog.cs
- DateTimeSerializationSection.cs