Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / Orcas / SP / 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
- BCryptSafeHandles.cs
- XmlWriterSettings.cs
- BoolExpressionVisitors.cs
- TreeViewItemAutomationPeer.cs
- ServicePointManager.cs
- TabItemAutomationPeer.cs
- HelpProvider.cs
- SymmetricKeyWrap.cs
- _HelperAsyncResults.cs
- SharedPersonalizationStateInfo.cs
- HScrollProperties.cs
- MemberJoinTreeNode.cs
- Types.cs
- InternalConfigConfigurationFactory.cs
- BooleanSwitch.cs
- FieldAccessException.cs
- Component.cs
- WebPartZone.cs
- MonitoringDescriptionAttribute.cs
- AsyncOperationManager.cs
- MatrixAnimationBase.cs
- NumericUpDownAccelerationCollection.cs
- Point3DConverter.cs
- XmlSchemaComplexContent.cs
- InvalidContentTypeException.cs
- DesignTimeTemplateParser.cs
- ITextView.cs
- DefaultPrintController.cs
- SHA256.cs
- DeclarativeConditionsCollection.cs
- ProjectionCamera.cs
- StrokeNodeOperations.cs
- ViewBase.cs
- XamlReader.cs
- KeyGestureValueSerializer.cs
- ConvertBinder.cs
- RSAPKCS1SignatureFormatter.cs
- TextContainerChangedEventArgs.cs
- Metadata.cs
- ComEventsMethod.cs
- CommandLibraryHelper.cs
- XmlSchemaSequence.cs
- DateRangeEvent.cs
- ToolStripItemRenderEventArgs.cs
- SqlBooleanMismatchVisitor.cs
- GCHandleCookieTable.cs
- VScrollBar.cs
- FontStretchConverter.cs
- RequestQueue.cs
- MailMessage.cs
- FileChangesMonitor.cs
- SymLanguageType.cs
- InkCanvasAutomationPeer.cs
- PropertyInformationCollection.cs
- PropertyPathConverter.cs
- StandardToolWindows.cs
- ControlUtil.cs
- WebPartEditorOkVerb.cs
- ThreadLocal.cs
- FirstMatchCodeGroup.cs
- DetailsViewUpdateEventArgs.cs
- CompilerParameters.cs
- LocatorPart.cs
- ThreadPool.cs
- hresults.cs
- RichTextBox.cs
- SqlEnums.cs
- CompiledRegexRunner.cs
- PackageFilter.cs
- WebControl.cs
- ControlParameter.cs
- InstanceOwnerException.cs
- BufferedStream.cs
- PathGeometry.cs
- WebChannelFactory.cs
- DocumentViewerConstants.cs
- UndoManager.cs
- MethodRental.cs
- EditorBrowsableAttribute.cs
- PolyLineSegment.cs
- IfAction.cs
- Scene3D.cs
- SqlConnectionPoolGroupProviderInfo.cs
- StylusCollection.cs
- ItemDragEvent.cs
- PrimitiveType.cs
- CatalogPartCollection.cs
- COM2ColorConverter.cs
- counter.cs
- GraphicsPathIterator.cs
- Soap12FormatExtensions.cs
- ReceiveCompletedEventArgs.cs
- DataGridAddNewRow.cs
- RepeaterDesigner.cs
- HostExecutionContextManager.cs
- ObjectQueryExecutionPlan.cs
- ScriptModule.cs
- BStrWrapper.cs
- HttpHeaderCollection.cs
- Documentation.cs