diff -r d27dfa8884ad -r da2cedce4920 analyzetool/dynamicmemoryhook/src/analyzetooleventhandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/analyzetool/dynamicmemoryhook/src/analyzetooleventhandler.cpp Tue May 25 14:22:58 2010 +0300 @@ -0,0 +1,230 @@ +/* +* 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: Definitions for the class CLibraryEventHandler. +* +*/ + + +// INCLUDE FILES +#include "atlog.h" +#include "analyzetooleventhandler.h" +#include "analyzetooleventhandlernotifier.h" +#include "analyzetoolmemoryallocator.h" +#include "analyzetoolfastlog.h" + +// ----------------------------------------------------------------------------- +// CLibraryEventHandler::~CLibraryEventHandler() +// Destructor. +// ----------------------------------------------------------------------------- +// +CLibraryEventHandler::~CLibraryEventHandler() + { + LOGSTR1( "ATMH CLibraryEventHandler::~CLibraryEventHandler()" ); + Cancel(); + } + +// ----------------------------------------------------------------------------- +// CLibraryEventHandler::RunL() +// Process active object's task +// ----------------------------------------------------------------------------- +// +void CLibraryEventHandler::RunL() + { + LOGSTR1( "ATMH CLibraryEventHandler::RunL()" ); + + if ( KErrNone != iStatus.Int() ) + { + LOGSTR2( "ATMH RunL error: %i", iStatus.Int() ); + return; + } + // Acquire the mutex + iMutex.Wait(); + + // Check that this is observed process + if ( iLibraryInfo.iEventType == TLibraryEventInfo::ELibraryAdded ) + { + LOGSTR1( "ATMH CLibraryEventHandler::RunL() - TLibraryEventInfo::ELibraryAdded" ); + if ( iLibraryInfo.iProcessId == iProcessId ) + { + TInt error( KErrNone ); + + // Log library load event. + if ( iLogOption == EATLogToTraceFast ) + { + LOGSTR1( "ATMH CLibraryEventHandler::RunL() - ATFastLog.LogDllLoaded() " ); + ATFastLogDllLoaded( iProcessId, + iLibraryInfo.iLibraryName, + iLibraryInfo.iRunAddress, + iLibraryInfo.iRunAddress + iLibraryInfo.iSize ); + } + else + { + LOGSTR1( "ATMH CLibraryEventHandler::RunL() - iStorageServer.LogDllLoaded() " ); + error = iStorageServer.LogDllLoaded( + iLibraryInfo.iLibraryName, + iLibraryInfo.iRunAddress, + iLibraryInfo.iRunAddress + iLibraryInfo.iSize ); + LOGSTR2( "ATMH StorageServer error: %i", error ); + } + if ( KErrNone == error ) + { + iCodeblocks.Append( TCodeblock( iLibraryInfo.iRunAddress, + iLibraryInfo.iSize, + iLibraryInfo.iLibraryName ) ); + } + } + } + else if ( iLibraryInfo.iEventType == TLibraryEventInfo::ELibraryRemoved ) + { + LOGSTR1( "ATMH CLibraryEventHandler::RunL() - TLibraryEventInfo::ELibraryRemoved " ); + TInt count = iCodeblocks.Count(); + LOGSTR2( "ATMH count of code blocks: %i", count ); + for ( TInt i = 0; i < count; i++ ) + { + if ( iCodeblocks[ i ].Match( iLibraryInfo.iLibraryName ) ) + { + TBuf8 libraryName; + libraryName.Copy( iLibraryInfo.iLibraryName ); + + // Log library unloaded event + if ( iLogOption == EATLogToTraceFast ) + { + LOGSTR1( "ATMH CLibraryEventHandler::RunL() - ATFastLogDllUnloaded() " ); + ATFastLogDllUnloaded( iProcessId, + libraryName, + iLibraryInfo.iRunAddress, + iLibraryInfo.iRunAddress + iLibraryInfo.iSize ); + } + else + { + LOGSTR1( "ATMH CLibraryEventHandler::RunL() - iStorageServer.LogDllUnloaded() " ); + #ifdef LOGGING_ENABLED + TInt error = iStorageServer.LogDllUnloaded( + libraryName/*iLibraryInfo.iLibraryName*/, + iLibraryInfo.iRunAddress, + iLibraryInfo.iRunAddress + iLibraryInfo.iSize ); + + LOGSTR2( "ATMH StorageServer error: %i", error ); + #else + iStorageServer.LogDllUnloaded( + libraryName/*iLibraryInfo.iLibraryName*/, + iLibraryInfo.iRunAddress, + iLibraryInfo.iRunAddress + iLibraryInfo.iSize ); + #endif + } + iCodeblocks.Remove( i ); + break; + } + } + } + else if ( iLibraryInfo.iEventType == TLibraryEventInfo::EKillThread ) + { + LOGSTR1( "ATMH CLibraryEventHandler::RunL() - TLibraryEventInfo::EKillThread" ); + + iNotifier.RemoveKilledThread( iLibraryInfo.iThreadId ); + } + + Start(); + + // Release the mutex + iMutex.Signal(); + } + +// ----------------------------------------------------------------------------- +// CLibraryEventHandler::DoCancel() +// Cancels active object's task +// ----------------------------------------------------------------------------- +// +void CLibraryEventHandler::DoCancel() + { + LOGSTR1( "ATMH CLibraryEventHandler::DoCancel()" ); + // Cancel the subscription of the library events + if ( IsActive() ) + { + iStarted = EFalse; + + iAnalyzeTool.CancelLibraryEvent(); + } + } + +// ----------------------------------------------------------------------------- +// CLibraryEventHandler::Start() +// Creates CActiveScheduler and variables for the child thread +// ----------------------------------------------------------------------------- +// +void CLibraryEventHandler::Start() + { + LOGSTR1( "ATMH CLibraryEventHandler::Start()" ); + + // Acquire the mutex + iMutex.Wait(); + + if ( !IsAdded() ) + { + CActiveScheduler::Add( this ); + } + + // Cancel current subscribetion + if ( IsActive() ) + { + iStarted = EFalse; + Cancel(); + } + + iStatus = KErrNone; + iAnalyzeTool.LibraryEvent( iStatus, iLibraryInfo ); + SetActive(); + + iStarted = ETrue; + // Release the mutex + iMutex.Signal(); + } + +// ----------------------------------------------------------------------------- +// CLibraryEventHandler::CLibraryEventHandler() +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CLibraryEventHandler::CLibraryEventHandler( RAnalyzeTool& aAnalyzeTool, + RArray& aCodeblocks, RATStorageServer& aStorageServer, + TUint aProcessId, RMutex& aMutex, + MAnalyzeToolEventhandlerNotifier& aNotifier, + TUint32 aLogOption ) + : CActive( EPriorityNormal ), + iAnalyzeTool( aAnalyzeTool ), + iCodeblocks( aCodeblocks ), + iStorageServer( aStorageServer ), + iProcessId( aProcessId ), + iMutex( aMutex ), + iStarted( EFalse ), + iNotifier( aNotifier ), + iLogOption( aLogOption ) + { + LOGSTR1( "ATMH CLibraryEventHandler::CLibraryEventHandler()" ); + } + +// ----------------------------------------------------------------------------- +// CLibraryEventHandler::IsStarted() +// Returns eventhandler's state. +// ----------------------------------------------------------------------------- +// +TBool CLibraryEventHandler::IsStarted() + { + LOGSTR2( "ATMH CLibraryEventHandler::IsStarted(%i)", iStarted ); + + return iStarted; + } + +// End of File