diff -r aa2539c91954 -r 1c2bb2fc7c87 perfsrv/piprofiler/piprofiler_plat/inc/ProfilerGenericClassesKrn.inl --- a/perfsrv/piprofiler/piprofiler_plat/inc/ProfilerGenericClassesKrn.inl Fri Oct 08 14:56:39 2010 +0300 +++ b/perfsrv/piprofiler/piprofiler_plat/inc/ProfilerGenericClassesKrn.inl Tue Oct 26 16:20:32 2010 +0300 @@ -77,7 +77,9 @@ inline TInt DProfilerSampleBuffer::AddSample(TUint8* aSample, TUint32 aLength) { TUint32 bytesTotal; - +#ifdef __SMP__ + TInt intState(0); +#endif // check whether the buffer status is switch (iBufferStatus) { @@ -87,7 +89,13 @@ if(bytesTotal < iBufferDataSize) { +#ifdef __SMP__ + __SPIN_LOCK_IRQ(WriteSpinLock); +#endif memcpy((&(iBufStruct->iDataStart))+iBytesWritten,aSample,aLength); +#ifdef __SMP__ + __SPIN_UNLOCK_IRQ(WriteSpinLock); +#endif iBytesWritten+=aLength; return 0; } @@ -96,16 +104,27 @@ // the sample does not fit to the buffer // first copy as much data as we can fit to the first buffer - TUint32 fitsToBuffer = iBufferDataSize-iBytesWritten; - TUint32 remaining = aLength-fitsToBuffer; - + TUint32 fitsToBuffer(iBufferDataSize-iBytesWritten); + TUint32 remaining(aLength-fitsToBuffer); + LOGSTRING2("DProfilerSampleBuffer::AddSample sample does not fit to buffer, cpu %d", NKern::CurrentCpu()); +#ifdef __SMP__ + __SPIN_LOCK_IRQ(WriteSpinLock); +#endif memcpy((&(iBufStruct->iDataStart))+iBytesWritten,aSample,fitsToBuffer); +#ifdef __SMP__ + __SPIN_UNLOCK_IRQ(WriteSpinLock); +#endif iBytesWritten = iBufferDataSize; +#ifdef __SMP__ + intState = __SPIN_LOCK_IRQSAVE(BufferStateSpinLock); +#endif // ->switch to the double buffer iBufferStatus = DProfilerSampleBuffer::BufferCopyAsap; - - TProfilerSampleBufStruct* tmpPtr = iBufStruct; +#ifdef __SMP__ + __SPIN_UNLOCK_IRQRESTORE(BufferStateSpinLock, intState); +#endif + TProfilerSampleBufStruct* tmpPtr(iBufStruct); iBufStruct = iDblBufStruct; iDblBufStruct = tmpPtr; @@ -123,8 +142,14 @@ // there should be room - in case the single sample // is smaller than the whole buffer! so we don't // bother to check - + //Kern::Printf("DProfilerSampleBuffer::AddSample else 2"); +#ifdef __SMP__ + __SPIN_LOCK_IRQ(WriteSpinLock); +#endif memcpy((&(iBufStruct->iDataStart)),aSample,remaining); +#ifdef __SMP__ + __SPIN_UNLOCK_IRQ(WriteSpinLock); +#endif iBytesWritten = remaining; return 0; } @@ -139,7 +164,14 @@ if(bytesTotal < iBufferDataSize) { + LOGSTRING2("DProfilerSampleBuffer::BufferCopyAsap, cpu %d", NKern::CurrentCpu()); +#ifdef __SMP__ + __SPIN_LOCK_IRQ(WriteSpinLock); +#endif memcpy((&(iBufStruct->iDataStart))+iBytesWritten,aSample,aLength); +#ifdef __SMP__ + __SPIN_UNLOCK_IRQ(WriteSpinLock); +#endif iBytesWritten+=aLength; return 0; } @@ -148,8 +180,14 @@ // the double buffer is now also full - there is no // place to put the data -> we have to waste it! // this is an indication of a too small buffer size +#ifdef __SMP__ + intState = __SPIN_LOCK_IRQSAVE(BufferStateSpinLock); +#endif iBufferStatus = DProfilerSampleBuffer::BufferFull; - LOGSTRING("DProfilerSampleBuffer::AddSample - double buffer full1!!"); +#ifdef __SMP__ + __SPIN_UNLOCK_IRQRESTORE(BufferStateSpinLock, intState); +#endif + Kern::Printf("DProfilerSampleBuffer::AddSample - double buffer full1!! cpu %d", NKern::CurrentCpu()); return -1; } @@ -160,7 +198,14 @@ if(bytesTotal < iBufferDataSize) { + LOGSTRING2("DProfilerSampleBuffer::BufferBeingCopied iBufferDataSize, cpu %d", NKern::CurrentCpu()); +#ifdef __SMP__ + __SPIN_LOCK_IRQ(WriteSpinLock); +#endif memcpy((&(iBufStruct->iDataStart))+iBytesWritten,aSample,aLength); +#ifdef __SMP__ + __SPIN_UNLOCK_IRQ(WriteSpinLock); +#endif iBytesWritten+=aLength; return 0; } @@ -169,8 +214,7 @@ // the double buffer is now also full - there is no // place to put the data -> we have to waste it! // this is an indication of a too small buffer size - LOGSTRING("DProfilerSampleBuffer::AddSample - double buffer full2!!"); - + Kern::Printf("DProfilerSampleBuffer::AddSample - double buffer full2!! cpu %d", NKern::CurrentCpu()); // don't change the state to CProfilerSampleBuffer::BufferFull, since it is // already being copied return -1; @@ -179,17 +223,20 @@ case DProfilerSampleBuffer::BufferFull: // the buffer is still full, there is noting we can do // about it -> return - LOGSTRING("DProfilerSampleBuffer::AddSample - double buffer full3!!"); + Kern::Printf("DProfilerSampleBuffer::AddSample - double buffer full3!! cpu %d", NKern::CurrentCpu()); return -1; default: - LOGSTRING("DProfilerSampleBuffer::AddSample - wrong switch!!"); + Kern::Printf("DProfilerSampleBuffer::AddSample - wrong switch!!"); return -1; } } inline void DProfilerSampleBuffer::EndSampling() { +#ifdef __SMP__ + TInt intState(0); +#endif LOGSTRING("DProfilerSampleBuffer::EndSampling"); // this will switch to the dbl buffer even though // the buffer is not full, so that data can be copied @@ -203,9 +250,14 @@ { // ->switch to the double buffer LOGSTRING("DProfilerSampleBuffer::EndSampling - switching to double buffer"); +#ifdef __SMP__ + intState = __SPIN_LOCK_IRQSAVE(BufferStateSpinLock); +#endif iBufferStatus = DProfilerSampleBuffer::BufferCopyAsap; - - TProfilerSampleBufStruct* tmpPtr = iBufStruct; +#ifdef __SMP__ + __SPIN_UNLOCK_IRQRESTORE(BufferStateSpinLock, intState); +#endif + TProfilerSampleBufStruct* tmpPtr(iBufStruct); iBufStruct = iDblBufStruct; iDblBufStruct = tmpPtr; @@ -225,12 +277,14 @@ inline void DProfilerSampleBuffer::ClearBuffer() { LOGSTRING2("CProfilerSampleBuffer::ClearBuffer - %d",iBufferDataSize); - +#ifdef __SMP__ + TInt intState(0); +#endif // the buffers are of same size - TUint8* ptr1 = (TUint8*)&(iBufStruct->iDataStart); - TUint8* ptr2 = (TUint8*)&(iDblBufStruct->iDataStart); + TUint8* ptr1((TUint8*)&(iBufStruct->iDataStart)); + TUint8* ptr2((TUint8*)&(iDblBufStruct->iDataStart)); - for(TUint32 i=0;i 1) { // there is someone else adding samples to the buffer - LOGSTRING("DProfilerSampleStream::AddSamples - mutex in use"); + Kern::Printf("DProfilerSampleStream::AddSamples - mutex in use"); iAddingSamples--; return; } @@ -351,14 +419,14 @@ realBuf.iDataSize); // get the address of the source buffer data - TUint8* src = (TUint8*)&(aBuffer.iDblBufStruct->iDataStart); + TUint8* src((TUint8*)&(aBuffer.iDblBufStruct->iDataStart)); src += aBuffer.iDblBytesRead; // the amount of data to copy is the 4 header bytes + // the remaining data in the buffer - TInt amount = aBuffer.iDblBytesWritten-aBuffer.iDblBytesRead; + TInt amount(aBuffer.iDblBytesWritten-aBuffer.iDblBytesRead); - TUint8* dst = realBuf.iBuffer; + TUint8* dst(realBuf.iBuffer); LOGSTRING4("DProfilerSampleStream::AddSamples - s:0x%x d:0x%x a:%d",src,dst,amount); @@ -395,7 +463,7 @@ // there is data in the client buffer dst += realBuf.iDataSize; - TInt remainingSpace = realBuf.iBufferSize-realBuf.iDataSize; + TInt remainingSpace(realBuf.iBufferSize-realBuf.iDataSize); if( remainingSpace >= (amount+4) ) { @@ -458,7 +526,9 @@ inline TInt DProfilerSampleStream::EndSampling(DProfilerSampleBuffer& aBuffer,TInt aSamplerId) { LOGSTRING2("DProfilerSampleStream::EndSampling, sampler ID: %d",aSamplerId); - +#ifdef __SMP__ + TInt intState(0); +#endif // switch the buffer to double buffer // even though it would not be full yet // the switch is done only once / end sampling procedure @@ -488,7 +558,13 @@ // now we have to change the status of the buffer to BufferDataEnd, so // we know that the particular buffer has no more data to copy LOGSTRING("DProfilerSampleStream::EndSampling - switch to BufferDataEnd"); +#ifdef __SMP__ + intState = __SPIN_LOCK_IRQSAVE(BufferStateSpinLock); +#endif aBuffer.iBufferStatus = DProfilerSampleBuffer::BufferDataEnd; +#ifdef __SMP__ + __SPIN_UNLOCK_IRQRESTORE(BufferStateSpinLock, intState); +#endif } } @@ -512,7 +588,11 @@ LOGSTRING2("DProfilerSampleStream::PerformCopy - start header copy HDR = 0x%x",header); // write the header - Kern::ThreadDesWrite(iClient,(TAny*)aDst,ptr,aOffset,KChunkShiftBy0); + TInt err(Kern::ThreadDesWrite(iClient,(TAny*)aDst,ptr,aOffset,KChunkShiftBy0)); + if (err != KErrNone) + { + Kern::Printf(("DProfilerSampleStream::PerformCopy() - thread des write error, %d"), err); + } LOGSTRING2("DProfilerSampleStream::PerformCopy - copied header %d bytes",ptr.Size()); aOffset+=4; @@ -522,8 +602,11 @@ ptr.Set(aSrc,aAmount,aAmount); ptr.SetLength(aAmount); - Kern::ThreadDesWrite(iClient,(TAny*)aDst,ptr,aOffset,KChunkShiftBy0); - + err = Kern::ThreadDesWrite(iClient,(TAny*)aDst,ptr,aOffset,KChunkShiftBy0); + if (err != KErrNone) + { + Kern::Printf(("DProfilerSampleStream::PerformCopy() - thread des write error, %d"), err); + } LOGSTRING2("DProfilerSampleStream::PerformCopy - copied data %d bytes",ptr.Size());