diff -r 000000000000 -r 818e61de6cd1 crashanalysercmd/PerfToolsSharedLibraries/Engine/SymbolLib/Generic/Engine/GenericSymbolEngine.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/crashanalysercmd/PerfToolsSharedLibraries/Engine/SymbolLib/Generic/Engine/GenericSymbolEngine.cs Thu Feb 11 15:50:58 2010 +0200 @@ -0,0 +1,244 @@ +/* +* 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.Text; +using System.Threading; +using System.Collections.Generic; +using SymbianUtils; +using SymbianUtils.Range; +using SymbianUtils.Tracer; + +namespace SymbolLib.Generics +{ + public abstract class GenericSymbolEngine : IGenericSymbolCollectionLookupInterface, IGenericSymbolCollectionStatisticsInterface, IEnumerable, ITracer + { + #region Constructors + protected internal GenericSymbolEngine( ITracer aTracer ) + { + iTracer = aTracer; + } + #endregion + + #region Framework API + public virtual void ClearTags() + { + lock ( this ) + { + foreach ( GenericSymbolCollection collection in this ) + { + collection.ClearTag(); + } + } + } + + public virtual void SaveTaggedCollections( string aFileName ) + { + using ( StreamWriter writer = new StreamWriter( aFileName, false ) ) + { + lock ( this ) + { + foreach ( GenericSymbolCollection collection in this ) + { + if ( collection.Tagged ) + { + collection.WriteToStream( writer ); + } + } + } + } + } + + public abstract void Reset(); + + public abstract bool IsReady { get; } + + public abstract bool IsLoaded( string aFileName ); + + public abstract GenericSymbolCollection this[ int aIndex ] + { + get; + } + + public abstract AddressRange Range { get; } + + internal abstract void UnloadUntagged(); + #endregion + + #region From IEnumerable + IEnumerator IEnumerable.GetEnumerator() + { + return new GenericSymbolEngineEnumerator( this ); + } + + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() + { + return new GenericSymbolEngineEnumerator( this ); + } + #endregion + + #region From IGenericSymbolCollectionStatisticsInterface + public int NumberOfEntries + { + get + { + int count = 0; + // + lock ( this ) + { + foreach ( GenericSymbolCollection collection in this ) + { + count += collection.Count; + } + } + // + return count; + } + } + + public abstract int NumberOfCollections + { + get; + } + #endregion + + #region From IGenericSymbolCollectionLookupInterface + public GenericSymbolCollection[] CollectionsByHostBinarySearch( string aFileName ) + { + string searchingFor = aFileName.ToUpper(); + // + List ret = new List(); + // + lock ( this ) + { + for( int i=NumberOfCollections - 1; i>=0; i-- ) + { + GenericSymbolCollection collection = this[ i ]; + string hostBinName = collection.HostBinaryFileName.ToUpper(); + // + if ( hostBinName.Contains( searchingFor ) ) + { + ret.Add( collection ); + } + } + } + // + return ret.ToArray(); + } + + public GenericSymbol EntryByAddress( long aAddress ) + { + GenericSymbolCollection notUsed = null; + return EntryByAddress( aAddress, ref notUsed ); + } + + public GenericSymbol EntryByAddress( long aAddress, ref GenericSymbolCollection aCollection ) + { + GenericSymbol symbol = null; + aCollection = null; + // + lock ( this ) + { + // Debugging code + int debug = 0; + if ( debug != 0 ) + { + int count = NumberOfCollections; + for ( int i = 0; i < count; i++ ) + { + GenericSymbolCollection collection = this[ i ]; + string line = string.Empty; + if ( collection.AddressFallsWithinRange( aAddress ) ) + { + line = i.ToString( "d8" ) + " * [" + collection.AddressRangeStart.ToString( "x8" ) + " - " + collection.AddressRangeEnd.ToString( "x8" ) + "] " + " [" + ( collection.HostBinaryExists ? "Exists] " : "Notfnd] " ) + collection.HostBinaryFileName; + } + else + { + line = i.ToString( "d8" ) + " [" + collection.AddressRangeStart.ToString( "x8" ) + " - " + collection.AddressRangeEnd.ToString( "x8" ) + "] " + " [" + ( collection.HostBinaryExists ? "Exists] " : "Notfnd] " ) + collection.HostBinaryFileName; + } + System.Diagnostics.Debug.WriteLine( line ); + } + } + + // Production search code + if ( Range.Contains( aAddress ) ) + { + // Search for a suitable symbol entry that matches aAddress + int count = NumberOfCollections; + for ( int i = 0; i < count; i++ ) + { + GenericSymbolCollection collection = this[ i ]; + if ( collection.AddressFallsWithinRange( aAddress ) ) + { + // Should be able to locate a symbol within this collection... + symbol = collection.SymbolForAddress( aAddress ); + + aCollection = collection; + aCollection.Tagged = true; + break; + } + } + } + } + // + return symbol; + } + + public GenericSymbolCollection CollectionByAddress( long aAddress ) + { + GenericSymbolCollection ret = null; + + lock ( this ) + { + // Search for a suitable symbol entry that matches aAddress + int count = NumberOfCollections; + for ( int i = 0; i < count; i++ ) + { + GenericSymbolCollection collection = this[ i ]; + if ( collection.AddressFallsWithinRange( aAddress ) ) + { + ret = collection; + ret.Tagged = true; + break; + } + } + } + // + return ret; + } + #endregion + + #region ITracer Members + public void Trace( string aMessage ) + { + if ( iTracer != null ) + { + iTracer.Trace( aMessage ); + } + } + + public void Trace( string aFormat, params object[] aParams ) + { + Trace( string.Format( aFormat, aParams ) ); + } + #endregion + + #region Data members + private readonly ITracer iTracer; + #endregion + } +}