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
- CmsInterop.cs
- WorkItem.cs
- Baml2006ReaderContext.cs
- TransformerInfo.cs
- Command.cs
- UrlPropertyAttribute.cs
- WebPartTransformerAttribute.cs
- DetailsViewRowCollection.cs
- ExceptionUtil.cs
- DataTableTypeConverter.cs
- UnmanagedMemoryStream.cs
- Helpers.cs
- HttpListener.cs
- ButtonChrome.cs
- TextEvent.cs
- GridViewRow.cs
- _ConnectStream.cs
- CommandDevice.cs
- SqlColumnizer.cs
- FixedFindEngine.cs
- TypeTypeConverter.cs
- TypeLibConverter.cs
- ContentTextAutomationPeer.cs
- Pair.cs
- dbdatarecord.cs
- GetLastErrorDetailsRequest.cs
- PlainXmlSerializer.cs
- NavigatingCancelEventArgs.cs
- SQLInt64Storage.cs
- PropertyPath.cs
- XPathNavigatorReader.cs
- OpenFileDialog.cs
- QueryInterceptorAttribute.cs
- Emitter.cs
- XmlSchemaInferenceException.cs
- WindowsRichEditRange.cs
- ReadOnlyPropertyMetadata.cs
- ConfigXmlWhitespace.cs
- log.cs
- OdbcUtils.cs
- Section.cs
- GridItemCollection.cs
- RemoteEndpointMessageProperty.cs
- TextViewBase.cs
- MaterialGroup.cs
- WasHttpModulesInstallComponent.cs
- ConstructorArgumentAttribute.cs
- ObjectStateEntry.cs
- ProjectionPath.cs
- Signature.cs
- PackageDigitalSignatureManager.cs
- SHA1.cs
- UInt32Storage.cs
- HitTestFilterBehavior.cs
- ExpanderAutomationPeer.cs
- HotSpotCollection.cs
- DaylightTime.cs
- Funcletizer.cs
- ComboBoxRenderer.cs
- EntityConnectionStringBuilder.cs
- XPathDescendantIterator.cs
- SafeLibraryHandle.cs
- AuthenticatingEventArgs.cs
- Item.cs
- HtmlTable.cs
- GroupPartitionExpr.cs
- BaseComponentEditor.cs
- FamilyTypefaceCollection.cs
- ConfigurationSection.cs
- PointAnimationClockResource.cs
- DataColumn.cs
- DataGridViewComboBoxColumn.cs
- ScopeCollection.cs
- SlotInfo.cs
- StickyNote.cs
- GPStream.cs
- SafeHGlobalHandleCritical.cs
- HtmlInputHidden.cs
- Rotation3D.cs
- FixedFindEngine.cs
- ServicePointManagerElement.cs
- Margins.cs
- LinqDataSourceInsertEventArgs.cs
- BasicHttpBindingCollectionElement.cs
- IRCollection.cs
- XamlPointCollectionSerializer.cs
- ExtenderControl.cs
- RijndaelManaged.cs
- PaperSource.cs
- XmlQueryStaticData.cs
- FontInfo.cs
- XmlSerializerSection.cs
- CharKeyFrameCollection.cs
- StringWriter.cs
- CounterNameConverter.cs
- ClientSettingsSection.cs
- ContractsBCL.cs
- EventLogTraceListener.cs
- BaseDataList.cs
- ImageButton.cs