Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / Orcas / NetFXw7 / 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
- KeyGestureConverter.cs
- XmlQualifiedNameTest.cs
- SoapCodeExporter.cs
- ListBindingConverter.cs
- UniqueConstraint.cs
- TabPage.cs
- EventLogPermissionEntry.cs
- X509SecurityToken.cs
- IntranetCredentialPolicy.cs
- LockRecursionException.cs
- DataServiceEntityAttribute.cs
- XmlIlVisitor.cs
- PageStatePersister.cs
- Event.cs
- IODescriptionAttribute.cs
- StdRegProviderWrapper.cs
- CapabilitiesRule.cs
- BasicCellRelation.cs
- DoubleConverter.cs
- ComplexLine.cs
- DashStyles.cs
- XXXInfos.cs
- TrustLevelCollection.cs
- ClientScriptManager.cs
- PageContentAsyncResult.cs
- CngKey.cs
- PersonalizationStateQuery.cs
- Operators.cs
- DataGrid.cs
- GroupBoxRenderer.cs
- DataSourceGeneratorException.cs
- WriteableBitmap.cs
- DataGridViewBand.cs
- SqlInternalConnectionTds.cs
- PageThemeParser.cs
- ChtmlLinkAdapter.cs
- DesignerTransaction.cs
- StandardToolWindows.cs
- LoginNameDesigner.cs
- TrackBarRenderer.cs
- MailMessageEventArgs.cs
- SHA1.cs
- ControlValuePropertyAttribute.cs
- CompilerGeneratedAttribute.cs
- StorageMappingFragment.cs
- WS2007HttpBindingElement.cs
- objectquery_tresulttype.cs
- Vector3DKeyFrameCollection.cs
- ResourceDefaultValueAttribute.cs
- ScriptIgnoreAttribute.cs
- Win32Exception.cs
- CoTaskMemUnicodeSafeHandle.cs
- Globals.cs
- PublishLicense.cs
- MailMessage.cs
- TypeDefinition.cs
- Aes.cs
- XmlQueryCardinality.cs
- FixedPageStructure.cs
- shaper.cs
- CssStyleCollection.cs
- SafeProcessHandle.cs
- ComplexObject.cs
- DocumentsTrace.cs
- BinarySerializer.cs
- BaseProcessor.cs
- TextTreeFixupNode.cs
- GeneralTransform.cs
- HtmlHead.cs
- NamespaceInfo.cs
- WebPartCloseVerb.cs
- Point3DCollectionValueSerializer.cs
- SearchForVirtualItemEventArgs.cs
- TrustManager.cs
- UserControlParser.cs
- SymbolDocumentGenerator.cs
- FormViewUpdateEventArgs.cs
- UIElement3DAutomationPeer.cs
- UnmanagedMemoryAccessor.cs
- MeasureData.cs
- XsdBuildProvider.cs
- DelegatingTypeDescriptionProvider.cs
- SqlDataSourceStatusEventArgs.cs
- InvokeMethodActivity.cs
- AnnotationService.cs
- BackgroundWorker.cs
- AssociatedControlConverter.cs
- SerialPort.cs
- RequiredFieldValidator.cs
- HwndTarget.cs
- HttpFileCollection.cs
- FormDocumentDesigner.cs
- SecurityContextTokenCache.cs
- TypeGeneratedEventArgs.cs
- ParseChildrenAsPropertiesAttribute.cs
- SemanticBasicElement.cs
- RuntimeWrappedException.cs
- HwndTarget.cs
- AppliedDeviceFiltersEditor.cs
- AncestorChangedEventArgs.cs