Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / Orcas / QFE / 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
- TextSyndicationContent.cs
- XmlSchemaComplexContent.cs
- ThrowHelper.cs
- DataErrorValidationRule.cs
- Pen.cs
- TypeViewSchema.cs
- CompositeCollectionView.cs
- Bits.cs
- Intellisense.cs
- JournalEntry.cs
- BindUriHelper.cs
- ImageMapEventArgs.cs
- AggregateNode.cs
- PathSegmentCollection.cs
- CopyCodeAction.cs
- ProxyWebPart.cs
- DataGridViewRowStateChangedEventArgs.cs
- Transaction.cs
- GrowingArray.cs
- PopupControlService.cs
- ConstructorBuilder.cs
- initElementDictionary.cs
- UnsafeNativeMethods.cs
- RotateTransform3D.cs
- CompoundFileStreamReference.cs
- RemotingService.cs
- LinqToSqlWrapper.cs
- BufferedResponseStream.cs
- BuildProvider.cs
- BindableTemplateBuilder.cs
- SchemaEntity.cs
- SizeConverter.cs
- ImageMap.cs
- RewritingSimplifier.cs
- TableProviderWrapper.cs
- StrokeCollectionDefaultValueFactory.cs
- ReachDocumentSequenceSerializer.cs
- SoapSchemaMember.cs
- SqlReferenceCollection.cs
- ServiceErrorHandler.cs
- SetterBase.cs
- ProcessHostConfigUtils.cs
- ColumnClickEvent.cs
- FontResourceCache.cs
- CardSpaceSelector.cs
- CustomErrorCollection.cs
- ClearTypeHintValidation.cs
- Math.cs
- ConstantExpression.cs
- MarkedHighlightComponent.cs
- MetabaseServerConfig.cs
- _AutoWebProxyScriptEngine.cs
- NonVisualControlAttribute.cs
- XmlText.cs
- TimeSpan.cs
- KeyPullup.cs
- ServiceDeploymentInfo.cs
- IpcClientChannel.cs
- CategoryNameCollection.cs
- ActivityTrace.cs
- ECDiffieHellmanCngPublicKey.cs
- StringBuilder.cs
- BatchParser.cs
- GridEntry.cs
- CodeEntryPointMethod.cs
- messageonlyhwndwrapper.cs
- ConfigurationConverterBase.cs
- Cursors.cs
- HostedBindingBehavior.cs
- XmlAnyElementAttribute.cs
- Subset.cs
- DiscoveryDocument.cs
- ExceptionWrapper.cs
- CqlWriter.cs
- DataGridViewComboBoxEditingControl.cs
- MouseButton.cs
- ScriptDescriptor.cs
- WmpBitmapDecoder.cs
- PageAction.cs
- CachedBitmap.cs
- ActivityDesignerAccessibleObject.cs
- WebBrowserContainer.cs
- CacheMemory.cs
- codemethodreferenceexpression.cs
- ZipIOCentralDirectoryFileHeader.cs
- FrameworkElementFactoryMarkupObject.cs
- DoubleAnimation.cs
- BrowserCapabilitiesFactory.cs
- querybuilder.cs
- InputScope.cs
- ErrorWebPart.cs
- DataGridViewTextBoxColumn.cs
- ArrayItemReference.cs
- SoapIgnoreAttribute.cs
- HMACRIPEMD160.cs
- XmlWriterTraceListener.cs
- SqlDataSource.cs
- CheckBoxFlatAdapter.cs
- SizeFConverter.cs
- SafeBitVector32.cs