piprofiler/plugins/GeneralsPlugin/src/IttEventHandler.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 27 May 2010 14:26:55 +0300
changeset 22 a009639409f5
permissions -rw-r--r--
Revision: 201021 Kit: 2010121

/*
* 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:  Event based ITT sampler skeleton copypasted from MemoryEventHandler.cpp
*
*/

#include <e32def.h>
#include <e32cmn.h>
#include <arm.h>
#include <kernel.h>
#include <kern_priv.h>
#include <nk_trace.h>

#include "IttEventHandler.h"

/*
 * Constructor
 * 
 * @param DProfilerSampleBuffer*    pointer to sample buffer
 */
DIttEventHandler::DIttEventHandler(DProfilerSampleBuffer* aSampleBuffer, TProfilerGppSamplerData* aGppSamplerDataIn)
    :   DKernelEventHandler(EventHandler, this),
        iSampleBuffer(aSampleBuffer),
        iSampleDescriptor(&(this->iSample[1]),0,KITTBufferSize),
        gppSamplerData(aGppSamplerDataIn)
    {
    //Kern::Printf("DIttEventHandler::DIttEventHandler()");

    }

/*
 * DIttEventHandler::Create()
 */
TInt DIttEventHandler::Create()
    {
    Kern::Printf("DIttEventHandler::Create()");

    TInt err(Kern::MutexCreate(iLock, _L("IttEventHandlerLock"), KMutexOrdDebug));
    if (err != KErrNone)
        return err;
    
    return Add();
    }

/*
 * Destructor
 */
DIttEventHandler::~DIttEventHandler()
    {
    //Kern::Printf("DIttEventHandler::~DIttEventHandler()");

    if (iLock)
        iLock->Close(NULL);
    }


TInt DIttEventHandler::Start()
    {
    //Kern::Printf("DIttEventHandler::Start()");

    iTracking = ETrue;
    return KErrNone;
    }


TInt DIttEventHandler::Stop()
    {
    //Kern::Printf("DIttEventHandler::Stop()");

    iTracking = EFalse;
    return KErrNone;
    }

TBool DIttEventHandler::SampleNeeded()
    {
    LOGTEXT("DIttEventHandler::SampleNeeded()");
    
    // increase the counter by one on each round
    iCount++;
    
    // check if event handler was not running
    if(!iTracking)
       return false;
    
    return true;
    }


TUint DIttEventHandler::EventHandler(TKernelEvent aType, TAny* a1, TAny* a2, TAny* aThis)
    {
    //Kern::Printf("DIttEventHandler::EventHandler()");
    return ((DIttEventHandler*)aThis)->HandleEvent(aType, a1, a2);
    }



TUint DIttEventHandler::HandleEvent(TKernelEvent aType, TAny* a1, TAny* a2)
    {
    //Kern::Printf("DIttEventHandler::HandleEvent()");
    //Kern::Printf("New kernel event received, %d", aType);
    
    if (iTracking/* && iCount != iPreviousCount*/)
        {
        switch (aType)
            {
            
            case EEventAddCodeSeg:
                //Kern::Printf("DCodeSeg added: 0x%08x", (DCodeSeg*)a1);
                HandleAddCodeSeg((DCodeSeg*)a1);
                break;
                
            case EEventRemoveCodeSeg:
                //Kern::Printf("DCodeSeg deleted: 0x%08x", (DCodeSeg*)a1);
                HandleRemoveCodeSeg((DCodeSeg*)a1);
                break;
   
            default:
                break;
            }
        }
//    else if(iTracking && iCount == iPreviousCount)
//        {
//        // if time stamp is not updated profiling has stopped
//        Stop();
//        }
    return DKernelEventHandler::ERunNext;
    }

/*
 * 
 */
TBool DIttEventHandler::HandleAddCodeSeg(DCodeSeg* aSeg)
    {    
    iSampleDescriptor.Zero();
    //Kern::Printf("DLL ADD: NM %S : RA:0x%x SZ:0x%x SN:0x%x",aSeg->iFileName,aSeg->iRunAddress,aSeg->iSize, this->gppSamplerData->sampleNumber);

    iSample[0] = aSeg->iFileName->Length();
    iSampleDescriptor.Append(*aSeg->iFileName);
    iSampleDescriptor.Append((TUint8*)&(aSeg->iRunAddress),4);
    iSampleDescriptor.Append((TUint8*)&(aSeg->iSize),4);
    iSampleDescriptor.Append((TUint8*)&(this->gppSamplerData->sampleNumber),4);
    iSample[0] = iSampleDescriptor.Size();
    
    iSampleBuffer->AddSample(iSample,iSampleDescriptor.Size()+1);
    return ETrue;
    }

TBool DIttEventHandler::HandleRemoveCodeSeg(DCodeSeg* aSeg)
    {
    iSampleDescriptor.Zero();
    //Kern::Printf("DLL REM: NM %S : RA:0x%x SZ:0x%x SN:0x%x",aSeg->iFileName,aSeg->iRunAddress,aSeg->iSize, this->gppSamplerData->sampleNumber);

    iSample[0] = aSeg->iFileName->Length();
    iSampleDescriptor.Append(*aSeg->iFileName);
    iSampleDescriptor.Append((TUint8*)&(aSeg->iRunAddress),4);
    iSampleDescriptor.Append((TUint8*)&(aSeg->iSize),4);
    iSampleDescriptor.Append((TUint8*)&(this->gppSamplerData->sampleNumber),4);
    iSample[0] = iSampleDescriptor.Size();
    
    iSampleBuffer->AddSample(iSample,iSampleDescriptor.Size()+1);
    return ETrue;
    }
// end of file