piprofiler/piprofiler_plat/inc/ProfilerGenericClassesKrn.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 25 May 2010 14:22:58 +0300
branchRCL_3
changeset 13 da2cedce4920
permissions -rw-r--r--
Revision: 201019 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:  
*
*/


#ifndef PROFILERGENERICCLASSESKRN_H
#define PROFILERGENERICCLASSESKRN_H

	#include <piprofiler/ProfilerGenericClassesCommon.h>
	#include <piprofiler/ProfilerTraces.h>

	#include <e32cmn.h>

	#define PROFILER_KERNEL_MODE

#ifdef PROFILER_KERNEL_MODE
class DProfilerSampleBuffer;

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

		void InsertCurrentClient(DThread* aClient);
		void AddSampleBuffer(TBapBuf* aBuffer,TRequestStatus* aStatus);
		void ReleaseIfPending();

		void AddSamples(DProfilerSampleBuffer& aBuffer, TInt aSamplerId);
		TInt EndSampling(DProfilerSampleBuffer& aBuffer,TInt aSamplerId);

		void PerformCopy(TUint8 aSamplerId,TUint8* aSrc,TPtr8* dst,TInt aOffset,TInt aAmount);

private:
		TBapBuf*			iCurrentBuffer;
		TRequestStatus*		iPendingRequest;
		DThread*			iClient;
		TInt				iAddingSamples;
    };

class DProfilerSampleBuffer : public DBase
    {
		friend class DProfilerSampleStream;
public:

			enum ProfilerBufferStatus 
			    {
				BufferOk,
				BufferCopyAsap,
				BufferBeingCopied,
				BufferFull,
				BufferDataEnd
			    };

			DProfilerSampleBuffer(TUint8* aBuffer, TUint8* aDblBuffer, TUint32 aSize);
			~DProfilerSampleBuffer();	
			TInt	AddSample(TUint8* aSample, TUint32 aLength);
			TUint32 GetBufferStatus();
			void	ClearBuffer();
			void	EndSampling();
			void	DataCopied();

			TUint32 iBufferStatus;
private:
			TUint32 iBytesWritten;
			TUint32 iDblBytesWritten;
			TUint32 iDblBytesRead;

			TUint32 iBufferDataSize;
			TUint32 iBufferRealSize;

			TProfilerSampleBufStruct* iDblBufStruct;
			TProfilerSampleBufStruct* iBufStruct;
    };

#endif


 
/*
 *	
 *	Abstract class CProfilerSamplerBase definition
 *	
 */

#ifdef PROFILER_KERNEL_MODE
class DProfilerSamplerBase : public DBase
    {
public:
	DProfilerSamplerBase();
			virtual					~DProfilerSamplerBase();

			virtual	TInt			Initialise() = 0;
			virtual	void			Sample() = 0;
			virtual TBool			PostSampleNeeded() = 0;
			virtual TInt			PostSample() = 0;
			virtual TInt			EndSampling() = 0;

			virtual TInt			Reset(DProfilerSampleStream* aStream = 0, TUint32 aSyncOffset = 0) = 0;

			virtual void			SetEnabledFlag(TBool aFlag) = 0;
			virtual TBool			GetEnabledFlag() = 0;
			virtual void			SetOutputCombination(TInt aSettings) = 0;
			virtual void 			SetSamplingPeriod(TInt aSettings) = 0;
			virtual void			SetAdditionalSettings(TInt aSettings) = 0;
			virtual void			SetAdditionalSettings2(TInt aSettings) = 0;
			virtual void			SetAdditionalSettings3(TInt aSettings) = 0;
			virtual void			SetAdditionalSettings4(TInt aSettings) = 0;

			TInt					iSamplerId;
			TInt					iOutputCombination;
			TBool					iEnabled;
    };

/*
 *	
 *	Template abstract class CProfilerGenericSampler definition
 *	
 */

// size parameter given defines the explicit buffer size in bytes for this sampler
template <int BufferSize> 
class DProfilerGenericSampler : public DProfilerSamplerBase
    {
public:
			DProfilerGenericSampler(TInt aSamplerId);
			virtual					~DProfilerGenericSampler();

			TInt					Initialise();
			virtual	void			Sample() = 0;
			TBool					PostSampleNeeded();
			TInt					PostSample();
			TInt					EndSampling();
			virtual TInt			Reset(DProfilerSampleStream* aStream = 0, TUint32 aSyncOffset = 0);


			void					SetEnabledFlag(TBool aFlag);
			TBool					GetEnabledFlag();
			void					SetOutputCombination(TInt aComb);
			void 					SetSamplingPeriod(TInt aSettings);
			void					SetAdditionalSettings(TInt aSettings);
			void					SetAdditionalSettings2(TInt aSettings);
			void					SetAdditionalSettings3(TInt aSettings);
			void					SetAdditionalSettings4(TInt aSettings);

			DProfilerSampleBuffer*	iSampleBuffer;
			DProfilerSampleStream*	iStream;

			// for right alignment
			TUint8					iBuffer[BufferSize+4];
			TUint8					iDblBuffer[BufferSize+4];
			
			TInt					iSamplingPeriod;
			TInt					iAdditionalSettings;
			TInt					iAdditionalSettings2;
			TInt					iAdditionalSettings3;
			TInt					iAdditionalSettings4;
    };

/*
 *	
 *	Template abstract class CProfilerGenericSampler implementation
 *
 */

template <int BufferSize>
DProfilerGenericSampler<BufferSize>::DProfilerGenericSampler(TInt aSamplerId)
    {
	iSamplerId = aSamplerId;
	iEnabled = false;
	iSampleBuffer = 0;
	iAdditionalSettings = 0;
	iAdditionalSettings2 = 0;
    iAdditionalSettings3 = 0;
    iAdditionalSettings4 = 0;
	iStream = 0;
	Initialise();
    }

template <int BufferSize> 
DProfilerGenericSampler<BufferSize>::~DProfilerGenericSampler()
    {
	LOGSTRING2("CProfilerGenericSampler<%d>::CProfilerGenericSampler",BufferSize);	
	
	if(iSampleBuffer != 0)
		delete iSampleBuffer;

    }
 
template <int BufferSize> 
TInt DProfilerGenericSampler<BufferSize>::Initialise()
    {
	LOGSTRING2("CProfilerGenericSampler<%d>::Initialise - chunk option",BufferSize);

	// stream is not used in chunk mode
	iStream = 0;

	// create the sample buffer object with the buffers
	if(iSampleBuffer == 0)
	    {
	    iSampleBuffer = new DProfilerSampleBuffer(iBuffer,iDblBuffer,BufferSize);
        }
	else
	   {
		LOGSTRING2("CProfilerGenericSampler<%d>::Initialise - ERROR 1",BufferSize);
        }

	return KErrNone;
    }



template <int BufferSize> 
TInt DProfilerGenericSampler<BufferSize>::Reset(DProfilerSampleStream* aStream, TUint32 aSyncOffset)
    {
	LOGSTRING4("CProfilerGenericSampler<%d>::Reset %d, sync offset %d",BufferSize,aStream,aSyncOffset);
	// reset the sample buffer and resolve the chunk again

	// CURRENT VERSION SUPPORTS ONLY STREAM MODE!
	LOGSTRING2("CProfilerGenericSampler<%d>::Reset - stream option",BufferSize);

	// initialise the sampler with the stream option
	iStream = aStream;

	// clear the sample buffer
	if(iSampleBuffer != 0)
	    {
	    iSampleBuffer->ClearBuffer();
        }
	else
	    {
		LOGSTRING2("CProfilerGenericSampler<%d>::Initialise - ERROR no buffer",BufferSize);
        }

	return KErrNone;

    }

template <int BufferSize> 
TBool DProfilerGenericSampler<BufferSize>::PostSampleNeeded()
    {
	LOGSTRING4("CProfilerGenericSampler<%d>::PostSampleNeeded - ID %d, state %d",iSamplerId,BufferSize,iSampleBuffer->GetBufferStatus());

	TUint32 status = iSampleBuffer->iBufferStatus;

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


template <int BufferSize> 
TInt DProfilerGenericSampler<BufferSize>::PostSample()
    {
	LOGSTRING4("CProfilerGenericSampler<%d>::PostSample - ID %d, state %d",iSamplerId,BufferSize,iSampleBuffer->GetBufferStatus());

	TUint32 status = iSampleBuffer->iBufferStatus;

	if(status == DProfilerSampleBuffer::BufferCopyAsap || status == DProfilerSampleBuffer::BufferFull)
	    {
        // write data to the stream
	    iStream->AddSamples(*iSampleBuffer,iSamplerId);
		}
	
	return KErrNone;
    }

template <int BufferSize>
TInt DProfilerGenericSampler<BufferSize>::EndSampling()
    {
	LOGSTRING3("CProfilerGenericSampler<%d>::EndSampling, ID %d",BufferSize,iSamplerId);

    // only if write to stream option is selected
    if(iStream->EndSampling(*iSampleBuffer,iSamplerId) == 0)
        {
        return KErrNone;
        }
    else 
        {
        // there is still data to copy
        return KErrNotReady;
        }
    }

template <int BufferSize>
void DProfilerGenericSampler<BufferSize>::SetEnabledFlag(TBool aFlag)
    {
	LOGSTRING2("CProfilerGenericSampler<%d>::SetEnabledFlag",BufferSize);
	iEnabled = aFlag;
    }

template <int BufferSize>
TBool DProfilerGenericSampler<BufferSize>::GetEnabledFlag()
    {
	LOGSTRING2("CProfilerGenericSampler<%d>::GetEnabledFlag",BufferSize);
	return iEnabled;
    }

template <int BufferSize>
void DProfilerGenericSampler<BufferSize>::SetOutputCombination(TInt aComb)
    {
	LOGSTRING2("CProfilerGenericSampler<%d>::SetOutputCombination",BufferSize);
	iOutputCombination = aComb;
    }

template <int BufferSize>
void DProfilerGenericSampler<BufferSize>::SetAdditionalSettings(TInt aSettings)
    {
	LOGSTRING3("CProfilerGenericSampler<%d>::SetAdditionalSettings to 0x%x",BufferSize,aSettings);
	iAdditionalSettings = aSettings;
    }

template <int BufferSize>
void DProfilerGenericSampler<BufferSize>::SetAdditionalSettings2(TInt aSettings)
    {
	LOGSTRING3("CProfilerGenericSampler<%d>::SetAdditionalSettings2 to 0x%x",BufferSize,aSettings);
	iAdditionalSettings2 = aSettings;
    }

template <int BufferSize>
void DProfilerGenericSampler<BufferSize>::SetAdditionalSettings3(TInt aSettings)
    {
	LOGSTRING3("CProfilerGenericSampler<%d>::SetAdditionalSettings3 to 0x%x",BufferSize,aSettings);
	iAdditionalSettings3 = aSettings;
    }

template <int BufferSize>
void DProfilerGenericSampler<BufferSize>::SetAdditionalSettings4(TInt aSettings)
    {
	LOGSTRING3("CProfilerGenericSampler<%d>::SetAdditionalSettings4 to 0x%x",BufferSize,aSettings);
	iAdditionalSettings4 = aSettings;
    }

template <int BufferSize>
void DProfilerGenericSampler<BufferSize>::SetSamplingPeriod(TInt aSettings)
    {
	LOGSTRING3("CProfilerGenericSampler<%d>::SetSamplingPeriod to 0x%x",BufferSize,aSettings);
	iSamplingPeriod = aSettings;
    }

/*
 *	
 *	Just a test class that is derived from CProfilerGenericSampler
 *	
 */

template <int BufferSize>
class DProfilerExampleSampler : public DProfilerGenericSampler<BufferSize>
    {
public:
	TUint32 iSampleNumber;

	DProfilerExampleSampler(TInt aSamplerId);
	~DProfilerExampleSampler();

	void Sample();
	void Sample(TInt aCount, TInt aLastPc);
    };


/*
 *	
 *	Just a test class that is derived from CProfilerGenericSampler
 *	
 */

template <int BufferSize>
DProfilerExampleSampler<BufferSize>::DProfilerExampleSampler(TInt aSamplerId) :
	DProfilerGenericSampler<BufferSize>(aSamplerId) 
    {
    iSampleNumber = 0;
	LOGSTRING2("CProfilerExampleSampler<%d>::CProfilerExampleSampler",BufferSize);	
    }

template <int BufferSize>
void DProfilerExampleSampler<BufferSize>::Sample()
    {
	LOGSTRING2("CProfilerExampleSampler<%d>::Sample",BufferSize);
	TBuf8<20>* testiBuf = new TBuf8<20>;

	testiBuf->AppendNum((TInt)iSampleNumber);
	iSampleNumber++;

	this->iSampleBuffer->AddSample((TUint8*)testiBuf->Ptr(),testiBuf->Length());
	delete testiBuf;
	return;
    }

template <int BufferSize>
void DProfilerExampleSampler<BufferSize>::Sample(TInt aCount, TInt aLastPc)
    {
	return;
    }

template <int BufferSize>
DProfilerExampleSampler<BufferSize>::~DProfilerExampleSampler()
    {
	LOGSTRING2("CProfilerExampleSampler<%d>::~CProfilerExampleSampler",BufferSize);		
    }

#include <piprofiler/ProfilerGenericClassesKrn.inl>

#endif


#endif