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
- AuthenticationManager.cs
- xmlformatgeneratorstatics.cs
- SimpleType.cs
- DataControlImageButton.cs
- CellCreator.cs
- EdmFunctionAttribute.cs
- Transform3DGroup.cs
- codemethodreferenceexpression.cs
- SafeHandle.cs
- Formatter.cs
- ComplexPropertyEntry.cs
- PointAnimationBase.cs
- MultitargetingHelpers.cs
- CustomBinding.cs
- XslTransform.cs
- ObjectStateManager.cs
- HtmlPageAdapter.cs
- ListViewContainer.cs
- UiaCoreApi.cs
- SchemaImporterExtensionsSection.cs
- __TransparentProxy.cs
- DecimalConstantAttribute.cs
- PinProtectionHelper.cs
- NavigatorOutput.cs
- BitmapCodecInfoInternal.cs
- SimpleWebHandlerParser.cs
- HtmlListAdapter.cs
- Context.cs
- SystemUnicastIPAddressInformation.cs
- GridViewRow.cs
- SamlAudienceRestrictionCondition.cs
- ConnectionStringsExpressionBuilder.cs
- ToolStripContainer.cs
- WebPartTransformer.cs
- WebPartConnectionsEventArgs.cs
- Wildcard.cs
- DesignerTransaction.cs
- CompiledIdentityConstraint.cs
- ZoneIdentityPermission.cs
- WebPartTransformer.cs
- DesignerActionItemCollection.cs
- ConstrainedDataObject.cs
- ToolStripRenderEventArgs.cs
- ProfileInfo.cs
- LogWriteRestartAreaAsyncResult.cs
- ImageListStreamer.cs
- CommandValueSerializer.cs
- X509CertificateChain.cs
- HttpCachePolicy.cs
- ClientType.cs
- TemplateParser.cs
- XmlTypeMapping.cs
- FormsAuthenticationUser.cs
- XsltSettings.cs
- SequentialWorkflowRootDesigner.cs
- DiagnosticTraceSource.cs
- WorkflowViewStateService.cs
- EntityDataSourceSelectedEventArgs.cs
- SchemaCollectionCompiler.cs
- ButtonPopupAdapter.cs
- MembershipPasswordException.cs
- SurrogateSelector.cs
- ConfigsHelper.cs
- DeclarativeConditionsCollection.cs
- ShapeTypeface.cs
- InvalidCommandTreeException.cs
- FlowPosition.cs
- RawStylusInput.cs
- DebuggerAttributes.cs
- MimeTypePropertyAttribute.cs
- ListDictionaryInternal.cs
- ToolStripItemRenderEventArgs.cs
- ExpressionVisitor.cs
- BindingList.cs
- UInt32.cs
- StateRuntime.cs
- UnicastIPAddressInformationCollection.cs
- ParameterModifier.cs
- SiteMembershipCondition.cs
- DependencyObjectCodeDomSerializer.cs
- Misc.cs
- HTTPRemotingHandler.cs
- CodeTypeDelegate.cs
- XsdSchemaFileEditor.cs
- RequestUriProcessor.cs
- RelatedPropertyManager.cs
- BuilderElements.cs
- RangeValidator.cs
- ListDataHelper.cs
- Brushes.cs
- DataGridViewCell.cs
- Panel.cs
- VirtualPath.cs
- SQLGuidStorage.cs
- EntityCollection.cs
- RemotingException.cs
- SelectedDatesCollection.cs
- CompositeCollection.cs
- UnsafeNativeMethods.cs
- PointHitTestParameters.cs