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
- RandomNumberGenerator.cs
- TextBoxLine.cs
- Vector3DIndependentAnimationStorage.cs
- AppSettingsReader.cs
- DeclarativeCatalogPart.cs
- XmlCustomFormatter.cs
- MailHeaderInfo.cs
- PolicyException.cs
- DataGridViewRowCancelEventArgs.cs
- DataException.cs
- DetailsViewRow.cs
- IdentifierService.cs
- RandomNumberGenerator.cs
- SafeHandles.cs
- FtpWebRequest.cs
- RuntimeWrappedException.cs
- CompilerError.cs
- CustomCredentialPolicy.cs
- ContourSegment.cs
- HyperLinkField.cs
- DataTableMappingCollection.cs
- StringSource.cs
- NativeMethods.cs
- DecoratedNameAttribute.cs
- FieldBuilder.cs
- MethodSignatureGenerator.cs
- PageCatalogPart.cs
- PlainXmlDeserializer.cs
- PropertyInformationCollection.cs
- CalendarDateChangedEventArgs.cs
- MetaDataInfo.cs
- EntityDataSource.cs
- DecimalConverter.cs
- URLMembershipCondition.cs
- BamlLocalizationDictionary.cs
- PropertyGridCommands.cs
- MsmqAppDomainProtocolHandler.cs
- EntityTypeEmitter.cs
- WindowsRegion.cs
- VisualBasicImportReference.cs
- SerializationHelper.cs
- QueueAccessMode.cs
- DbDataAdapter.cs
- ImpersonationContext.cs
- ColumnHeaderConverter.cs
- XmlTypeMapping.cs
- CaseInsensitiveHashCodeProvider.cs
- OptimizedTemplateContent.cs
- HttpDebugHandler.cs
- StrongName.cs
- XmlWriterSettings.cs
- TableAdapterManagerNameHandler.cs
- SqlTypeSystemProvider.cs
- Frame.cs
- ResXResourceReader.cs
- XmlSchemaAttributeGroup.cs
- GradientStop.cs
- ArrangedElement.cs
- ReadOnlyCollection.cs
- Attributes.cs
- CodeDOMUtility.cs
- DataGridViewRowStateChangedEventArgs.cs
- BuildProvidersCompiler.cs
- DiscoveryDocument.cs
- UpdatePanelTrigger.cs
- EventDescriptorCollection.cs
- AutomationElementCollection.cs
- OdbcHandle.cs
- PasswordTextContainer.cs
- CompiledRegexRunnerFactory.cs
- SourceLocationProvider.cs
- UnionCodeGroup.cs
- SizeLimitedCache.cs
- HistoryEventArgs.cs
- AttachedPropertyBrowsableForChildrenAttribute.cs
- _ProxyRegBlob.cs
- Scene3D.cs
- ManagementException.cs
- Attachment.cs
- DbConnectionPool.cs
- HMAC.cs
- QueryCacheKey.cs
- PtsCache.cs
- ScriptingSectionGroup.cs
- Expr.cs
- StylusEventArgs.cs
- PEFileEvidenceFactory.cs
- IndicShape.cs
- ExternalFile.cs
- PolicyException.cs
- ConfigurationPermission.cs
- SoapIncludeAttribute.cs
- ImageCodecInfoPrivate.cs
- Literal.cs
- Rijndael.cs
- Fx.cs
- TextBoxBase.cs
- HotSpot.cs
- HwndAppCommandInputProvider.cs
- TCEAdapterGenerator.cs