diff -r f0f2b8682603 -r 3ff3fecb12fe sysanadatacapture/piprofiler/piprofiler/plugins/GeneralsPlugin/src/IttSamplerImpl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sysanadatacapture/piprofiler/piprofiler/plugins/GeneralsPlugin/src/IttSamplerImpl.cpp Thu Feb 11 15:52:57 2010 +0200 @@ -0,0 +1,560 @@ +/* +* 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: +* +*/ + + +#include + +#include +#include + +#include "IttSamplerImpl.h" + +/* + * + * ITT sampler definition + * + */ + +IttSamplerImpl::IttSamplerImpl() +{ + this->ptrToData = new TPtr8(((TUint8*)&(this->internalData[1])),255); + this->currentLibCount = 0; + this->currentProcCount = 0; + this->iSampleProcesses = false; + + this->Reset(); +} + +IttSamplerImpl::~IttSamplerImpl() +{ + delete(this->ptrToData); +} + +TInt IttSamplerImpl::CreateFirstSample() +{ + this->iVersionData.Zero(); + this->iVersionData.Append(_L8("Bappea_ITT_V")); + this->iVersionData.Append(PROFILER_ITT_SAMPLER_VERSION); + this->itt_sample = (TUint8*)iVersionData.Ptr(); + return iVersionData.Length(); +} + +TBool IttSamplerImpl::SampleNeeded(TUint32 sampleNum) +{ + return true; +} + +TInt IttSamplerImpl::SampleImpl(TUint32 pc,TUint32 sampleNum) +{ + // in order to avoid overloading the interrupt + // only one dynamic file in each 50ms is added to the stream + // with the application of the tool in mind, this is + // a reasonable measure + +// #ifdef ITT_TEST + //if(iSampleProcesses) + { + // encode a process binary + ptrToData->Zero(); + + //static RPointerArray array = DCodeSeg::CodeSegsByName; + //TInt arrayCount = array.Count(); + + /* mietintää... + + DCodeSeg* pSeg = Kern::CodeSegFromAddress( (TLinAddr)aPtr, TheCurrentThread->iOwningProcess ); + if (!pSeg) + { + return KErrNotFound; + } + Kern::KUDesPut(aModuleName, *pSeg->iFileName); + + // lisää pohdintaa + + TInt n=0; + TInt i; + TInt c=iDynamicCode.Count(); // DProcess.iDynamicCode, type = RArray, SCodeSegEntry->iSeg/iLib + for (i=-1; i=0) + { + DLibrary* pL=iDynamicCode[i].iLib; + if (pL && pL->iState!=DLibrary::EAttached) + continue; + } + if (aFlags & ETraverseFlagAdd) + n+=pS->ListDeps(aQ,aMark); + else + n+=pS->UnListDeps(aMark); + } + } + + + */ + +/* + // testi... + // encode a process binary + //Kern::Printf("Get Processes from container..."); + DObjectCon* proc = Kern::Containers()[EProcess]; + TInt procCount = proc->Count(); + + //Kern::Printf("Got count of processes: %d", procCount); + + // go 20 executables through at a time + for(TInt i=0;iiDynamicCode.Count(); // DProcess.iDynamicCode, type = RArray, SCodeSegEntry->iSeg/iLib + + //Kern::Printf("DProcess: count of segments %d", c); + for (TInt i=-1; iiCodeSeg:pro->iDynamicCode[i].iSeg; + if(seg != 0) + { + if( (seg->iMark & 0x80) == 0) + { + this->internalData[0] = seg->iFileName->Length(); + ptrToData->Append(*(seg->iFileName)); + ptrToData->Append((TUint8*)&(seg->iRunAddress),4); + ptrToData->Append((TUint8*)&(seg->iSize),4); + //Kern::Printf("EXE1: NM %S : RA:0x%x SZ:0x%x",seg->iFileName,seg->iRunAddress,seg->iSize); + seg->iMark = (seg->iMark | 0x80); + + this->internalData[0] = ptrToData->Size(); + return ptrToData->Size()+1; + } + } + } + } +*/ +/* + + DObjectCon* libs = Kern::Containers()[ELibrary]; + TInt libCount = libs->Count(); + + //Kern::Printf("Got count of processes: %d", procCount); + + // go 20 executables through at a time + for(TInt i=0;iiCodeSeg; + if(seg != 0) + { + if( (seg->iMark & 0x80) == 0) + { + this->internalData[0] = seg->iFileName->Length(); + ptrToData->Append(*(seg->iFileName)); + ptrToData->Append((TUint8*)&(seg->iRunAddress),4); + ptrToData->Append((TUint8*)&(seg->iSize),4); + Kern::Printf("DLL: NM %S : RA:0x%x SZ:0x%x",seg->iFileName,seg->iRunAddress,seg->iSize); + seg->iMark = (seg->iMark | 0x80); + + this->internalData[0] = ptrToData->Size(); + return ptrToData->Size()+1; + } + } + } +*/ + // original + if((sampleNum % 20) != 0) return 0; + if((sampleNum % 40) == 0) + { +/* + if((sampleNum % 60) == 0) + { + // encode a process binary + ptrToData->Zero(); + DObjectCon* proc = Kern::Containers()[EProcess]; + TInt procCount = proc->Count(); + + // go 20 executables through at a time + for(TInt i=0;i<20;i++) + { + if(currentProcCount >= procCount) + { + currentProcCount = 0; + } + + DProcess* pro = (DProcess*)(*proc)[currentProcCount]; + currentProcCount++; + + DCodeSeg* seg = pro->iCodeSeg; + if(seg != 0) + { + if( (seg->iMark & 0x80) == 0) + { + this->internalData[0] = seg->iFileName->Length(); + ptrToData->Append(*(seg->iFileName)); + ptrToData->Append((TUint8*)&(seg->iRunAddress),4); + ptrToData->Append((TUint8*)&(seg->iSize),4); + //Kern::Printf("EXE: NM %S : RA:0x%x SZ:0x%x",seg->iFileName,seg->iRunAddress,seg->iSize); + seg->iMark = (seg->iMark | 0x80); + + this->internalData[0] = ptrToData->Size(); + return ptrToData->Size()+1; + } + } + } + } else + { */ + // encode a library binary + ptrToData->Zero(); + DObjectCon* libs = Kern::Containers()[ELibrary]; + TInt libCount = libs->Count(); + + // go 20 binaries through at a time + for(TInt i=0;i<20;i++) + { + if(currentLibCount >= libCount) + { + currentLibCount = 0; + } + + DLibrary* lib = (DLibrary*)(*libs)[currentLibCount]; + currentLibCount++; + + DCodeSeg* seg = lib->iCodeSeg; + if(seg != 0) + { + if( (seg->iMark & 0x80) == 0) + { + this->internalData[0] = seg->iFileName->Length(); + ptrToData->Append(*(seg->iFileName)); + ptrToData->Append((TUint8*)&(seg->iRunAddress),4); + ptrToData->Append((TUint8*)&(seg->iSize),4); + //Kern::Printf("DLL: NM %S : RA:0x%x SZ:0x%x",seg->iFileName,seg->iRunAddress,seg->iSize); + seg->iMark = (seg->iMark | 0x80); + + this->internalData[0] = ptrToData->Size(); + return ptrToData->Size()+1; + } + } + } + } else + { + SDblQue* codeSegList = Kern::CodeSegList(); + //Kern::Printf("PI"); + //TUint c = 0; + // the global list + for (SDblQueLink* codeseg= codeSegList->First(); codeseg!=(SDblQueLink*) codeSegList; codeseg=codeseg->iNext) + { + DCodeSeg* seg = _LOFF(codeseg, DCodeSeg, iLink); + if(seg != 0) + { + if( (seg->iMark & 0x80) == 0) + { + this->internalData[0] = seg->iFileName->Length(); + ptrToData->Append(*(seg->iFileName)); + ptrToData->Append((TUint8*)&(seg->iRunAddress),4); + ptrToData->Append((TUint8*)&(seg->iSize),4); + //Kern::Printf("EXE2: NM %S : RA:0x%x SZ:0x%x, time: %d",seg->iFileName,seg->iRunAddress,seg->iSize, sampleNum); + seg->iMark = (seg->iMark | 0x80); + + this->internalData[0] = ptrToData->Size(); + return ptrToData->Size()+1; + } + } + } + } + +/* + // the garbage list + for (SDblQueLink* codeseg= codeSegList->First(); codeseg!=(SDblQueLink*) codeSegList; codeseg=codeseg->iNext) + { + DCodeSeg* seg = _LOFF(codeseg,DCodeSeg, iGbgLink); + if(seg != 0) + { + if( (seg->iMark & 0x80) == 0) + { + this->internalData[0] = seg->iFileName->Length(); + ptrToData->Append(*(seg->iFileName)); + ptrToData->Append((TUint8*)&(seg->iRunAddress),4); + ptrToData->Append((TUint8*)&(seg->iSize),4); + //Kern::Printf("EXE2: NM %S : RA:0x%x SZ:0x%x, time: %d",seg->iFileName,seg->iRunAddress,seg->iSize, sampleNum); + seg->iMark = (seg->iMark | 0x80); + + this->internalData[0] = ptrToData->Size(); + return ptrToData->Size()+1; + } + } + } +*/ + + // Another try +// Kern::AccessCode(); + + //Collect all non-XIP segments that are not already marked. +/* + SDblQue* p = Kern::CodeSegList(); + SDblQueLink* anchor=&p->iA; + SDblQueLink* a=anchor->iNext; + for (; a!=anchor; a=a->iNext) + { + DEpocCodeSeg* pSeg = (DEpocCodeSeg*) _LOFF(a, DCodeSeg, iLink); + if (pSeg != 0) + { + if (pSeg->iXIP || pSeg->iMark&DCodeSeg::EMarkProfilerTAG) + { + //continue; + //if (current > (max-KMaxCreateCodeSegRecordSize)) + // break;//No more space. Finish now and wait for another GetSegments request. + + pSeg->iMark |= DCodeSeg::EMarkProfilerTAG; //Mark this segment + this->internalData[0] = pSeg->iFileName->Length(); + ptrToData->Append(*(pSeg->iFileName)); + ptrToData->Append((TUint8*)&(pSeg->iRunAddress),4); + ptrToData->Append((TUint8*)&(pSeg->iSize),4); + //Kern::Printf("EXE2: NM %S : RA:0x%x SZ:0x%x, time: %d",seg->iFileName,seg->iRunAddress,seg->iSize, sampleNum); + + this->internalData[0] = ptrToData->Size(); + return ptrToData->Size()+1; + } + } + } +*/ + +// Kern::EndAccessCode(); + + //Kern::Printf("PO"); + +/* + for(TInt i=0;iiMark & 0x80) == 0) + { + this->internalData[0] = seg->iFileName->Length(); + ptrToData->Append(*(seg->iFileName)); + ptrToData->Append((TUint8*)&(seg->iRunAddress),4); + ptrToData->Append((TUint8*)&(seg->iSize),4); + //Kern::Printf("EXE: NM %S : RA:0x%x SZ:0x%x",seg->iFileName,seg->iRunAddress,seg->iSize); + seg->iMark = (seg->iMark | 0x80); + + this->internalData[0] = ptrToData->Size(); + return ptrToData->Size()+1; + } + } + } +*/ + } +/* + #else + if((sampleNum % 50) != 0) return 0; + if((sampleNum % 100) == 0) + { + // encode a process binary + ptrToData->Zero(); + DObjectCon* proc = Kern::Containers()[EProcess]; + TInt procCount = proc->Count(); + + // go 20 executables through at a time + for(TInt i=0;i<20;i++) + { + if(currentProcCount >= procCount) + { + currentProcCount = 0; + } + + DProcess* pro = (DProcess*)(*proc)[currentProcCount]; + currentProcCount++; + + DCodeSeg* seg = pro->iCodeSeg; + if(seg != 0) + { + if( (seg->iMark & 0x80) == 0) + { + this->internalData[0] = seg->iFileName->Length(); + ptrToData->Append(*(seg->iFileName)); + ptrToData->Append((TUint8*)&(seg->iRunAddress),4); + ptrToData->Append((TUint8*)&(seg->iSize),4); + //Kern::Printf("EXE: NM %S : RA:0x%x SZ:0x%x",seg->iFileName,seg->iRunAddress,seg->iSize); + seg->iMark = (seg->iMark | 0x80); + + this->internalData[0] = ptrToData->Size(); + return ptrToData->Size()+1; + } + } + } + } + else + { + // encode a library binary + ptrToData->Zero(); + DObjectCon* libs = Kern::Containers()[ELibrary]; + TInt libCount = libs->Count(); + + // go 20 binaries through at a time + for(TInt i=0;i<20;i++) + { + if(currentLibCount >= libCount) + { + currentLibCount = 0; + } + + DLibrary* lib = (DLibrary*)(*libs)[currentLibCount]; + currentLibCount++; + + DCodeSeg* seg = lib->iCodeSeg; + if(seg != 0) + { + if( (seg->iMark & 0x80) == 0) + { + this->internalData[0] = seg->iFileName->Length(); + ptrToData->Append(*(seg->iFileName)); + ptrToData->Append((TUint8*)&(seg->iRunAddress),4); + ptrToData->Append((TUint8*)&(seg->iSize),4); + //Kern::Printf("DLL: NM %S : RA:0x%x SZ:0x%x",seg->iFileName,seg->iRunAddress,seg->iSize); + seg->iMark = (seg->iMark | 0x80); + + this->internalData[0] = ptrToData->Size(); + return ptrToData->Size()+1; + } + } + } + } + #endif +*/ + return 0; + +} + +void IttSamplerImpl::Reset() +{ + this->currentLibCount = 0; + this->currentProcCount = 0; + this->itt_sample = (TUint8*)&(this->internalData[0]); + ptrToData->Zero(); + +// #ifdef ITT_TEST + + SDblQue* codeSegList = Kern::CodeSegList(); + // the global list + for (SDblQueLink* codeseg= codeSegList->First(); codeseg!=(SDblQueLink*) codeSegList; codeseg=codeseg->iNext) + { + DCodeSeg* seg = _LOFF(codeseg,DCodeSeg, iLink); + //if(seg != 0) + { + if( (seg->iMark & 0x80) > 0) + { + seg->iMark = (seg->iMark & ~0x80); + } + } + } + + // the garbage list +/* + for (SDblQueLink* codeseg= codeSegList->First(); codeseg!=(SDblQueLink*) codeSegList; codeseg=codeseg->iNext) + { + DCodeSeg* seg = _LOFF(codeseg,DCodeSeg, iGbgLink); + if(seg != 0) + { + if( (seg->iMark & 0x80) > 0) + { + seg->iMark = (seg->iMark & ~0x80); + } + } + } +*/ +// another try +/* +// Kern::AccessCode(); + SDblQue* p = Kern::CodeSegList(); + SDblQueLink* anchor=&p->iA; + SDblQueLink* a=anchor->iNext; + for (; a!=anchor; a=a->iNext) + { + DEpocCodeSeg* pSeg = (DEpocCodeSeg*) _LOFF(a, DCodeSeg, iLink); + if (!pSeg->iXIP) + pSeg->iMark &= ~DCodeSeg::EMarkProfilerTAG; + } + +// Kern::EndAccessCode(); +*/ +/* + DObjectCon* proc = Kern::Containers()[EProcess]; + TInt procCount = proc->Count(); + + // go 20 executables through at a time + for(TInt i=0;iiDynamicCode.Count(); // DProcess.iDynamicCode, type = RArray, SCodeSegEntry->iSeg/iLib + + //Kern::Printf("Reset: DProcess: count of segments %d", c); + for (TInt i=-1; iiCodeSeg:pro->iDynamicCode[i].iSeg; + if(seg != 0) + { + if( (seg->iMark & 0x80) > 0) + { + seg->iMark = (seg->iMark & ~0x80); + } + } + } + } + + //Kern::Printf("Reset: Exiting..."); + + #else +*/ + DObjectCon* libs = Kern::Containers()[ELibrary]; + TInt libCount = libs->Count(); + for(TInt i=0;iiCodeSeg; + if( (seg->iMark & 0x80) > 0) + { + seg->iMark = (seg->iMark & ~0x80); + } + } + + DObjectCon* procs = Kern::Containers()[EProcess]; + TInt procCount = procs->Count(); + for(TInt i=0;iiCodeSeg; + if(seg != 0) + { + if( (seg->iMark & 0x80) > 0) + { + seg->iMark = (seg->iMark & ~0x80); + } + } + } + //#endif +}