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
- GeneralTransform3DCollection.cs
- sqlser.cs
- SqlErrorCollection.cs
- NameValueSectionHandler.cs
- ConfigurationManagerHelper.cs
- DependencyPropertyChangedEventArgs.cs
- dbdatarecord.cs
- EmbeddedMailObjectsCollection.cs
- GeometryModel3D.cs
- OutputCacheProfile.cs
- mediapermission.cs
- Base64Encoding.cs
- DataGridRelationshipRow.cs
- FileSystemWatcher.cs
- XmlElement.cs
- DesignerEventService.cs
- ComPersistableTypeElement.cs
- InkCanvasInnerCanvas.cs
- SystemException.cs
- UnmanagedBitmapWrapper.cs
- ObjectViewQueryResultData.cs
- CodeCommentStatementCollection.cs
- TableAutomationPeer.cs
- CheckBoxStandardAdapter.cs
- IOException.cs
- UnsafeNativeMethods.cs
- DataBoundControlParameterTarget.cs
- Misc.cs
- TextPointer.cs
- LoadItemsEventArgs.cs
- OracleConnectionString.cs
- FileSystemWatcher.cs
- EntitySetBaseCollection.cs
- TextRange.cs
- DetailsViewDeleteEventArgs.cs
- ellipse.cs
- TargetInvocationException.cs
- DataColumnCollection.cs
- Message.cs
- FindCriteriaApril2005.cs
- DrawingContextDrawingContextWalker.cs
- EncryptedXml.cs
- BrushConverter.cs
- EntityChangedParams.cs
- CatalogPartCollection.cs
- CollectionViewGroupInternal.cs
- Screen.cs
- DrawingGroup.cs
- Currency.cs
- ScalarOps.cs
- SqlDataSource.cs
- RequestCachePolicy.cs
- ValidationErrorCollection.cs
- SizeF.cs
- RequiredFieldValidator.cs
- DataReaderContainer.cs
- JsonFormatGeneratorStatics.cs
- OleAutBinder.cs
- ColumnWidthChangingEvent.cs
- InvalidOperationException.cs
- DefaultBinder.cs
- SqlCommandSet.cs
- TimeoutException.cs
- FixedTextBuilder.cs
- DetailsViewDeleteEventArgs.cs
- Token.cs
- SAPIEngineTypes.cs
- SerialPort.cs
- ColumnMapTranslator.cs
- LinkArea.cs
- shaperfactory.cs
- TableLayoutPanelCellPosition.cs
- UshortList2.cs
- TcpActivation.cs
- DataKeyArray.cs
- ReceiveParametersContent.cs
- DataGridViewCellLinkedList.cs
- HexParser.cs
- FormCollection.cs
- PixelFormatConverter.cs
- ConvertEvent.cs
- TypeGenericEnumerableViewSchema.cs
- PageCache.cs
- RegexRunnerFactory.cs
- ProtocolViolationException.cs
- CellParaClient.cs
- ArgIterator.cs
- RequiredFieldValidator.cs
- AppDomainCompilerProxy.cs
- ConfigurationException.cs
- ProxyWebPart.cs
- Mapping.cs
- BaseTreeIterator.cs
- SamlConstants.cs
- DragCompletedEventArgs.cs
- ToolStripPanelRow.cs
- DataGridViewCheckBoxColumn.cs
- XmlUtil.cs
- PropertyDescriptors.cs
- DateTimeOffsetConverter.cs