perfsrv/piprofiler/plugins/GeneralsPlugin/inc/IttSamplerImpl.h
changeset 62 1c2bb2fc7c87
parent 51 98307c651589
--- a/perfsrv/piprofiler/plugins/GeneralsPlugin/inc/IttSamplerImpl.h	Fri Oct 08 14:56:39 2010 +0300
+++ b/perfsrv/piprofiler/plugins/GeneralsPlugin/inc/IttSamplerImpl.h	Tue Oct 26 16:20:32 2010 +0300
@@ -55,20 +55,30 @@
 	void	Reset();
 	TInt    ProcessEvent();
 	
+	TInt   HandleLibs(TUint32 sampleNum);
+	TInt   HandleSegs(TUint32 sampleNum);
+	
 	TUint8*         itt_sample;
 	TInt            iIttSamplingPeriod;
 	TInt            iIttSamplingPeriodDiv2;
 	TBool           iTimeToSample;
 #ifdef ITT_EVENT_HANDLER
     TBool           iEventReceived;
-    TBool           iFirstSampleTaken;
+    TBool           iInitialLibsTaken;
+    TBool           iInitialSegsTaken;
 #endif
 	
 private:
+    enum {
+        KIttHandlingLibs=0,
+        KIttHandlingCodeSegs    
+    };
 #ifdef ITT_EVENT_HANDLER    
     TInt            iCount;
 #endif
-    TInt            currentLibCount;
+    TInt            iCurrentLibCount;
+    TInt            iLibsCount;
+    TInt            iCodeSegsCount;
     TInt            currentProcCount;
     
 	TUint8          sample[KITTSampleBufferSize ];
@@ -76,7 +86,8 @@
 		
 	TBuf8<64>		iVersionData;
 	SDblQue* 		codeSegList;
-
+    TUint8          iInitState;
+    SDblQueLink*    iLatestCodeseg;
 };
 
 /*
@@ -90,12 +101,13 @@
 	DProfilerIttSampler(struct TProfilerGppSamplerData* gppSamplerDataIn);
 	~DProfilerIttSampler();
 
-	void	Sample();
+	void	Sample(TAny* aPtr);
 	TInt	Reset(DProfilerSampleStream* aStream, TUint32 aSyncOffset);
 	TInt	PostSample();
 	TBool	PostSampleNeeded();
 
 private:
+
 #ifdef ITT_EVENT_HANDLER
     DIttEventHandler*               iEventHandler;
 #endif
@@ -103,6 +115,7 @@
 	struct TProfilerGppSamplerData*     gppSamplerData;
 	TBool							sampleInProgress;
 	TBool							sampleNeeded;
+	TUint32                         iSyncOffset;
 };
 
 /*  
@@ -112,11 +125,12 @@
 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);	
-}
+	iSyncOffset = 0;
+	LOGSTRING2("DProfilerIttSampler<%d>::DProfilerIttSampler",BufferSize);	
+    }
 
 /*
  *  DProfilerIttSampler::Reset()
@@ -126,13 +140,12 @@
  */
 template <int BufferSize>
 TInt DProfilerIttSampler<BufferSize>::Reset(DProfilerSampleStream* aStream, TUint32 aSyncOffset)
-{
-    Kern::Printf("DProfilerIttSampler<%d>::Reset - calling superclass reset",BufferSize);
-    DProfilerGenericSampler<BufferSize>::Reset(aStream);
-
+    {
+    iSyncOffset = aSyncOffset;
     // check if reset called in stop (by driver)
-    if(aSyncOffset != 999999)
+    if(iSyncOffset != KStateSamplingEnding)
         {
+        DProfilerGenericSampler<BufferSize>::Reset(aStream);
 #ifdef ITT_EVENT_HANDLER
         // Itt event handler
         if(iEventHandler)
@@ -140,15 +153,11 @@
             // 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)
                 {
@@ -163,12 +172,12 @@
             }
     
         // set first sample at the 10 ms, should be enough
-        this->ittSamplerImpl.iIttSamplingPeriod = 10;
+        this->ittSamplerImpl.iIttSamplingPeriod = 8;
 #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",
+        LOGSTRING3("DProfilerIttSampler<%d>::Reset - set ITT sampling period to %d",
                                 BufferSize,this->ittSamplerImpl.iIttSamplingPeriod);
         }
     else
@@ -180,8 +189,6 @@
             {
             // stop previous sampling if still running
             iEventHandler->Stop();
-            iEventHandler->Close();
-            iEventHandler = NULL;
             }
 #endif
         return KErrNone;    // return if reset called in stop
@@ -196,7 +203,7 @@
 	this->ittSamplerImpl.Reset();
     return KErrNone;
 
-}
+    }
 
 /*
  * DProfilerIttSampler::PostSample
@@ -205,53 +212,52 @@
  */
 template <int BufferSize> 
 TInt DProfilerIttSampler<BufferSize>::PostSample()
-{
+    {
 #ifdef ITT_EVENT_HANDLER
-    if(!ittSamplerImpl.iFirstSampleTaken)   // if we haven't read the initial state
-    {
+    if(!ittSamplerImpl.iInitialSegsTaken || !ittSamplerImpl.iInitialLibsTaken)   // 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());
+            LOGSTRING3("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 - done for this round!");
+                        }
                     }
+                LOGSTRING("ITT sampler PostSample - finished sampling");
                 }
-                LOGSTRING("ITT sampler PostSample - finished sampling");
+            this->sampleInProgress = false;
             }
-            this->sampleInProgress = false;
-        }
 #ifdef ITT_EVENT_HANDLER
-    }   
-        if(!iEventHandler->Tracking())
-            {
-            iEventHandler->Start();
-            Kern::Printf("DProfilerITTSampler<%d>::PostSample - ITT handler started",BufferSize);
-            }
-
-#endif    
+        }
+#endif
 	
     LOGSTRING2("ITT sampler PostSample - finished sampling, time: %d", gppSamplerData->sampleNumber);
     
 	// finally perform superclass postsample
 	TInt i(this->DProfilerGenericSampler<BufferSize>::PostSample());
+#ifdef ITT_EVENT_HANDLER	
+	// notify event handler
+	if(iEventHandler)
+	    {
+	    iEventHandler->SampleHandled();
+	    }
+#endif
 	return i;
-}
+    }
 
 /*
  *  DProfilerIttSampler::PostSampleNeeded()
@@ -260,18 +266,28 @@
  */
 template <int BufferSize> 
 TBool DProfilerIttSampler<BufferSize>::PostSampleNeeded()
-{
-	LOGSTRING3("CProfilerIttSampler<%d>::PostSampleNeeded - state %d",BufferSize,this->iSampleBuffer->GetBufferStatus());
-
-	TUint32 status = this->iSampleBuffer->iBufferStatus;
+    {
+	LOGSTRING3("DProfilerIttSampler<%d>::PostSampleNeeded - buffer status %d",BufferSize,this->iSampleBuffer->GetBufferStatus());
 
-	if(status == DProfilerSampleBuffer::BufferCopyAsap || status == DProfilerSampleBuffer::BufferFull || this->sampleNeeded == true)
-	{
+	TUint32 status(this->iSampleBuffer->GetBufferStatus());
+#ifdef ITT_EVENT_HANDLER
+    if(iEventHandler)
+        {
+        if(iEventHandler->Tracking())
+            {
+            this->sampleNeeded = iEventHandler->SampleNeeded();
+            }
+        }
+#endif    
+	if(status == DProfilerSampleBuffer::BufferCopyAsap || 
+	        status == DProfilerSampleBuffer::BufferFull || 
+	        this->sampleNeeded == true)
+	    {
+	    LOGSTRING2("DProfilerIttSampler<%d>::PostSampleNeeded - buffer needs emptying or sample is needed",BufferSize);
 		return true;
-	}
-	
+	    }
 	return false;
-}
+    }
 
 /*
  * DProfilerIttSampler::Sample
@@ -279,40 +295,49 @@
  * Function for initiating sampling
  */
 template <int BufferSize>
-void DProfilerIttSampler<BufferSize>::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;
+void DProfilerIttSampler<BufferSize>::Sample(TAny* aPtr)
+    {
+	LOGSTRING2("DProfilerIttSampler<%d>::Sample - entry",BufferSize);	
+    if(iEventHandler)
+        {
+        if(!iEventHandler->Tracking())
+            {
+            if(ittSamplerImpl.SampleNeeded(this->gppSamplerData->sampleNumber) && this->sampleInProgress == false) 
+                {
+                this->sampleInProgress = true;
+                this->sampleNeeded = true;
+        
+                LOGSTRING2("DProfilerIttSampler<%d>::Sample - sample needed 1",BufferSize);	
+                }
+            
+            if(ittSamplerImpl.iInitialSegsTaken && ittSamplerImpl.iInitialLibsTaken) 
+                {
+                iEventHandler->Start();
+                }
+            }
+        }
+    else
+        {
+        if(ittSamplerImpl.SampleNeeded(this->gppSamplerData->sampleNumber) && this->sampleInProgress == false) 
+            {
+            this->sampleInProgress = true;
+            this->sampleNeeded = true;
+    
+            LOGSTRING2("DProfilerIttSampler<%d>::Sample - sample needed 2",BufferSize);   
+            }
+        }
 
-		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);
+	LOGSTRING2("DProfilerIttSampler<%d>::Sample - exit",BufferSize);
 	return;
-}
+    }
 
 /*
  * Destructor
  */
 template <int BufferSize>
 DProfilerIttSampler<BufferSize>::~DProfilerIttSampler()
-{
-	LOGSTRING2("CProfilerIttSampler<%d>::~CProfilerIttSampler",BufferSize);
+    {
+	LOGSTRING2("DProfilerIttSampler<%d>::~DProfilerIttSampler",BufferSize);
 #ifdef ITT_EVENT_HANDLER
      if(iEventHandler)
          {
@@ -322,6 +347,6 @@
          iEventHandler = NULL;
          }
 #endif
-}
+    }
 #endif
 // end of file