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
- NativeMethods.cs
- AutoCompleteStringCollection.cs
- ControlBuilder.cs
- ConnectionStringsExpressionBuilder.cs
- HelpFileFileNameEditor.cs
- HitTestParameters3D.cs
- AttachedAnnotation.cs
- RemoteArgument.cs
- CheckBoxList.cs
- InvalidAsynchronousStateException.cs
- DecimalConverter.cs
- webbrowsersite.cs
- PeerToPeerException.cs
- BitmapImage.cs
- ThrowHelper.cs
- BufferedGraphicsContext.cs
- SafeNativeMethods.cs
- DesignerTransactionCloseEvent.cs
- Range.cs
- SessionStateSection.cs
- Processor.cs
- Evidence.cs
- RemoteWebConfigurationHostServer.cs
- DragEvent.cs
- BitmapEffectOutputConnector.cs
- RecipientInfo.cs
- SubqueryTrackingVisitor.cs
- ParameterCollection.cs
- EdgeProfileValidation.cs
- SamlConditions.cs
- StringFunctions.cs
- SQLInt64Storage.cs
- SortQuery.cs
- DataPagerFieldCommandEventArgs.cs
- UndoManager.cs
- ExceptionHandler.cs
- TranslateTransform3D.cs
- TextTreeText.cs
- ConfigXmlComment.cs
- FormViewAutoFormat.cs
- Animatable.cs
- RepeatBehavior.cs
- InputProcessorProfilesLoader.cs
- CheckedListBox.cs
- HttpCacheParams.cs
- ToolStripRendererSwitcher.cs
- DoubleAnimationUsingKeyFrames.cs
- TypeConverter.cs
- DataServices.cs
- XmlEntity.cs
- BindingMAnagerBase.cs
- MailAddress.cs
- ListControl.cs
- ReflectionHelper.cs
- ValueCollectionParameterReader.cs
- StatusBarDrawItemEvent.cs
- ModulesEntry.cs
- CompoundFileStreamReference.cs
- RoleServiceManager.cs
- ModelItemDictionaryImpl.cs
- EventWaitHandleSecurity.cs
- Preprocessor.cs
- GridViewUpdateEventArgs.cs
- NameValueConfigurationElement.cs
- entityreference_tresulttype.cs
- EntityContainerEntitySet.cs
- SrgsGrammar.cs
- EditorPartChrome.cs
- rsa.cs
- ParameterElementCollection.cs
- HitTestFilterBehavior.cs
- UndirectedGraph.cs
- NonParentingControl.cs
- ItemsControlAutomationPeer.cs
- GreenMethods.cs
- SqlGenerator.cs
- DataSourceXmlSerializationAttribute.cs
- MsmqIntegrationChannelListener.cs
- ObjectDataSource.cs
- MarkupObject.cs
- TypedTableBaseExtensions.cs
- HostProtectionPermission.cs
- LambdaCompiler.Logical.cs
- Quad.cs
- CapabilitiesSection.cs
- IisTraceListener.cs
- DbSetClause.cs
- ColumnMap.cs
- _NativeSSPI.cs
- DrawingVisual.cs
- CharConverter.cs
- SQLInt64Storage.cs
- XmlTextAttribute.cs
- XmlIlGenerator.cs
- Attributes.cs
- TemplateXamlParser.cs
- BitSet.cs
- ComplexBindingPropertiesAttribute.cs
- CustomPeerResolverService.cs
- ToolStripItemClickedEventArgs.cs