Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / wpf / src / Base / MS / Internal / IO / Packaging / TrackingMemoryStream.cs / 1305600 / 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
- NameValuePair.cs
- NTAccount.cs
- DataGridCommandEventArgs.cs
- MethodRental.cs
- AppDomainManager.cs
- RelativeSource.cs
- ColumnWidthChangedEvent.cs
- MDIWindowDialog.cs
- SqlCacheDependencyDatabase.cs
- EventPrivateKey.cs
- StylusPointProperties.cs
- XPathNode.cs
- Vector3DIndependentAnimationStorage.cs
- StateDesignerConnector.cs
- LinqDataSourceDeleteEventArgs.cs
- XmlnsCompatibleWithAttribute.cs
- Invariant.cs
- BufferBuilder.cs
- WindowProviderWrapper.cs
- DataListItem.cs
- processwaithandle.cs
- MetadataWorkspace.cs
- TableRowGroupCollection.cs
- TemplateBuilder.cs
- Trace.cs
- MaxValueConverter.cs
- ProfessionalColorTable.cs
- ItemList.cs
- DrawingGroup.cs
- ImportContext.cs
- DrawTreeNodeEventArgs.cs
- InternalBufferOverflowException.cs
- ModelPropertyImpl.cs
- ObjectSet.cs
- Int16Converter.cs
- Int32EqualityComparer.cs
- DateTimeValueSerializer.cs
- QilTernary.cs
- QilReplaceVisitor.cs
- SoapProtocolImporter.cs
- KnownBoxes.cs
- XmlSchemaIdentityConstraint.cs
- QueryCacheManager.cs
- Trigger.cs
- TabItem.cs
- TableCell.cs
- RichTextBoxAutomationPeer.cs
- WebBrowserHelper.cs
- PersonalizableTypeEntry.cs
- smtppermission.cs
- validationstate.cs
- EncoderExceptionFallback.cs
- TimeStampChecker.cs
- ResourceDisplayNameAttribute.cs
- PenCursorManager.cs
- GeneratedCodeAttribute.cs
- __ComObject.cs
- ZipIOCentralDirectoryBlock.cs
- Calendar.cs
- Item.cs
- SelectionProcessor.cs
- SerializerDescriptor.cs
- ContextStack.cs
- StreamWriter.cs
- JournalEntryListConverter.cs
- PropertyToken.cs
- CodeVariableDeclarationStatement.cs
- ToolBarDesigner.cs
- DataGridLinkButton.cs
- UserNameSecurityToken.cs
- TextParaLineResult.cs
- SmtpLoginAuthenticationModule.cs
- ProfileSettings.cs
- PageAsyncTaskManager.cs
- CompilationSection.cs
- _AuthenticationState.cs
- TimeSpanParse.cs
- LinkDescriptor.cs
- GridViewUpdateEventArgs.cs
- Exceptions.cs
- BStrWrapper.cs
- FormsIdentity.cs
- Lazy.cs
- RSACryptoServiceProvider.cs
- UriTemplateDispatchFormatter.cs
- ObjectTypeMapping.cs
- RequestQueue.cs
- FontResourceCache.cs
- SqlFunctionAttribute.cs
- HashHelper.cs
- Point3DAnimationBase.cs
- PreparingEnlistment.cs
- Container.cs
- XPathSelfQuery.cs
- OverflowException.cs
- SmtpException.cs
- JournalEntryStack.cs
- ColumnMapVisitor.cs
- xmlfixedPageInfo.cs
- MULTI_QI.cs