Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / Orcas / SP / 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
- HttpGetClientProtocol.cs
- HMACMD5.cs
- CLRBindingWorker.cs
- CharacterHit.cs
- LogicalExpressionTypeConverter.cs
- ProcessStartInfo.cs
- HtmlHistory.cs
- LineMetrics.cs
- EqualityComparer.cs
- Pair.cs
- MediaContextNotificationWindow.cs
- WebPartsSection.cs
- CheckBox.cs
- XmlQualifiedNameTest.cs
- ModelItem.cs
- WebServiceBindingAttribute.cs
- FeatureSupport.cs
- Properties.cs
- DocumentSequenceHighlightLayer.cs
- SecurityToken.cs
- MetadataArtifactLoaderFile.cs
- FindRequestContext.cs
- AnimatedTypeHelpers.cs
- GeometryHitTestResult.cs
- Update.cs
- BitArray.cs
- _Rfc2616CacheValidators.cs
- CrossContextChannel.cs
- PassportAuthenticationModule.cs
- DoubleAverageAggregationOperator.cs
- StringInfo.cs
- DbProviderServices.cs
- SHA1Managed.cs
- RestClientProxyHandler.cs
- MarginCollapsingState.cs
- TraceProvider.cs
- TagPrefixAttribute.cs
- IPGlobalProperties.cs
- IdentityNotMappedException.cs
- EntityDataSourceDataSelectionPanel.designer.cs
- OutOfMemoryException.cs
- SslStream.cs
- BitmapFrameEncode.cs
- NavigationPropertyEmitter.cs
- Block.cs
- PrintDialog.cs
- ConfigurationLocationCollection.cs
- compensatingcollection.cs
- ServiceDiscoveryBehavior.cs
- QilPatternVisitor.cs
- ListViewHitTestInfo.cs
- CodePageUtils.cs
- ObjectDataSourceDisposingEventArgs.cs
- ScrollPattern.cs
- DocComment.cs
- oledbconnectionstring.cs
- ButtonChrome.cs
- LayoutTableCell.cs
- DoubleConverter.cs
- VectorCollectionValueSerializer.cs
- MeasureData.cs
- WebEventTraceProvider.cs
- WpfSharedXamlSchemaContext.cs
- SmiEventSink_DeferedProcessing.cs
- DataGridAutoFormatDialog.cs
- CharEntityEncoderFallback.cs
- ClientData.cs
- MasterPageCodeDomTreeGenerator.cs
- TcpClientSocketManager.cs
- _ListenerRequestStream.cs
- MaskedTextBox.cs
- SEHException.cs
- SchemaImporter.cs
- SQLInt64.cs
- SqlDuplicator.cs
- Hashtable.cs
- WindowInteropHelper.cs
- ContextMenuAutomationPeer.cs
- HttpModulesSection.cs
- ImportedNamespaceContextItem.cs
- ActivityCodeDomSerializationManager.cs
- InkPresenter.cs
- StreamAsIStream.cs
- GridViewHeaderRowPresenter.cs
- AvTraceFormat.cs
- AsyncWaitHandle.cs
- TreeViewDesigner.cs
- DatatypeImplementation.cs
- IntegerValidator.cs
- ProcessHost.cs
- HttpPostClientProtocol.cs
- RegistryExceptionHelper.cs
- BlockCollection.cs
- DesignOnlyAttribute.cs
- SafeViewOfFileHandle.cs
- QueryableFilterUserControl.cs
- ProxyWebPartConnectionCollection.cs
- OrderedHashRepartitionStream.cs
- ImpersonationContext.cs
- newinstructionaction.cs