perfsrv/piprofiler/plugins/GeneralsPlugin/src/IttEventHandler.cpp
author hgs
Tue, 26 Oct 2010 16:20:32 +0300
changeset 62 1c2bb2fc7c87
parent 51 98307c651589
permissions -rw-r--r--
201043
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
20
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description:  Event based ITT sampler skeleton copypasted from MemoryEventHandler.cpp
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
#include <e32def.h>
hgs
parents:
diff changeset
    19
#include <e32cmn.h>
hgs
parents:
diff changeset
    20
#include <arm.h>
hgs
parents:
diff changeset
    21
#include <kernel.h>
hgs
parents:
diff changeset
    22
#include <kern_priv.h>
hgs
parents:
diff changeset
    23
#include <nk_trace.h>
hgs
parents:
diff changeset
    24
hgs
parents:
diff changeset
    25
#include "IttEventHandler.h"
hgs
parents:
diff changeset
    26
hgs
parents:
diff changeset
    27
/*
hgs
parents:
diff changeset
    28
 * Constructor
hgs
parents:
diff changeset
    29
 * 
hgs
parents:
diff changeset
    30
 * @param DProfilerSampleBuffer*    pointer to sample buffer
hgs
parents:
diff changeset
    31
 */
hgs
parents:
diff changeset
    32
DIttEventHandler::DIttEventHandler(DProfilerSampleBuffer* aSampleBuffer, TProfilerGppSamplerData* aGppSamplerDataIn)
hgs
parents:
diff changeset
    33
    :   DKernelEventHandler(EventHandler, this),
hgs
parents:
diff changeset
    34
        iSampleBuffer(aSampleBuffer),
hgs
parents:
diff changeset
    35
        iSampleDescriptor(&(this->iSample[1]),0,KITTBufferSize),
hgs
parents:
diff changeset
    36
        gppSamplerData(aGppSamplerDataIn)
hgs
parents:
diff changeset
    37
    {
62
hgs
parents: 51
diff changeset
    38
    iSampleAvailable = false;
20
hgs
parents:
diff changeset
    39
    }
hgs
parents:
diff changeset
    40
hgs
parents:
diff changeset
    41
/*
hgs
parents:
diff changeset
    42
 * DIttEventHandler::Create()
hgs
parents:
diff changeset
    43
 */
hgs
parents:
diff changeset
    44
TInt DIttEventHandler::Create()
hgs
parents:
diff changeset
    45
    {
hgs
parents:
diff changeset
    46
    TInt err(Kern::MutexCreate(iLock, _L("IttEventHandlerLock"), KMutexOrdDebug));
hgs
parents:
diff changeset
    47
    if (err != KErrNone)
hgs
parents:
diff changeset
    48
        return err;
hgs
parents:
diff changeset
    49
    
hgs
parents:
diff changeset
    50
    return Add();
hgs
parents:
diff changeset
    51
    }
hgs
parents:
diff changeset
    52
hgs
parents:
diff changeset
    53
/*
hgs
parents:
diff changeset
    54
 * Destructor
hgs
parents:
diff changeset
    55
 */
hgs
parents:
diff changeset
    56
DIttEventHandler::~DIttEventHandler()
hgs
parents:
diff changeset
    57
    {
62
hgs
parents: 51
diff changeset
    58
    LOGSTRING("DIttEventHandler::~DIttEventHandler()");
20
hgs
parents:
diff changeset
    59
hgs
parents:
diff changeset
    60
    if (iLock)
hgs
parents:
diff changeset
    61
        iLock->Close(NULL);
hgs
parents:
diff changeset
    62
    }
hgs
parents:
diff changeset
    63
hgs
parents:
diff changeset
    64
hgs
parents:
diff changeset
    65
TInt DIttEventHandler::Start()
hgs
parents:
diff changeset
    66
    {
62
hgs
parents: 51
diff changeset
    67
    LOGSTRING("DIttEventHandler::Start()");
20
hgs
parents:
diff changeset
    68
hgs
parents:
diff changeset
    69
    iTracking = ETrue;
hgs
parents:
diff changeset
    70
    return KErrNone;
hgs
parents:
diff changeset
    71
    }
hgs
parents:
diff changeset
    72
hgs
parents:
diff changeset
    73
hgs
parents:
diff changeset
    74
TInt DIttEventHandler::Stop()
hgs
parents:
diff changeset
    75
    {
62
hgs
parents: 51
diff changeset
    76
    LOGSTRING("DIttEventHandler::Stop()");
20
hgs
parents:
diff changeset
    77
hgs
parents:
diff changeset
    78
    iTracking = EFalse;
62
hgs
parents: 51
diff changeset
    79
    LOGSTRING2("ITT - gpp sample counter %d", this->gppSamplerData->sampleNumber);
20
hgs
parents:
diff changeset
    80
    return KErrNone;
hgs
parents:
diff changeset
    81
    }
hgs
parents:
diff changeset
    82
hgs
parents:
diff changeset
    83
TBool DIttEventHandler::SampleNeeded()
hgs
parents:
diff changeset
    84
    {
62
hgs
parents: 51
diff changeset
    85
    //LOGSTRING("DIttEventHandler::SampleNeeded()");
20
hgs
parents:
diff changeset
    86
    
hgs
parents:
diff changeset
    87
    // check if event handler was not running
hgs
parents:
diff changeset
    88
    if(!iTracking)
62
hgs
parents: 51
diff changeset
    89
        {
hgs
parents: 51
diff changeset
    90
        return false;
hgs
parents: 51
diff changeset
    91
        }
hgs
parents: 51
diff changeset
    92
    // check if a new sample is available
hgs
parents: 51
diff changeset
    93
    if(iSampleAvailable)
hgs
parents: 51
diff changeset
    94
        {
hgs
parents: 51
diff changeset
    95
        return true;
hgs
parents: 51
diff changeset
    96
        }
hgs
parents: 51
diff changeset
    97
    else
hgs
parents: 51
diff changeset
    98
        {
hgs
parents: 51
diff changeset
    99
        return false;
hgs
parents: 51
diff changeset
   100
        }
20
hgs
parents:
diff changeset
   101
    }
hgs
parents:
diff changeset
   102
62
hgs
parents: 51
diff changeset
   103
void DIttEventHandler::SampleHandled()
hgs
parents: 51
diff changeset
   104
    {
hgs
parents: 51
diff changeset
   105
    iSampleAvailable = false;
hgs
parents: 51
diff changeset
   106
    }
20
hgs
parents:
diff changeset
   107
hgs
parents:
diff changeset
   108
TUint DIttEventHandler::EventHandler(TKernelEvent aType, TAny* a1, TAny* a2, TAny* aThis)
hgs
parents:
diff changeset
   109
    {
62
hgs
parents: 51
diff changeset
   110
    //LOGSTRING("DIttEventHandler::EventHandler()");
20
hgs
parents:
diff changeset
   111
    return ((DIttEventHandler*)aThis)->HandleEvent(aType, a1, a2);
hgs
parents:
diff changeset
   112
    }
hgs
parents:
diff changeset
   113
hgs
parents:
diff changeset
   114
hgs
parents:
diff changeset
   115
hgs
parents:
diff changeset
   116
TUint DIttEventHandler::HandleEvent(TKernelEvent aType, TAny* a1, TAny* a2)
hgs
parents:
diff changeset
   117
    {
hgs
parents:
diff changeset
   118
    
62
hgs
parents: 51
diff changeset
   119
    if (iTracking)
20
hgs
parents:
diff changeset
   120
        {
hgs
parents:
diff changeset
   121
        switch (aType)
hgs
parents:
diff changeset
   122
            {
hgs
parents:
diff changeset
   123
            case EEventAddCodeSeg:
62
hgs
parents: 51
diff changeset
   124
                LOGSTRING("DIttEventHandler::HandleEvent() EEventAddCodeSeg received");
20
hgs
parents:
diff changeset
   125
                HandleAddCodeSeg((DCodeSeg*)a1);
hgs
parents:
diff changeset
   126
                break;
hgs
parents:
diff changeset
   127
                
hgs
parents:
diff changeset
   128
            case EEventRemoveCodeSeg:
62
hgs
parents: 51
diff changeset
   129
                LOGSTRING("DIttEventHandler::HandleEvent() EEventRemoveCodeSeg received");
20
hgs
parents:
diff changeset
   130
                HandleRemoveCodeSeg((DCodeSeg*)a1);
hgs
parents:
diff changeset
   131
                break;
hgs
parents:
diff changeset
   132
   
hgs
parents:
diff changeset
   133
            default:
hgs
parents:
diff changeset
   134
                break;
hgs
parents:
diff changeset
   135
            }
hgs
parents:
diff changeset
   136
        }
hgs
parents:
diff changeset
   137
    return DKernelEventHandler::ERunNext;
hgs
parents:
diff changeset
   138
    }
hgs
parents:
diff changeset
   139
hgs
parents:
diff changeset
   140
/*
hgs
parents:
diff changeset
   141
 * 
hgs
parents:
diff changeset
   142
 */
hgs
parents:
diff changeset
   143
TBool DIttEventHandler::HandleAddCodeSeg(DCodeSeg* aSeg)
hgs
parents:
diff changeset
   144
    {    
62
hgs
parents: 51
diff changeset
   145
    LOGSTRING("DIttEventHandler::HandleAddCodeSeg()");
20
hgs
parents:
diff changeset
   146
    iSampleDescriptor.Zero();
hgs
parents:
diff changeset
   147
    //Kern::Printf("DLL ADD: NM %S : RA:0x%x SZ:0x%x SN:0x%x",aSeg->iFileName,aSeg->iRunAddress,aSeg->iSize, this->gppSamplerData->sampleNumber);
hgs
parents:
diff changeset
   148
62
hgs
parents: 51
diff changeset
   149
    NKern::ThreadEnterCS();
hgs
parents: 51
diff changeset
   150
    Kern::MutexWait(*iLock);
20
hgs
parents:
diff changeset
   151
    iSample[0] = aSeg->iFileName->Length();
hgs
parents:
diff changeset
   152
    iSampleDescriptor.Append(*aSeg->iFileName);
hgs
parents:
diff changeset
   153
    iSampleDescriptor.Append((TUint8*)&(aSeg->iRunAddress),4);
hgs
parents:
diff changeset
   154
    iSampleDescriptor.Append((TUint8*)&(aSeg->iSize),4);
hgs
parents:
diff changeset
   155
    iSampleDescriptor.Append((TUint8*)&(this->gppSamplerData->sampleNumber),4);
hgs
parents:
diff changeset
   156
    iSample[0] = iSampleDescriptor.Size();
62
hgs
parents: 51
diff changeset
   157
   
hgs
parents: 51
diff changeset
   158
    iSampleBuffer->AddSample(iSample,iSampleDescriptor.Size()+1);
hgs
parents: 51
diff changeset
   159
    Kern::MutexSignal(*iLock);
hgs
parents: 51
diff changeset
   160
    NKern::ThreadLeaveCS();
20
hgs
parents:
diff changeset
   161
    
62
hgs
parents: 51
diff changeset
   162
    iSampleAvailable = true;
20
hgs
parents:
diff changeset
   163
    return ETrue;
hgs
parents:
diff changeset
   164
    }
hgs
parents:
diff changeset
   165
hgs
parents:
diff changeset
   166
TBool DIttEventHandler::HandleRemoveCodeSeg(DCodeSeg* aSeg)
hgs
parents:
diff changeset
   167
    {
62
hgs
parents: 51
diff changeset
   168
    LOGSTRING("DIttEventHandler::HandleRemoveCodeSeg()");
20
hgs
parents:
diff changeset
   169
    iSampleDescriptor.Zero();
hgs
parents:
diff changeset
   170
    //Kern::Printf("DLL REM: NM %S : RA:0x%x SZ:0x%x SN:0x%x",aSeg->iFileName,aSeg->iRunAddress,aSeg->iSize, this->gppSamplerData->sampleNumber);
hgs
parents:
diff changeset
   171
62
hgs
parents: 51
diff changeset
   172
    NKern::ThreadEnterCS();
hgs
parents: 51
diff changeset
   173
    Kern::MutexWait(*iLock);
hgs
parents: 51
diff changeset
   174
    
20
hgs
parents:
diff changeset
   175
    iSample[0] = aSeg->iFileName->Length();
hgs
parents:
diff changeset
   176
    iSampleDescriptor.Append(*aSeg->iFileName);
hgs
parents:
diff changeset
   177
    iSampleDescriptor.Append((TUint8*)&(aSeg->iRunAddress),4);
hgs
parents:
diff changeset
   178
    iSampleDescriptor.Append((TUint8*)&(aSeg->iSize),4);
hgs
parents:
diff changeset
   179
    iSampleDescriptor.Append((TUint8*)&(this->gppSamplerData->sampleNumber),4);
hgs
parents:
diff changeset
   180
    iSample[0] = iSampleDescriptor.Size();
62
hgs
parents: 51
diff changeset
   181
20
hgs
parents:
diff changeset
   182
    iSampleBuffer->AddSample(iSample,iSampleDescriptor.Size()+1);
62
hgs
parents: 51
diff changeset
   183
    Kern::MutexSignal(*iLock);
hgs
parents: 51
diff changeset
   184
    NKern::ThreadLeaveCS();
hgs
parents: 51
diff changeset
   185
hgs
parents: 51
diff changeset
   186
    iSampleAvailable = true;
20
hgs
parents:
diff changeset
   187
    return ETrue;
hgs
parents:
diff changeset
   188
    }
hgs
parents:
diff changeset
   189
// end of file