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
- DesignerVerbToolStripMenuItem.cs
- ChannelRequirements.cs
- MemoryPressure.cs
- Geometry.cs
- PrintDialog.cs
- EncryptedData.cs
- UIHelper.cs
- ConfigXmlText.cs
- TrackingProfileDeserializationException.cs
- EditorPartChrome.cs
- EventMap.cs
- StringUtil.cs
- TypeGeneratedEventArgs.cs
- DateTimeAutomationPeer.cs
- DbSource.cs
- FontSourceCollection.cs
- ToolboxItem.cs
- RelOps.cs
- CachedFontFamily.cs
- MethodBuilderInstantiation.cs
- ConditionChanges.cs
- OperandQuery.cs
- PDBReader.cs
- xmlfixedPageInfo.cs
- ServicePoint.cs
- StringUtil.cs
- BitmapEffectInputConnector.cs
- InvalidBodyAccessException.cs
- CachingHintValidation.cs
- TextRenderer.cs
- ZipIOCentralDirectoryBlock.cs
- ListViewGroupItemCollection.cs
- AuthenticationSection.cs
- DropDownButton.cs
- SymDocumentType.cs
- WebEventCodes.cs
- DesignerEditorPartChrome.cs
- DataKey.cs
- BeginEvent.cs
- DataColumnCollection.cs
- ButtonFlatAdapter.cs
- XamlClipboardData.cs
- OdbcStatementHandle.cs
- HttpGetServerProtocol.cs
- SoapEnumAttribute.cs
- EntityProxyFactory.cs
- CodeTypeDelegate.cs
- TextEditorThreadLocalStore.cs
- XmlSchemaFacet.cs
- ReadWriteControlDesigner.cs
- Visitor.cs
- SQLBinary.cs
- SQLDecimal.cs
- RequestTimeoutManager.cs
- AssociationEndMember.cs
- UnsafeNativeMethodsTablet.cs
- NativeMethods.cs
- MailFileEditor.cs
- SelectedCellsCollection.cs
- Select.cs
- InstanceNotReadyException.cs
- UnionQueryOperator.cs
- QuerySubExprEliminator.cs
- ConsumerConnectionPoint.cs
- EntityViewGenerator.cs
- PersistenceMetadataNamespace.cs
- SequenceRange.cs
- Expression.cs
- TemplateControlCodeDomTreeGenerator.cs
- DbTransaction.cs
- CmsUtils.cs
- CompilerGeneratedAttribute.cs
- OutputCacheSettings.cs
- InvalidCommandTreeException.cs
- HelpInfo.cs
- CaseInsensitiveHashCodeProvider.cs
- TextHidden.cs
- ExpandCollapsePatternIdentifiers.cs
- AudioLevelUpdatedEventArgs.cs
- DataGridItem.cs
- KeyedHashAlgorithm.cs
- ServiceOperation.cs
- Operators.cs
- ClientCultureInfo.cs
- Semaphore.cs
- ProxyFragment.cs
- COM2Properties.cs
- ForeignConstraint.cs
- RoutedPropertyChangedEventArgs.cs
- RTLAwareMessageBox.cs
- WorkflowValidationFailedException.cs
- RichTextBox.cs
- CustomErrorsSectionWrapper.cs
- DependencyObjectCodeDomSerializer.cs
- DelayDesigner.cs
- WindowPattern.cs
- DataPagerField.cs
- BookmarkEventArgs.cs
- FlowLayoutPanelDesigner.cs
- HtmlInputText.cs