sysanadatacapture/piprofiler/piprofiler/plugins/GeneralsPlugin/inc/IttSamplerImpl.h
author Matti Laitinen <matti.t.laitinen@nokia.com>
Thu, 11 Feb 2010 15:52:57 +0200
changeset 1 3ff3fecb12fe
permissions -rw-r--r--
Add initial version of PI Profiler under EPL

/*
* 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 <kern_priv.h>

#include <piprofiler/ProfilerGenericClassesKrn.h>
#include <piprofiler/ProfilerTraces.h>
#include "GppSamplerImpl.h"

/*
 *	
 *	ITT sampler definition
 *	
 */

class IttSamplerImpl
{
public:
	IttSamplerImpl();
	~IttSamplerImpl();

	TInt	SampleImpl(TUint32 pc,TUint32 sampleNum);
	TBool	SampleNeeded(TUint32 sampleNum);
	TInt 	CreateFirstSample();
	void	Reset();

	TUint8* itt_sample;
	TBool							iSampleProcesses;
private:

	TUint8					internalData[256];
	TPtr8*					ptrToData;
	TInt					currentLibCount;
	TInt					currentProcCount;
	
	TBuf8<64>				iVersionData;
	SDblQue* 				codeSegList;
};

template <int BufferSize>
class DProfilerIttSampler : public DProfilerGenericSampler<BufferSize>
{
public:
	DProfilerIttSampler(struct TProfilerGppSamplerData* gppSamplerDataIn);
	~DProfilerIttSampler();

	void	Sample();
	TInt	Reset(DProfilerSampleStream* aStream, TUint32 aSyncOffset);
	TInt	PostSample();
	TBool	PostSampleNeeded();

private:
    struct TProfilerGppSamplerData*	    gppSamplerData;
	IttSamplerImpl					ittSampler;
	TBool							sampleInProgress;
	TBool							sampleNeeded;
};

/*  
 *	
 *	ITT sampler implementation
 *	
 */ 

template <int BufferSize>
DProfilerIttSampler<BufferSize>::DProfilerIttSampler(struct TProfilerGppSamplerData* gppSamplerDataIn) :
	DProfilerGenericSampler<BufferSize>(PROFILER_ITT_SAMPLER_ID)
{
	this->gppSamplerData = (struct TProfilerGppSamplerData*)gppSamplerDataIn;
	this->sampleInProgress = false;
	LOGSTRING2("CProfilerIttSampler<%d>::CProfilerIttSampler",BufferSize);	
}

template <int BufferSize>
TInt DProfilerIttSampler<BufferSize>::Reset(DProfilerSampleStream* aStream, TUint32 aSyncOffset)
{
	LOGSTRING2("CProfilerIttSampler<%d>::Reset - calling superclass reset",BufferSize);
	DProfilerGenericSampler<BufferSize>::Reset(aStream);
	LOGSTRING2("CProfilerIttSampler<%d>::Reset - called superclass reset",BufferSize);	
	TInt length = this->ittSampler.CreateFirstSample();
	this->iSampleBuffer->AddSample((TUint8*)&length,1);
	this->iSampleBuffer->AddSample(ittSampler.itt_sample,length);
	this->sampleInProgress = false;
	this->sampleNeeded = false;

	this->ittSampler.Reset();

	return KErrNone;
}

template <int BufferSize> 
TInt DProfilerIttSampler<BufferSize>::PostSample()
{
	if(sampleNeeded)
	{
		this->sampleNeeded = false;

		LOGSTRING3("CProfilerIttSampler<%d>::PostSample - state %d",BufferSize,this->sampleBuffer->GetBufferStatus());

		
		TInt length = this->ittSampler.SampleImpl(this->gppSamplerData->lastPcValue,
									        		  this->gppSamplerData->sampleNumber);
		if(length != 0)
		{		
			LOGSTRING("ITT sampler PostSample - starting to sample");

			while(length > 0)
			{
                this->iSampleBuffer->AddSample(ittSampler.itt_sample,length);
				length = this->ittSampler.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;
	}
	
	// finally perform superclass postsample
	TInt i = this->DProfilerGenericSampler<BufferSize>::PostSample();
	return i;
}

template <int BufferSize> 
TBool DProfilerIttSampler<BufferSize>::PostSampleNeeded()
{
	LOGSTRING3("CProfilerMemSampler<%d>::PostSampleNeeded - state %d",BufferSize,this->sampleBuffer->GetBufferStatus());

	TUint32 status = this->iSampleBuffer->iBufferStatus;

	if(status == DProfilerSampleBuffer::BufferCopyAsap || status == DProfilerSampleBuffer::BufferFull || this->sampleNeeded == true)
	{
		return true;
	}
	
	return false;
}

template <int BufferSize>
void DProfilerIttSampler<BufferSize>::Sample()
{
	LOGSTRING2("CProfilerIttSampler<%d>::Sample",BufferSize);	
	
	//#ifdef ITT_TEST
	LOGSTRING2("CProfilerIttSampler<%d>::Sample",BufferSize);	
	
	if(ittSampler.SampleNeeded(this->gppSamplerData->sampleNumber) && this->sampleInProgress == false) 
	{
		this->sampleInProgress = true;
		this->sampleNeeded = true;

		LOGSTRING2("CProfilerIttSampler<%d>::Sample - sample needed",BufferSize);	
	}	

	LOGSTRING2("CProfilerIttSampler<%d>::Sample",BufferSize);

	return;
}

template <int BufferSize>
DProfilerIttSampler<BufferSize>::~DProfilerIttSampler()
{
	LOGSTRING2("CProfilerIttSampler<%d>::~CProfilerIttSampler",BufferSize);		
}
#endif