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
- __ConsoleStream.cs
- BindingOperations.cs
- QuaternionAnimation.cs
- IdentityReference.cs
- DataGridRelationshipRow.cs
- COAUTHIDENTITY.cs
- Html32TextWriter.cs
- ProtocolsConfiguration.cs
- IndicFontClient.cs
- HWStack.cs
- ListViewItem.cs
- ToolStripButton.cs
- XmlName.cs
- Line.cs
- ControlBindingsCollection.cs
- Stylesheet.cs
- BuildManager.cs
- DebugView.cs
- LoginName.cs
- ProtocolViolationException.cs
- Menu.cs
- CqlIdentifiers.cs
- PrinterSettings.cs
- EventDescriptorCollection.cs
- XmlStringTable.cs
- panel.cs
- CodeDirectoryCompiler.cs
- ProjectionCamera.cs
- DocumentPageHost.cs
- WindowsListViewItemStartMenu.cs
- OleDbConnection.cs
- Timeline.cs
- ConstructorExpr.cs
- EnumConverter.cs
- OpCodes.cs
- DataSourceSelectArguments.cs
- TextDocumentView.cs
- DesignTimeTemplateParser.cs
- FlowNode.cs
- WebPartUserCapability.cs
- StylusPlugin.cs
- ConnectionConsumerAttribute.cs
- SmtpClient.cs
- HybridObjectCache.cs
- ClientSideQueueItem.cs
- ActiveXHelper.cs
- LambdaValue.cs
- ColumnHeader.cs
- ASCIIEncoding.cs
- RepeatBehaviorConverter.cs
- PrinterSettings.cs
- ProxyAttribute.cs
- remotingproxy.cs
- EntitySetBaseCollection.cs
- MimeTypeMapper.cs
- CodeDelegateInvokeExpression.cs
- DataGridViewRowErrorTextNeededEventArgs.cs
- ResourceManagerWrapper.cs
- TextBox.cs
- TrackingProfile.cs
- ExpressionList.cs
- SqlProviderServices.cs
- CodeDefaultValueExpression.cs
- FieldNameLookup.cs
- UnaryExpression.cs
- StrokeNodeData.cs
- ClockController.cs
- StrokeCollectionConverter.cs
- SelectorAutomationPeer.cs
- HierarchicalDataSourceControl.cs
- LinearGradientBrush.cs
- EmptyCollection.cs
- SQLBytes.cs
- ExpressionVisitor.cs
- Profiler.cs
- CodeTryCatchFinallyStatement.cs
- DiscoveryEndpoint.cs
- LocalizabilityAttribute.cs
- FormsAuthenticationCredentials.cs
- ServiceHostFactory.cs
- ResourceBinder.cs
- ProgressBar.cs
- VoiceInfo.cs
- ResetableIterator.cs
- PropertyGridView.cs
- ObjectSerializerFactory.cs
- DaylightTime.cs
- listitem.cs
- MessagePropertyDescriptionCollection.cs
- XmlAttributeCollection.cs
- DiagnosticSection.cs
- CatalogUtil.cs
- CheckBoxField.cs
- MissingFieldException.cs
- MergablePropertyAttribute.cs
- AppSettingsExpressionBuilder.cs
- FilteredReadOnlyMetadataCollection.cs
- SecurityTokenParametersEnumerable.cs
- _LoggingObject.cs
- IdentifierService.cs