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
- OleDbConnectionPoolGroupProviderInfo.cs
- WinInetCache.cs
- ClientBuildManager.cs
- BindingCompleteEventArgs.cs
- AppDomainResourcePerfCounters.cs
- ArraySegment.cs
- ComPlusInstanceContextInitializer.cs
- ChannelFactory.cs
- ScriptManager.cs
- CalendarDateChangedEventArgs.cs
- UrlRoutingHandler.cs
- BaseDataListComponentEditor.cs
- PageBreakRecord.cs
- CodeDirectionExpression.cs
- ResourceContainer.cs
- filewebresponse.cs
- ToolStripMenuItemCodeDomSerializer.cs
- Grant.cs
- IntSecurity.cs
- PartEditor.cs
- DictionaryMarkupSerializer.cs
- Privilege.cs
- GlyphTypeface.cs
- HMAC.cs
- ReadOnlyNameValueCollection.cs
- OdbcConnectionPoolProviderInfo.cs
- DataGridViewRowsRemovedEventArgs.cs
- FloatAverageAggregationOperator.cs
- WebBrowserDocumentCompletedEventHandler.cs
- PropertyGeneratedEventArgs.cs
- ServiceMetadataPublishingElement.cs
- AutomationElement.cs
- SiteMapDataSource.cs
- DetailsViewCommandEventArgs.cs
- MobileResource.cs
- ResolveNameEventArgs.cs
- Crc32.cs
- XamlSerializer.cs
- HandledMouseEvent.cs
- wgx_commands.cs
- SplineQuaternionKeyFrame.cs
- SqlClientPermission.cs
- CaseInsensitiveComparer.cs
- DataTableTypeConverter.cs
- Utils.cs
- WebPartTransformerCollection.cs
- HostedAspNetEnvironment.cs
- WebScriptMetadataFormatter.cs
- DataGridViewColumnDesigner.cs
- JournalEntryStack.cs
- ConsoleCancelEventArgs.cs
- SoapIncludeAttribute.cs
- GroupByQueryOperator.cs
- Pen.cs
- ThreadAttributes.cs
- ServiceDesigner.cs
- FileLevelControlBuilderAttribute.cs
- HostedAspNetEnvironment.cs
- NameNode.cs
- FormViewDeletedEventArgs.cs
- ToolStripPanelCell.cs
- MemberAccessException.cs
- CodeStatementCollection.cs
- RelationshipFixer.cs
- DrawingAttributes.cs
- Fx.cs
- ModelFactory.cs
- ConstraintStruct.cs
- IPHostEntry.cs
- OLEDB_Enum.cs
- LoadedOrUnloadedOperation.cs
- ApplicationSettingsBase.cs
- MetabaseServerConfig.cs
- DataView.cs
- _HeaderInfo.cs
- TableSectionStyle.cs
- CapabilitiesState.cs
- ConfigurationSection.cs
- TypeInitializationException.cs
- MetadataProperty.cs
- GlyphsSerializer.cs
- DataGridTextBox.cs
- NetworkCredential.cs
- PeerCollaborationPermission.cs
- RegexParser.cs
- Constants.cs
- BinaryObjectReader.cs
- ByteStreamMessageEncoder.cs
- ScheduleChanges.cs
- ClrProviderManifest.cs
- WebPart.cs
- __TransparentProxy.cs
- RuleSettingsCollection.cs
- DocumentSchemaValidator.cs
- NameValueSectionHandler.cs
- DataGridViewIntLinkedList.cs
- DataViewManagerListItemTypeDescriptor.cs
- SizeAnimationUsingKeyFrames.cs
- DeploymentExceptionMapper.cs
- QuerySafeNavigator.cs