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
- WebPartEditorApplyVerb.cs
- GridViewRowCollection.cs
- DynamicPropertyHolder.cs
- EpmSyndicationContentSerializer.cs
- Dictionary.cs
- ControlFilterExpression.cs
- LambdaCompiler.Generated.cs
- Reference.cs
- selecteditemcollection.cs
- SerializationStore.cs
- OrthographicCamera.cs
- ListenerElementsCollection.cs
- SourceFileBuildProvider.cs
- HMACMD5.cs
- SettingsPropertyValue.cs
- ConstantCheck.cs
- EpmContentDeSerializer.cs
- HebrewNumber.cs
- ProfileGroupSettings.cs
- GridEntry.cs
- XmlWhitespace.cs
- MouseBinding.cs
- ConnectionsZone.cs
- TableLayoutRowStyleCollection.cs
- CheckBoxStandardAdapter.cs
- DbConnectionPoolIdentity.cs
- Schema.cs
- DoubleAnimationUsingPath.cs
- EventData.cs
- ActivityMarkupSerializationProvider.cs
- DllNotFoundException.cs
- Function.cs
- PenThreadPool.cs
- CommonXSendMessage.cs
- ContextBase.cs
- Color.cs
- RangeValidator.cs
- LabelEditEvent.cs
- HttpException.cs
- InstancePersistenceCommand.cs
- DataGridViewRowPrePaintEventArgs.cs
- IRCollection.cs
- TextElementEditingBehaviorAttribute.cs
- FastEncoder.cs
- CursorConverter.cs
- BaseTemplateCodeDomTreeGenerator.cs
- DeriveBytes.cs
- TextSelectionHighlightLayer.cs
- LinqExpressionNormalizer.cs
- Rect3D.cs
- BindingSourceDesigner.cs
- BitmapPalette.cs
- IndexedSelectQueryOperator.cs
- BasicExpressionVisitor.cs
- BreakRecordTable.cs
- Module.cs
- ListItemCollection.cs
- MailBnfHelper.cs
- updatecommandorderer.cs
- SatelliteContractVersionAttribute.cs
- SessionStateSection.cs
- QilFunction.cs
- CorrelationManager.cs
- Path.cs
- SupportedAddressingMode.cs
- EventSinkHelperWriter.cs
- InternalException.cs
- DrawingImage.cs
- FrameworkElementAutomationPeer.cs
- SchemaHelper.cs
- XmlCDATASection.cs
- CodeSpit.cs
- XmlSchemaAll.cs
- CodeSnippetCompileUnit.cs
- ArrayExtension.cs
- PolicyUnit.cs
- ProgressBarAutomationPeer.cs
- HybridObjectCache.cs
- FixedSOMGroup.cs
- MasterPageParser.cs
- MsmqIntegrationBindingElement.cs
- MonitoringDescriptionAttribute.cs
- TableRowGroupCollection.cs
- ResourceDescriptionAttribute.cs
- ProvidersHelper.cs
- HierarchicalDataSourceControl.cs
- XmlBinaryReaderSession.cs
- NullableFloatAverageAggregationOperator.cs
- _FtpControlStream.cs
- WindowShowOrOpenTracker.cs
- StylusEditingBehavior.cs
- SiteMap.cs
- GorillaCodec.cs
- ScriptResourceMapping.cs
- BitmapInitialize.cs
- PeerNameRecord.cs
- ProfileGroupSettings.cs
- ApplicationHost.cs
- DataSourceXmlSerializationAttribute.cs
- GenerateTemporaryAssemblyTask.cs