Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / Orcas / NetFXw7 / 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
- HuffCodec.cs
- RelationshipFixer.cs
- WindowsListViewGroupHelper.cs
- SecurityTokenTypes.cs
- APCustomTypeDescriptor.cs
- HwndAppCommandInputProvider.cs
- Vector3DConverter.cs
- SqlBuffer.cs
- HttpContextServiceHost.cs
- TransformFinalBlockRequest.cs
- ServiceActivationException.cs
- ResourceReferenceExpressionConverter.cs
- ToolBarPanel.cs
- CurrencyManager.cs
- LocalFileSettingsProvider.cs
- DependencyPropertyValueSerializer.cs
- DoubleKeyFrameCollection.cs
- RegexParser.cs
- Console.cs
- Geometry.cs
- WebPartMinimizeVerb.cs
- EventLogWatcher.cs
- TraceContextEventArgs.cs
- CssStyleCollection.cs
- SQLBoolean.cs
- RightsDocument.cs
- TrackingLocationCollection.cs
- LineServicesCallbacks.cs
- x509utils.cs
- ISSmlParser.cs
- BamlLocalizableResource.cs
- RootBrowserWindowProxy.cs
- TextViewSelectionProcessor.cs
- SecurityNegotiationException.cs
- WMIInterop.cs
- SafeFileHandle.cs
- TdsParserStaticMethods.cs
- BrowserDefinitionCollection.cs
- SimpleLine.cs
- ServiceRoute.cs
- DataSourceCacheDurationConverter.cs
- Debug.cs
- DrawingContextWalker.cs
- GenericPrincipal.cs
- LambdaReference.cs
- Stopwatch.cs
- SqlInternalConnection.cs
- EmptyStringExpandableObjectConverter.cs
- ToolStripPanelSelectionBehavior.cs
- HttpStreams.cs
- XamlStream.cs
- DoubleConverter.cs
- CriticalHandle.cs
- FilePrompt.cs
- BrowserDefinition.cs
- Pair.cs
- MultiTouchSystemGestureLogic.cs
- RelatedCurrencyManager.cs
- xmlglyphRunInfo.cs
- SqlDataAdapter.cs
- ServiceNameCollection.cs
- PathBox.cs
- XmlCollation.cs
- TemplateAction.cs
- CapiHashAlgorithm.cs
- AppSecurityManager.cs
- AdornerDecorator.cs
- CompressStream.cs
- AdornedElementPlaceholder.cs
- MenuItemAutomationPeer.cs
- ParseElementCollection.cs
- DiscoveryClientChannelBase.cs
- ListBox.cs
- SqlFacetAttribute.cs
- Compiler.cs
- TimeEnumHelper.cs
- XmlEncoding.cs
- CollectionChangedEventManager.cs
- GrammarBuilderBase.cs
- HtmlWindowCollection.cs
- Ipv6Element.cs
- RecordConverter.cs
- Viewport3DVisual.cs
- DetailsViewDesigner.cs
- ListCardsInFileRequest.cs
- UpDownEvent.cs
- DoubleCollectionConverter.cs
- StringConcat.cs
- DataObjectSettingDataEventArgs.cs
- FrameworkTemplate.cs
- dbdatarecord.cs
- MSAAEventDispatcher.cs
- UIElement3D.cs
- SqlConnection.cs
- Substitution.cs
- DbConnectionPool.cs
- DelegateSerializationHolder.cs
- CompareValidator.cs
- CodeNamespaceImportCollection.cs
- ChineseLunisolarCalendar.cs