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
- TrackingExtract.cs
- RtType.cs
- SelectionRangeConverter.cs
- DESCryptoServiceProvider.cs
- ControlCachePolicy.cs
- ValidationResult.cs
- ApplicationDirectory.cs
- Util.cs
- PathTooLongException.cs
- SafeRightsManagementQueryHandle.cs
- DataAdapter.cs
- WindowsIdentity.cs
- UnknownBitmapEncoder.cs
- TextAnchor.cs
- CodePageEncoding.cs
- Vector3DCollection.cs
- IndicFontClient.cs
- RegexStringValidatorAttribute.cs
- CachedTypeface.cs
- ManagedFilter.cs
- ComNativeDescriptor.cs
- Membership.cs
- Utils.cs
- DeviceOverridableAttribute.cs
- HtmlTextArea.cs
- TaiwanCalendar.cs
- WorkflowViewElement.cs
- SchemaElementLookUpTable.cs
- Parameter.cs
- RuntimeConfigLKG.cs
- SEHException.cs
- StartUpEventArgs.cs
- Tuple.cs
- EdmMember.cs
- ProcessProtocolHandler.cs
- InputProviderSite.cs
- ResourceReferenceKeyNotFoundException.cs
- DataGridViewColumn.cs
- GetPageCompletedEventArgs.cs
- SafeReversePInvokeHandle.cs
- PresentationAppDomainManager.cs
- XmlCharCheckingWriter.cs
- RtfToXamlReader.cs
- Decimal.cs
- NativeMethods.cs
- CookielessHelper.cs
- Cursors.cs
- ControlCachePolicy.cs
- QueryReaderSettings.cs
- ToolStripActionList.cs
- FixedFindEngine.cs
- ConnectionPoolManager.cs
- prompt.cs
- WorkerRequest.cs
- GenericNameHandler.cs
- Base64Encoder.cs
- ConfigurationManagerInternalFactory.cs
- SelectionPatternIdentifiers.cs
- ApplyImportsAction.cs
- Compiler.cs
- AutoGeneratedFieldProperties.cs
- Canvas.cs
- RequestSecurityToken.cs
- DesignTimeResourceProviderFactoryAttribute.cs
- DataFormats.cs
- TextFormatter.cs
- DesignerCatalogPartChrome.cs
- KeyedHashAlgorithm.cs
- SerializerWriterEventHandlers.cs
- ResourceDictionaryCollection.cs
- NavigationPropertyEmitter.cs
- GradientStop.cs
- PolyLineSegment.cs
- FontFaceLayoutInfo.cs
- StandardCommands.cs
- XPathNavigatorReader.cs
- EndPoint.cs
- XsdDateTime.cs
- XmlSchemaNotation.cs
- SelectionManager.cs
- TdsRecordBufferSetter.cs
- Point3DKeyFrameCollection.cs
- SQLBytesStorage.cs
- Control.cs
- SharedStatics.cs
- FormatSettings.cs
- VectorAnimationUsingKeyFrames.cs
- HScrollProperties.cs
- basevalidator.cs
- DynamicResourceExtensionConverter.cs
- CommandTreeTypeHelper.cs
- DataServiceConfiguration.cs
- LowerCaseStringConverter.cs
- AppModelKnownContentFactory.cs
- FaultCode.cs
- LogicalExpr.cs
- DataGridViewCellCollection.cs
- ExceptionHandler.cs
- FunctionNode.cs
- NullableLongSumAggregationOperator.cs