diff -r 185201be11b0 -r 516af714ebb4 piprofiler/plugins/GeneralsPlugin/inc/IttSamplerImpl.h --- a/piprofiler/plugins/GeneralsPlugin/inc/IttSamplerImpl.h Thu Sep 02 22:05:40 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,327 +0,0 @@ -/* -* 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: -* -*/ - -#ifndef PROFILER_ITT_SAMPLER_H -#define PROFILER_ITT_SAMPLER_H - -#include "GeneralsConfig.h" - -#include - -#include -#include -#include "GppSamplerImpl.h" -#include "IttEventHandler.h" - -// CONSTANTS -const TInt KITTSampleBufferSize = 256; - -// flags -#define ITT_EVENT_HANDLER // enable event based ITT sampling - -/* - * - * ITT sampler definition - * - */ -class DIttEventHandler; - -/* - * User side ITT sampler - */ -class IttSamplerImpl -{ -public: - IttSamplerImpl(); - ~IttSamplerImpl(); - - TInt SampleImpl(TUint32 pc,TUint32 sampleNum); - TBool SampleNeeded(TUint32 sampleNum); - TInt CreateFirstSample(); - void Reset(); - TInt ProcessEvent(); - - TUint8* itt_sample; - TInt iIttSamplingPeriod; - TInt iIttSamplingPeriodDiv2; - TBool iTimeToSample; -#ifdef ITT_EVENT_HANDLER - TBool iEventReceived; - TBool iFirstSampleTaken; -#endif - -private: -#ifdef ITT_EVENT_HANDLER - TInt iCount; -#endif - TInt currentLibCount; - TInt currentProcCount; - - TUint8 sample[KITTSampleBufferSize ]; - TPtr8 sampleDescriptor; - - TBuf8<64> iVersionData; - SDblQue* codeSegList; - -}; - -/* - * ITT sampler kernel part - * - */ -template -class DProfilerIttSampler : public DProfilerGenericSampler -{ -public: - DProfilerIttSampler(struct TProfilerGppSamplerData* gppSamplerDataIn); - ~DProfilerIttSampler(); - - void Sample(); - TInt Reset(DProfilerSampleStream* aStream, TUint32 aSyncOffset); - TInt PostSample(); - TBool PostSampleNeeded(); - -private: -#ifdef ITT_EVENT_HANDLER - DIttEventHandler* iEventHandler; -#endif - IttSamplerImpl ittSamplerImpl; - struct TProfilerGppSamplerData* gppSamplerData; - TBool sampleInProgress; - TBool sampleNeeded; -}; - -/* - * ITT sampler implementation - * - */ -template -DProfilerIttSampler::DProfilerIttSampler(struct TProfilerGppSamplerData* gppSamplerDataIn) : - DProfilerGenericSampler(PROFILER_ITT_SAMPLER_ID) -{ - this->gppSamplerData = (struct TProfilerGppSamplerData*)gppSamplerDataIn; - this->sampleInProgress = false; - LOGSTRING2("CProfilerIttSampler<%d>::CProfilerIttSampler",BufferSize); -} - -/* - * DProfilerIttSampler::Reset() - * - * @param DProfilerSampleStream* sample stream - * @param TUint32 Offset - */ -template -TInt DProfilerIttSampler::Reset(DProfilerSampleStream* aStream, TUint32 aSyncOffset) -{ - Kern::Printf("DProfilerIttSampler<%d>::Reset - calling superclass reset",BufferSize); - DProfilerGenericSampler::Reset(aStream); - - // check if reset called in stop (by driver) - if(aSyncOffset != 999999) - { -#ifdef ITT_EVENT_HANDLER - // Itt event handler - if(iEventHandler) - { - // stop previous sampling if still running - Kern::Printf("Stopping DIttEventHandler"); - iEventHandler->Stop(); - iEventHandler->Close(); - iEventHandler = NULL; - } - - Kern::Printf("Initiating DIttEventHandler"); - iEventHandler = new DIttEventHandler(this->iSampleBuffer, this->gppSamplerData); - if(iEventHandler) - { - Kern::Printf("Creating DIttEventHandler"); - TInt err(iEventHandler->Create()); - if(err != KErrNone) - { - Kern::Printf("Error in creation of DIttEventHandler, error %d", err); - return err; - } - } - else - { - Kern::Printf("Could not initiate DIttEventHandler"); - return KErrGeneral; - } - - // set first sample at the 10 ms, should be enough - this->ittSamplerImpl.iIttSamplingPeriod = 10; -#else - this->ittSamplerImpl.iIttSamplingPeriod = this->iSamplingPeriod; -#endif - this->ittSamplerImpl.iIttSamplingPeriodDiv2 = (TInt)(this->ittSamplerImpl.iIttSamplingPeriod / 2); - LOGSTRING3("CProfilerIttSampler<%d>::Reset - set ITT sampling period to %d", - BufferSize,this->ittSamplerImpl.iIttSamplingPeriod); - } - else - { - LOGSTRING2("DProfilerIttSampler<%d>::Reset - reset in stop", BufferSize); -#ifdef ITT_EVENT_HANDLER - // destroy memory event handler - if(iEventHandler) - { - // stop previous sampling if still running - iEventHandler->Stop(); - iEventHandler->Close(); - iEventHandler = NULL; - } -#endif - return KErrNone; // return if reset called in stop - } - - TInt length(ittSamplerImpl.CreateFirstSample()); - this->iSampleBuffer->AddSample((TUint8*)&length,1); - this->iSampleBuffer->AddSample(ittSamplerImpl.itt_sample, length); - this->sampleInProgress = false; - this->sampleNeeded = false; - //LOGSTRING("DProfilerIttSampler::Reset - exit"); - this->ittSamplerImpl.Reset(); - return KErrNone; - -} - -/* - * DProfilerIttSampler::PostSample - * - * Function for finishing sample - */ -template -TInt DProfilerIttSampler::PostSample() -{ -#ifdef ITT_EVENT_HANDLER - if(!ittSamplerImpl.iFirstSampleTaken) // if we haven't read the initial state - { -#endif - if(sampleNeeded) - { - this->sampleNeeded = false; - //LOGSTRING3("CProfilerIttSampler<%d>::PostSample - state %d",BufferSize,this->iSampleBuffer->GetBufferStatus()); - //Kern::Printf("DProfilerIttSampler<%d>::PostSample - state %d",BufferSize,this->iSampleBuffer->GetBufferStatus()); - - TInt length = this->ittSamplerImpl.SampleImpl(this->gppSamplerData->lastPcValue, - this->gppSamplerData->sampleNumber); - if(length != 0) - { - LOGSTRING("ITT sampler PostSample - starting to sample"); - - while(length > 0) - { - this->iSampleBuffer->AddSample(ittSamplerImpl.itt_sample,length); - length = this->ittSamplerImpl.SampleImpl( this->gppSamplerData->lastPcValue, - this->gppSamplerData->sampleNumber ); - if(length == 0) - { - LOGSTRING("MEM sampler PostSample - all samples generated!"); - } - } - LOGSTRING("ITT sampler PostSample - finished sampling"); - } - this->sampleInProgress = false; - } -#ifdef ITT_EVENT_HANDLER - } - if(!iEventHandler->Tracking()) - { - iEventHandler->Start(); - Kern::Printf("DProfilerITTSampler<%d>::PostSample - ITT handler started",BufferSize); - } - -#endif - - LOGSTRING2("ITT sampler PostSample - finished sampling, time: %d", gppSamplerData->sampleNumber); - - // finally perform superclass postsample - TInt i(this->DProfilerGenericSampler::PostSample()); - return i; -} - -/* - * DProfilerIttSampler::PostSampleNeeded() - * - * Function for deciding if sample handling is needed - */ -template -TBool DProfilerIttSampler::PostSampleNeeded() -{ - LOGSTRING3("CProfilerIttSampler<%d>::PostSampleNeeded - state %d",BufferSize,this->iSampleBuffer->GetBufferStatus()); - - TUint32 status = this->iSampleBuffer->iBufferStatus; - - if(status == DProfilerSampleBuffer::BufferCopyAsap || status == DProfilerSampleBuffer::BufferFull || this->sampleNeeded == true) - { - return true; - } - - return false; -} - -/* - * DProfilerIttSampler::Sample - * - * Function for initiating sampling - */ -template -void DProfilerIttSampler::Sample() -{ - LOGSTRING2("CProfilerIttSampler<%d>::Sample",BufferSize); - - //#ifdef ITT_TEST - LOGSTRING2("CProfilerIttSampler<%d>::Sample",BufferSize); - - if(ittSamplerImpl.SampleNeeded(this->gppSamplerData->sampleNumber) && this->sampleInProgress == false) - { - this->sampleInProgress = true; - this->sampleNeeded = true; - - LOGSTRING2("CProfilerIttSampler<%d>::Sample - sample needed",BufferSize); - } -#ifdef ITT_EVENT_HANDLER - // call this to increase the time stamp - else if(iEventHandler->SampleNeeded()) - { - // set the flag for post sampling - this->sampleNeeded = true; - } -#endif - - LOGSTRING2("CProfilerIttSampler<%d>::Sample",BufferSize); - return; -} - -/* - * Destructor - */ -template -DProfilerIttSampler::~DProfilerIttSampler() -{ - LOGSTRING2("CProfilerIttSampler<%d>::~CProfilerIttSampler",BufferSize); -#ifdef ITT_EVENT_HANDLER - if(iEventHandler) - { - // stop previous sampling if still running - iEventHandler->Stop(); - iEventHandler->Close(); - iEventHandler = NULL; - } -#endif -} -#endif -// end of file