Code:
/ 4.0 / 4.0 / untmp / 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.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- FacetDescription.cs
- BuildProvider.cs
- UICuesEvent.cs
- CodeGotoStatement.cs
- ExtendLockCommand.cs
- TextSelectionHighlightLayer.cs
- SmiTypedGetterSetter.cs
- SelectorItemAutomationPeer.cs
- httpapplicationstate.cs
- LexicalChunk.cs
- ArrayMergeHelper.cs
- UnsafePeerToPeerMethods.cs
- CompositionTarget.cs
- CollectionBase.cs
- HealthMonitoringSectionHelper.cs
- CodeDomExtensionMethods.cs
- Globals.cs
- FormCollection.cs
- SkewTransform.cs
- DataBindingCollection.cs
- InternalResources.cs
- SoapFault.cs
- SoapCodeExporter.cs
- ToolStripDropDownButton.cs
- AssociatedControlConverter.cs
- CopyCodeAction.cs
- BoolLiteral.cs
- Pkcs7Signer.cs
- NativeMethods.cs
- Point.cs
- DataControlButton.cs
- TextEditorSpelling.cs
- WebEventCodes.cs
- JsonObjectDataContract.cs
- Cell.cs
- XmlName.cs
- TextEvent.cs
- SwitchAttribute.cs
- NonSerializedAttribute.cs
- PerspectiveCamera.cs
- CollectionsUtil.cs
- ObjectDisposedException.cs
- StrokeNodeOperations2.cs
- RegexCapture.cs
- StructureChangedEventArgs.cs
- SemaphoreSecurity.cs
- SQLRoleProvider.cs
- PassportPrincipal.cs
- NoClickablePointException.cs
- QueryableFilterUserControl.cs
- Calendar.cs
- CompiledRegexRunnerFactory.cs
- ConversionHelper.cs
- DataGridViewRowsRemovedEventArgs.cs
- DoubleStorage.cs
- ContentPresenter.cs
- QueueAccessMode.cs
- DataBindingExpressionBuilder.cs
- StrongNameKeyPair.cs
- FormattedText.cs
- BaseProcessProtocolHandler.cs
- ConnectionStringSettingsCollection.cs
- PrimitiveXmlSerializers.cs
- PackagingUtilities.cs
- Point3D.cs
- RawStylusInputCustomDataList.cs
- DynamicDocumentPaginator.cs
- CommandID.cs
- StructuredType.cs
- ReferencedCollectionType.cs
- _SSPISessionCache.cs
- CFGGrammar.cs
- PtsContext.cs
- ToolStripDropDown.cs
- ApplicationDirectoryMembershipCondition.cs
- XamlClipboardData.cs
- CharacterShapingProperties.cs
- NamedPipeTransportManager.cs
- RectValueSerializer.cs
- SimpleApplicationHost.cs
- TreeNodeStyleCollection.cs
- DataGridViewCellEventArgs.cs
- FileSystemEnumerable.cs
- ArrayHelper.cs
- TrustManagerPromptUI.cs
- Choices.cs
- RecordBuilder.cs
- NoClickablePointException.cs
- SQLInt32.cs
- IndexerNameAttribute.cs
- ScriptResourceHandler.cs
- DetailsViewCommandEventArgs.cs
- DispatchProxy.cs
- InternalDispatchObject.cs
- XmlNamespaceManager.cs
- LinkDescriptor.cs
- EventLogRecord.cs
- RowVisual.cs
- PrinterUnitConvert.cs
- WindowInteractionStateTracker.cs