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
- CardSpaceException.cs
- ComplexBindingPropertiesAttribute.cs
- AppDomainUnloadedException.cs
- Panel.cs
- _HTTPDateParse.cs
- Int32Rect.cs
- LinqDataSourceContextEventArgs.cs
- EncryptedData.cs
- CommandManager.cs
- Mappings.cs
- PrinterSettings.cs
- XmlDictionaryReader.cs
- MatrixCamera.cs
- NavigateEvent.cs
- OleDbParameterCollection.cs
- SchemaTypeEmitter.cs
- MarshalByValueComponent.cs
- Binding.cs
- ObjectStateFormatter.cs
- UiaCoreTypesApi.cs
- ServiceDebugBehavior.cs
- ArrayElementGridEntry.cs
- WebConvert.cs
- AnnotationAuthorChangedEventArgs.cs
- MsmqPoisonMessageException.cs
- SchemaInfo.cs
- ValueType.cs
- SocketInformation.cs
- ConfigurationException.cs
- ToolStripSettings.cs
- Camera.cs
- XMLSyntaxException.cs
- SafeLocalAllocation.cs
- Nodes.cs
- BamlReader.cs
- MediaTimeline.cs
- BamlLocalizer.cs
- ResponseBodyWriter.cs
- AnnotationResourceCollection.cs
- DetailsViewCommandEventArgs.cs
- CodeConstructor.cs
- XmlDataSourceView.cs
- FixedSOMPageElement.cs
- Int16Storage.cs
- WebBrowserUriTypeConverter.cs
- IPCCacheManager.cs
- GridProviderWrapper.cs
- IssuedTokenParametersEndpointAddressElement.cs
- ISessionStateStore.cs
- CustomValidator.cs
- ToolStripProgressBar.cs
- TypedRowHandler.cs
- EntityDataSourceValidationException.cs
- SqlBooleanMismatchVisitor.cs
- CompoundFileDeflateTransform.cs
- XmlNamespaceDeclarationsAttribute.cs
- EditBehavior.cs
- RadioButtonList.cs
- XmlAutoDetectWriter.cs
- ImportContext.cs
- DependencyPropertyKind.cs
- BinaryCommonClasses.cs
- HttpRequestBase.cs
- ExpressionConverter.cs
- ADConnectionHelper.cs
- XmlNamedNodeMap.cs
- XmlSchemaCollection.cs
- SupportingTokenProviderSpecification.cs
- TextPatternIdentifiers.cs
- glyphs.cs
- xmlsaver.cs
- Help.cs
- SequentialWorkflowRootDesigner.cs
- DiffuseMaterial.cs
- RequiredFieldValidator.cs
- exports.cs
- BlurBitmapEffect.cs
- Overlapped.cs
- PermissionSetTriple.cs
- ApplicationException.cs
- DesignerPainter.cs
- NullExtension.cs
- ControlPaint.cs
- Compiler.cs
- TableCellAutomationPeer.cs
- ThrowHelper.cs
- log.cs
- PropertyBuilder.cs
- ImageSource.cs
- MetadataCollection.cs
- CreateUserWizardStep.cs
- SqlDataReaderSmi.cs
- Label.cs
- PageContent.cs
- Perspective.cs
- DocComment.cs
- Journal.cs
- EdmPropertyAttribute.cs
- ProviderSettings.cs
- Application.cs