sysperfana/heapanalyser/Libraries/Engine/HeapLib/Cells/Descriptors/DescriptorAlgorithmBase.cs
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/heapanalyser/Libraries/Engine/HeapLib/Cells/Descriptors/DescriptorAlgorithmBase.cs Tue Jun 15 12:47:20 2010 +0300
@@ -0,0 +1,152 @@
+/*
+* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions are met:
+*
+* - Redistributions of source code must retain the above copyright notice,
+* this list of conditions and the following disclaimer.
+* - Redistributions in binary form must reproduce the above copyright notice,
+* this list of conditions and the following disclaimer in the documentation
+* and/or other materials provided with the distribution.
+* - Neither the name of Nokia Corporation nor the names of its contributors
+* may be used to endorse or promote products derived from this software
+* without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+* POSSIBILITY OF SUCH DAMAGE.
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using SymbianUtils.RawItems;
+using HeapLib.Statistics;
+
+namespace HeapLib.Cells.Descriptors
+{
+ public abstract class DescriptorAlgorithmBase
+ {
+ #region Constructors & destructor
+ protected DescriptorAlgorithmBase( HeapStatistics aStats )
+ {
+ iStats = aStats;
+ }
+ #endregion
+
+ #region Framework API
+ internal virtual bool IsDescriptor( HeapCell aCell, out DescriptorInfo aInfo )
+ {
+ aInfo = null;
+ iCell = aCell;
+ //
+ bool couldBeDescriptor = ( aCell.Symbol == null && RawItems.Count > 1 );
+ if ( couldBeDescriptor )
+ {
+ int payloadLength = PayloadLengthWhenCellIsDescriptor;
+ int possibleDescriptorLength = CalculatedDescriptorLength;
+ //
+ couldBeDescriptor = ( possibleDescriptorLength <= payloadLength );
+ //
+ if ( couldBeDescriptor )
+ {
+ // Need to make a descriptor info object just to get the type...
+ DescriptorInfo info = new DescriptorInfo( aCell );
+ couldBeDescriptor = ( info.Type != HeapCell.TDescriptorType.EUnknown );
+ }
+ }
+ //
+ return couldBeDescriptor;
+ }
+ #endregion
+
+ #region Properties
+ protected HeapCell Cell
+ {
+ get { return iCell; }
+ }
+
+ protected RawItemCollection RawItems
+ {
+ get { return Cell.RawItems; }
+ }
+
+ protected HeapStatistics Statistics
+ {
+ get { return iStats; }
+ }
+
+ protected int PayloadLengthWhenCellIsDescriptor
+ {
+ get
+ {
+ // Layout is:
+ //
+ // First DWORD:
+ //
+ // < 4 bits> Type
+ // <28 bits> Length
+ //
+ // Second DWORD:
+ //
+ // Max Length
+ //
+ // Reduce the size by 4 since we discard the descriptor length
+ int payloadLength = (int) Cell.PayloadLength - 4;
+ return payloadLength;
+ }
+ }
+
+ protected int CalculatedDescriptorLength
+ {
+ get
+ {
+ uint vTable = Cell.PossibleVTableAddress;
+ uint len = vTable & KDescriptorLengthMask;
+ return (int) len;
+ }
+ }
+
+ protected int CalculatedDescriptorMaxLength
+ {
+ get
+ {
+ System.Diagnostics.Debug.Assert( RawItems.Count >= 2 );
+ RawItem maxLenRI = Cell.RawItems[ 1 ];
+ int maxLength = (int) maxLenRI.Data;
+ return maxLength;
+ }
+ }
+ #endregion
+
+ #region Shared constants
+ protected const int KDescriptorRawItemOffsetAfterLengthAndType = 1;
+ protected const int KDescriptorTextMaxLength = 256;
+ protected const byte KDescriptorPaddingMagicCharacterValue = 0xa5;
+ protected const uint KDescriptorLengthMask = 0x00FFFFFF;
+ #endregion
+
+ #region Data members
+ private readonly HeapStatistics iStats;
+ private HeapCell iCell = new HeapCell();
+ #endregion
+ }
+}