diff -r 000000000000 -r 818e61de6cd1 crashanalysercmd/PerfToolsSharedLibraries/Engine/SymbolLib/Generic/Collection/GenericSymbolCollection.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/crashanalysercmd/PerfToolsSharedLibraries/Engine/SymbolLib/Generic/Collection/GenericSymbolCollection.cs Thu Feb 11 15:50:58 2010 +0200 @@ -0,0 +1,311 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ +using System; +using System.IO; +using System.Collections; +using System.Collections.Generic; +using SymbolLib.Utils; +using SymbianUtils.Range; + +namespace SymbolLib.Generics +{ + public abstract class GenericSymbolCollection : IEnumerable, IComparable + { + #region Construct & destruct + protected GenericSymbolCollection( string aHostBinaryFileName ) + { + HostBinaryFileName = aHostBinaryFileName; + } + #endregion + + #region Virtual API + public virtual void ClearTag() + { + Tagged = false; + } + + public virtual void WriteToStream( StreamWriter aWriter ) + { + // First write the binary name + aWriter.WriteLine( string.Empty ); + aWriter.WriteLine( "From " + HostBinaryFileName ); + aWriter.WriteLine( string.Empty ); + + foreach ( GenericSymbol symbol in this ) + { + aWriter.WriteLine( symbol.ToStringForStream() ); + } + } + #endregion + + #region Abstract API - methods + public abstract void Add( GenericSymbolEngine aEngine, GenericSymbol aSymbol ); + + public abstract void Remove( GenericSymbol aSymbol ); + + public abstract void RemoveAt( int aIndex ); + + public abstract IEnumerator CreateEnumerator(); + + public abstract IEnumerator CreateGenericEnumerator(); + + public abstract GenericSymbol SymbolForAddress( long aAddress ); + #endregion + + #region Abstract API - properties + public abstract int Count + { + get; + } + + public abstract GenericSymbol this[ int aIndex ] + { + get; + } + + public abstract void Sort(); + #endregion + + #region API + public bool AddressFallsWithinRange( long aAddress ) + { + bool found = false; + // + if ( this.Count == 1 && this[ 0 ].IsUnknownSymbol ) + { + int x = 0; + x++; + } + + if ( aAddress > 0 ) + { + if ( iAddresses == null ) + { + RebuildAddressRange(); + } + // + found = iAddresses.IsWithinRange( aAddress ); + } + // + return found; + } + +#if DEBUG + public void Dump() + { + int i = 0; + string line = string.Empty; + foreach ( GenericSymbol entry in this ) + { + line = i.ToString( "d8" ) + " [" + entry.Address.ToString( "x8" ) + "-" + entry.EndAddress.ToString( "x8" ) + "] " + entry.Symbol.ToString(); + System.Diagnostics.Debug.WriteLine( line ); + i++; + } + } + + public void Dump( long aAddress ) + { + int i = 0; + string line = string.Empty; + foreach ( GenericSymbol entry in this ) + { + if ( entry.FallsWithinDomain( aAddress ) ) + { + line = i.ToString( "d8" ) + " * [" + entry.Address.ToString( "x8" ) + "-" + entry.EndAddress.ToString( "x8" ) + "] " + entry.Symbol.ToString(); + } + else + { + line = i.ToString( "d8" ) + " [" + entry.Address.ToString( "x8" ) + "-" + entry.EndAddress.ToString( "x8" ) + "] " + entry.Symbol.ToString(); + } + System.Diagnostics.Debug.WriteLine( line ); + i++; + } + } +#endif + #endregion + + #region Symbol Properties + public GenericSymbol FirstSymbol + { + get + { + GenericSymbol ret = null; + if ( Count > 0 ) + { + ret = this[ 0 ]; + } + return ret; + } + } + + public GenericSymbol LastSymbol + { + get + { + GenericSymbol ret = null; + if ( Count > 0 ) + { + ret = this[ Count - 1 ]; + } + return ret; + } + } + #endregion + + #region Misc Properties + public bool Tagged + { + get { return iTagged; } + set { iTagged = value; } + } + + public long BaseAddress + { + get { return iBaseAddress; } + internal set { iBaseAddress = value; } + } + + public string HostBinaryFileName + { + get { return iHostBinaryFileName; } + set + { + System.Diagnostics.Debug.Assert( !value.ToLower().Contains( ".map" ) ); + iHostBinaryFileName = value; + } + } + + public bool HostBinaryExists + { + get { return File.Exists( HostBinaryFileName ); } + } + + public virtual long AddressRangeStart + { + get + { + long ret = 0; + // + if ( Count > 0 ) + { + ret = FirstSymbol.Address; + } + // + return ret; + } + } + + public virtual long AddressRangeEnd + { + get + { + long ret = 0xffffffff; + // + if ( Count > 0 ) + { + ret = LastSymbol.EndAddress; + } + // + return ret; + } + } + + public virtual AddressRange AddressRange + { + get { return new AddressRange( AddressRangeStart, AddressRangeEnd ); } + } + + public string SourceFile + { + get { return iSourceFile; } + internal set { iSourceFile = value; } + } + #endregion + + #region Internal methods + protected void RebuildAddressRange() + { + iAddresses = new SymbolAddressRange( this ); + } + #endregion + + #region From IEnumerable + IEnumerator IEnumerable.GetEnumerator() + { + return CreateEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return CreateGenericEnumerator(); + } + #endregion + + #region From IComparable + public int CompareTo( GenericSymbolCollection aOther ) + { + int ret = 1; + // + if ( aOther != null ) + { + ret = string.Compare( HostBinaryFileName, aOther.HostBinaryFileName, true ); + // + if ( aOther is GenericSymbolCollection ) + { + GenericSymbolCollection otherCol = (GenericSymbolCollection) aOther; + // + if ( BaseAddress == otherCol.BaseAddress ) + { + ret = 0; + } + else if ( BaseAddress > otherCol.BaseAddress ) + { + ret = 1; + } + else + { + ret = -1; + } + } + } + + // Debug check + if ( aOther == this ) + { + System.Diagnostics.Debug.Assert( ret == 0 ); + } + // + return ret; + } + #endregion + + #region From System.Object + public override string ToString() + { + return string.Format( "{0} {1}", AddressRange, iHostBinaryFileName ); + } + #endregion + + #region Data members + private bool iTagged = false; + private long iBaseAddress = 0; + private string iHostBinaryFileName = string.Empty; + private string iSourceFile = string.Empty; + private SymbolAddressRange iAddresses = null; + #endregion + } +}