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
- BaseDataBoundControl.cs
- SafeNativeMethods.cs
- WinFormsUtils.cs
- MessageHeaderT.cs
- ToolStripLocationCancelEventArgs.cs
- CodeArrayCreateExpression.cs
- SessionState.cs
- PerfCounters.cs
- CapabilitiesRule.cs
- XmlSerializationGeneratedCode.cs
- DataSourceCacheDurationConverter.cs
- IInstanceContextProvider.cs
- WebPartEditorOkVerb.cs
- CompatibleComparer.cs
- IODescriptionAttribute.cs
- SmtpFailedRecipientsException.cs
- Tag.cs
- ValidationVisibilityAttribute.cs
- ServiceDocument.cs
- BamlVersionHeader.cs
- PreservationFileReader.cs
- ScriptingRoleServiceSection.cs
- ActiveXContainer.cs
- Rect.cs
- MsmqIntegrationMessageProperty.cs
- EventMappingSettingsCollection.cs
- XmlSchemaExporter.cs
- EntitySetBaseCollection.cs
- Rectangle.cs
- ProjectionPruner.cs
- TypeListConverter.cs
- ValidationErrorCollection.cs
- ContainerParaClient.cs
- WindowCollection.cs
- HTMLTagNameToTypeMapper.cs
- TableLayoutRowStyleCollection.cs
- ResponseBodyWriter.cs
- NameValueCache.cs
- IntellisenseTextBox.cs
- TableLayoutPanelCodeDomSerializer.cs
- SelectionPattern.cs
- MasterPageBuildProvider.cs
- DefaultValueTypeConverter.cs
- Exceptions.cs
- DataContractSerializer.cs
- WinHttpWebProxyFinder.cs
- ToolboxItemFilterAttribute.cs
- JournalEntryListConverter.cs
- InvokeMethodActivityDesigner.cs
- SerialStream.cs
- MobileCategoryAttribute.cs
- QueryContext.cs
- WindowManager.cs
- SendingRequestEventArgs.cs
- TextRangeEditTables.cs
- MachineSettingsSection.cs
- KeyedCollection.cs
- XmlElement.cs
- SymbolEqualComparer.cs
- SwitchLevelAttribute.cs
- DecodeHelper.cs
- FreeFormDesigner.cs
- DynamicField.cs
- XmlWrappingWriter.cs
- WindowsHyperlink.cs
- ListView.cs
- CompileLiteralTextParser.cs
- SqlDataSourceQueryEditor.cs
- CodeGenerator.cs
- DependencyPropertyDescriptor.cs
- TypeDescriptionProviderAttribute.cs
- MulticastIPAddressInformationCollection.cs
- WebGetAttribute.cs
- MemoryRecordBuffer.cs
- InstanceKeyView.cs
- FormattedText.cs
- ImageKeyConverter.cs
- CommandManager.cs
- FormViewUpdatedEventArgs.cs
- ProjectionCamera.cs
- TTSEngineProxy.cs
- UIElementParaClient.cs
- Int16Storage.cs
- EncryptedReference.cs
- X509ChainPolicy.cs
- EventOpcode.cs
- CssStyleCollection.cs
- EditorBrowsableAttribute.cs
- CodeGroup.cs
- XmlNullResolver.cs
- Literal.cs
- InProcStateClientManager.cs
- WebChannelFactory.cs
- ToolZone.cs
- PanelStyle.cs
- EventHandlersDesigner.cs
- GetIsBrowserClientRequest.cs
- ArcSegment.cs
- Crypto.cs
- WindowsToolbarItemAsMenuItem.cs