perfsrv/piprofiler/piprofiler_plat/inc/ProfilerGenericClassesUsr.inl
author hgs
Tue, 26 Oct 2010 16:20:32 +0300
changeset 62 1c2bb2fc7c87
parent 51 98307c651589
permissions -rw-r--r--
201043
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
20
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
62
hgs
parents: 51
diff changeset
    14
* Description:   
20
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
hgs
parents:
diff changeset
    19
#include <f32file.h>
hgs
parents:
diff changeset
    20
#include <e32svr.h>
hgs
parents:
diff changeset
    21
hgs
parents:
diff changeset
    22
#include <piprofiler/ProfilerTraces.h>
hgs
parents:
diff changeset
    23
hgs
parents:
diff changeset
    24
// constants
hgs
parents:
diff changeset
    25
const TInt KInitialFreeBufferAmount = 4;
hgs
parents:
diff changeset
    26
hgs
parents:
diff changeset
    27
/*
hgs
parents:
diff changeset
    28
 *
hgs
parents:
diff changeset
    29
 *	Class CProfilerBufferHandler implementation
hgs
parents:
diff changeset
    30
 *
hgs
parents:
diff changeset
    31
 */
hgs
parents:
diff changeset
    32
inline CProfilerBufferHandler* CProfilerBufferHandler::NewL(CProfilerSampleStream& aStream, RPluginSampler& aSampler)
hgs
parents:
diff changeset
    33
	{
hgs
parents:
diff changeset
    34
	LOGTEXT(_L("CProfilerBufferHandler::NewL - entry"));
hgs
parents:
diff changeset
    35
	CProfilerBufferHandler* self = new(ELeave) CProfilerBufferHandler(aStream, aSampler);
hgs
parents:
diff changeset
    36
    CleanupStack::PushL(self);
hgs
parents:
diff changeset
    37
    self->ConstructL();
hgs
parents:
diff changeset
    38
    CleanupStack::Pop(self);
hgs
parents:
diff changeset
    39
    return self;   
hgs
parents:
diff changeset
    40
	}
hgs
parents:
diff changeset
    41
hgs
parents:
diff changeset
    42
inline CProfilerBufferHandler::CProfilerBufferHandler(CProfilerSampleStream& aStream, RPluginSampler& aSampler)
hgs
parents:
diff changeset
    43
    : CActive(EPriorityStandard),
hgs
parents:
diff changeset
    44
    iSampler(aSampler),
hgs
parents:
diff changeset
    45
    iObserver(aStream)
hgs
parents:
diff changeset
    46
    {
hgs
parents:
diff changeset
    47
    }
hgs
parents:
diff changeset
    48
hgs
parents:
diff changeset
    49
inline CProfilerBufferHandler::~CProfilerBufferHandler()
hgs
parents:
diff changeset
    50
	{
hgs
parents:
diff changeset
    51
	LOGTEXT(_L("CProfilerBufferHandler::~CProfilerBufferHandler() - entry"));
hgs
parents:
diff changeset
    52
	}
hgs
parents:
diff changeset
    53
hgs
parents:
diff changeset
    54
inline void CProfilerBufferHandler::ConstructL()
hgs
parents:
diff changeset
    55
	{
hgs
parents:
diff changeset
    56
	LOGTEXT(_L("CProfilerBufferHandler::ConstructL - entry"));
hgs
parents:
diff changeset
    57
	iBufferInProcess = 0;
hgs
parents:
diff changeset
    58
	iEndOfStreamDetected = false;
62
hgs
parents: 51
diff changeset
    59
	
20
hgs
parents:
diff changeset
    60
	iFinished = 0;
hgs
parents:
diff changeset
    61
	// add the buffer handler to the active scheduler
hgs
parents:
diff changeset
    62
	CActiveScheduler::Add(this);
hgs
parents:
diff changeset
    63
	}
hgs
parents:
diff changeset
    64
hgs
parents:
diff changeset
    65
inline void CProfilerBufferHandler::StartReceivingData()
hgs
parents:
diff changeset
    66
	{
hgs
parents:
diff changeset
    67
	LOGTEXT(_L("CProfilerBufferHandler::StartReceivingData - entry"));
hgs
parents:
diff changeset
    68
hgs
parents:
diff changeset
    69
	iEndOfStreamDetected = false;
hgs
parents:
diff changeset
    70
	// this method initiates receiving data from the sampler
hgs
parents:
diff changeset
    71
	iBufferInProcess = iObserver.GetNextFreeBuffer();
hgs
parents:
diff changeset
    72
hgs
parents:
diff changeset
    73
	LOGSTRING5("CProfilerBufferHandler::StartReceivingData - 0x%x -> b:0x%x s:%d d:%d",
hgs
parents:
diff changeset
    74
					iBufferInProcess,
hgs
parents:
diff changeset
    75
					iBufferInProcess->iBuffer,
hgs
parents:
diff changeset
    76
					iBufferInProcess->iBufferSize,
hgs
parents:
diff changeset
    77
					iBufferInProcess->iDataSize);
hgs
parents:
diff changeset
    78
hgs
parents:
diff changeset
    79
	iSampler.FillThisStreamBuffer(iBufferInProcess,iStatus);
hgs
parents:
diff changeset
    80
hgs
parents:
diff changeset
    81
	LOGTEXT(_L("CProfilerBufferHandler::StartReceivingData - SetActive"));
hgs
parents:
diff changeset
    82
	SetActive();
hgs
parents:
diff changeset
    83
hgs
parents:
diff changeset
    84
	LOGTEXT(_L("CProfilerBufferHandler::StartReceivingData - exit"));
hgs
parents:
diff changeset
    85
	}
hgs
parents:
diff changeset
    86
hgs
parents:
diff changeset
    87
inline TInt CProfilerBufferHandler::RunError(TInt aError)
hgs
parents:
diff changeset
    88
    {
hgs
parents:
diff changeset
    89
    // handle the error case by stopping the trace
hgs
parents:
diff changeset
    90
    HandleEndOfStream();
hgs
parents:
diff changeset
    91
    return aError;
hgs
parents:
diff changeset
    92
    }
hgs
parents:
diff changeset
    93
hgs
parents:
diff changeset
    94
inline void CProfilerBufferHandler::HandleEndOfStream()
hgs
parents:
diff changeset
    95
    {
62
hgs
parents: 51
diff changeset
    96
    LOGTEXT(_L("CProfilerBufferHandler::HandleEndOfStream - entry"));
20
hgs
parents:
diff changeset
    97
    // Cancel has been called, the stream should be about to end now,
hgs
parents:
diff changeset
    98
    // we will wait for the rest of the buffers to be filled synchronously
hgs
parents:
diff changeset
    99
    // the end of the stream will be indicated through an empty buffer
hgs
parents:
diff changeset
   100
    // at first, complete the ongoing request
hgs
parents:
diff changeset
   101
    if(iStatus == KRequestPending && iBufferInProcess != 0)
hgs
parents:
diff changeset
   102
        {
62
hgs
parents: 51
diff changeset
   103
        LOGTEXT(_L("CProfilerBufferHandler::HandleEndOfStream - case 1"));
20
hgs
parents:
diff changeset
   104
hgs
parents:
diff changeset
   105
        // wait for the buffer to be filled synchronously
hgs
parents:
diff changeset
   106
        User::WaitForRequest(iStatus);
hgs
parents:
diff changeset
   107
        
hgs
parents:
diff changeset
   108
        // add the received buffer to the list of filled buffers
hgs
parents:
diff changeset
   109
        iObserver.AddToFilledBuffers(iBufferInProcess);
hgs
parents:
diff changeset
   110
        // continue writing to output
hgs
parents:
diff changeset
   111
        iObserver.NotifyWriter();
hgs
parents:
diff changeset
   112
        
hgs
parents:
diff changeset
   113
        if(iBufferInProcess->iDataSize == 0)
hgs
parents:
diff changeset
   114
            {
hgs
parents:
diff changeset
   115
            // a buffer with size 0 was received
hgs
parents:
diff changeset
   116
            LOGTEXT(_L("CProfilerBufferHandler::DoCancel - case 1.1"));
hgs
parents:
diff changeset
   117
            iEndOfStreamDetected = true;
hgs
parents:
diff changeset
   118
            }
hgs
parents:
diff changeset
   119
hgs
parents:
diff changeset
   120
        // there will be no more asynchronous requests
hgs
parents:
diff changeset
   121
        iBufferInProcess = 0;
hgs
parents:
diff changeset
   122
        }
hgs
parents:
diff changeset
   123
    else if (iBufferInProcess != 0)
hgs
parents:
diff changeset
   124
        {
62
hgs
parents: 51
diff changeset
   125
        LOGTEXT(_L("CProfilerBufferHandler::HandleEndOfStream - case 2"));
20
hgs
parents:
diff changeset
   126
hgs
parents:
diff changeset
   127
        // add the buffer into filled, i.e. ready-to-write buffers
hgs
parents:
diff changeset
   128
        iObserver.AddToFilledBuffers(iBufferInProcess);
hgs
parents:
diff changeset
   129
        iObserver.NotifyWriter();
hgs
parents:
diff changeset
   130
        
hgs
parents:
diff changeset
   131
        if(iBufferInProcess->iDataSize == 0)
hgs
parents:
diff changeset
   132
            {
hgs
parents:
diff changeset
   133
            // a buffer with size 0 was received
62
hgs
parents: 51
diff changeset
   134
            LOGTEXT(_L("CProfilerBufferHandler::HandleEndOfStream - case 2.1"));
20
hgs
parents:
diff changeset
   135
            iEndOfStreamDetected = true;
hgs
parents:
diff changeset
   136
            }       
hgs
parents:
diff changeset
   137
        // there will be no more asynchronous requests
62
hgs
parents: 51
diff changeset
   138
        iBufferInProcess = 0;
hgs
parents: 51
diff changeset
   139
        //delete iBufferInProcess;
hgs
parents: 51
diff changeset
   140
        //iBufferInProcess = NULL;    
hgs
parents: 51
diff changeset
   141
        //iObserver.AddToFreeBuffers(iBufferInProcess);
20
hgs
parents:
diff changeset
   142
        }
hgs
parents:
diff changeset
   143
    // then, continue until end of stream has been reached
hgs
parents:
diff changeset
   144
    while(iEndOfStreamDetected == false)
hgs
parents:
diff changeset
   145
        {
hgs
parents:
diff changeset
   146
        // the end of stream has not yet been detected, so get more
hgs
parents:
diff changeset
   147
        // buffers from the sampler, until we get an empty one
hgs
parents:
diff changeset
   148
hgs
parents:
diff changeset
   149
        if(iStatus == KRequestPending)
hgs
parents:
diff changeset
   150
            {
62
hgs
parents: 51
diff changeset
   151
            LOGTEXT(_L("CProfilerBufferHandler::HandleEndOfStream - ERROR 1"));
20
hgs
parents:
diff changeset
   152
            }
hgs
parents:
diff changeset
   153
62
hgs
parents: 51
diff changeset
   154
        LOGTEXT(_L("CProfilerBufferHandler::HandleEndOfStream - case 3"));
20
hgs
parents:
diff changeset
   155
hgs
parents:
diff changeset
   156
        TBapBuf* nextFree = iObserver.GetNextFreeBuffer();  
hgs
parents:
diff changeset
   157
        iSampler.FillThisStreamBuffer(nextFree,iStatus);
hgs
parents:
diff changeset
   158
        // wait for the buffer to be filled synchronously
hgs
parents:
diff changeset
   159
        User::WaitForRequest(iStatus);
hgs
parents:
diff changeset
   160
        
hgs
parents:
diff changeset
   161
        // call the writer plugin to write data to output
hgs
parents:
diff changeset
   162
        iObserver.AddToFilledBuffers(nextFree);
hgs
parents:
diff changeset
   163
        iObserver.NotifyWriter();
hgs
parents:
diff changeset
   164
        
hgs
parents:
diff changeset
   165
        // check if end-of-data message (i.e. data size is 0 sized) received
hgs
parents:
diff changeset
   166
        if(nextFree->iDataSize == 0)
hgs
parents:
diff changeset
   167
            {
62
hgs
parents: 51
diff changeset
   168
            LOGTEXT(_L("CProfilerBufferHandler::HandleEndOfStream - case 3.1"));
20
hgs
parents:
diff changeset
   169
            // a buffer with size 0 was received
hgs
parents:
diff changeset
   170
            iEndOfStreamDetected = true;
hgs
parents:
diff changeset
   171
            nextFree = 0;
hgs
parents:
diff changeset
   172
            }
62
hgs
parents: 51
diff changeset
   173
        }
20
hgs
parents:
diff changeset
   174
    }
hgs
parents:
diff changeset
   175
hgs
parents:
diff changeset
   176
inline void CProfilerBufferHandler::RunL()
hgs
parents:
diff changeset
   177
	{
hgs
parents:
diff changeset
   178
	LOGTEXT(_L("CProfilerBufferHandler::RunL - entry"));
hgs
parents:
diff changeset
   179
	// is called by the active scheduler
hgs
parents:
diff changeset
   180
	// when a buffer has been received
hgs
parents:
diff changeset
   181
hgs
parents:
diff changeset
   182
	// buffer with dataSize 0 is returned when the sampling ends
hgs
parents:
diff changeset
   183
	if(iBufferInProcess->iDataSize != 0)
hgs
parents:
diff changeset
   184
	    {
hgs
parents:
diff changeset
   185
	    LOGTEXT(_L("CProfilerBufferHandler::RunL - buffer received"));
hgs
parents:
diff changeset
   186
hgs
parents:
diff changeset
   187
		TBapBuf* nextFree = iObserver.GetNextFreeBuffer();
62
hgs
parents: 51
diff changeset
   188
		if(nextFree == 0)
hgs
parents: 51
diff changeset
   189
		    {
hgs
parents: 51
diff changeset
   190
		    LOGTEXT(_L("CProfilerSampleStream::RunL - GetNextFreeBuffer failed!!"));
hgs
parents: 51
diff changeset
   191
		    }
hgs
parents: 51
diff changeset
   192
		else{
hgs
parents: 51
diff changeset
   193
		    LOGSTRING5("CProfilerBufferHandler::RunL - 0x%x -> b:0x%x s:%d d:%d",
20
hgs
parents:
diff changeset
   194
					nextFree,
hgs
parents:
diff changeset
   195
					nextFree->iBuffer,
hgs
parents:
diff changeset
   196
					nextFree->iBufferSize,
hgs
parents:
diff changeset
   197
					nextFree->iDataSize);
hgs
parents:
diff changeset
   198
62
hgs
parents: 51
diff changeset
   199
            iSampler.FillThisStreamBuffer(nextFree,iStatus);
hgs
parents: 51
diff changeset
   200
            SetActive();        
hgs
parents: 51
diff changeset
   201
    
hgs
parents: 51
diff changeset
   202
            LOGTEXT(_L("CProfilerBufferHandler::RunL - issued new sample command"));
hgs
parents: 51
diff changeset
   203
    
hgs
parents: 51
diff changeset
   204
            // add the received buffer to the list of filled buffers
hgs
parents: 51
diff changeset
   205
            iObserver.AddToFilledBuffers(iBufferInProcess);
hgs
parents: 51
diff changeset
   206
            iObserver.NotifyWriter();
hgs
parents: 51
diff changeset
   207
    
hgs
parents: 51
diff changeset
   208
            // the empty buffer is now the one being processed
hgs
parents: 51
diff changeset
   209
            iBufferInProcess = nextFree;
hgs
parents: 51
diff changeset
   210
            }
hgs
parents: 51
diff changeset
   211
//        LOGTEXT(_L("CProfilerBufferHandler::RunL - SetActive"));
hgs
parents: 51
diff changeset
   212
//        SetActive();        
20
hgs
parents:
diff changeset
   213
		}
hgs
parents:
diff changeset
   214
	else
hgs
parents:
diff changeset
   215
		{
hgs
parents:
diff changeset
   216
		LOGTEXT(_L("CProfilerBufferHandler::RunL - end of stream detected"));
hgs
parents:
diff changeset
   217
		iEndOfStreamDetected = true;
hgs
parents:
diff changeset
   218
		
hgs
parents:
diff changeset
   219
		// add the empty buffer to the writer so that it will also get the information
hgs
parents:
diff changeset
   220
		// about the finished stream
hgs
parents:
diff changeset
   221
		iObserver.AddToFilledBuffers(iBufferInProcess);
hgs
parents:
diff changeset
   222
		iObserver.NotifyWriter();
hgs
parents:
diff changeset
   223
hgs
parents:
diff changeset
   224
		iBufferInProcess = 0;
hgs
parents:
diff changeset
   225
		Cancel();
hgs
parents:
diff changeset
   226
hgs
parents:
diff changeset
   227
		}
hgs
parents:
diff changeset
   228
	LOGTEXT(_L("CProfilerBufferHandler::RunL - exit"));
hgs
parents:
diff changeset
   229
	}
hgs
parents:
diff changeset
   230
hgs
parents:
diff changeset
   231
inline void CProfilerBufferHandler::DoCancel()
hgs
parents:
diff changeset
   232
    {
hgs
parents:
diff changeset
   233
    LOGTEXT(_L("CProfilerBufferHandler::DoCancel - entry"));
hgs
parents:
diff changeset
   234
    HandleEndOfStream();
hgs
parents:
diff changeset
   235
    LOGTEXT(_L("CProfilerBufferHandler::DoCancel - exit"));
hgs
parents:
diff changeset
   236
    }
hgs
parents:
diff changeset
   237
hgs
parents:
diff changeset
   238
hgs
parents:
diff changeset
   239
/*
hgs
parents:
diff changeset
   240
 *
hgs
parents:
diff changeset
   241
 *	Class CProfilerSampleStream implementation
hgs
parents:
diff changeset
   242
 *
hgs
parents:
diff changeset
   243
 *  - used by Plugin
hgs
parents:
diff changeset
   244
 **/
hgs
parents:
diff changeset
   245
hgs
parents:
diff changeset
   246
inline CProfilerSampleStream* CProfilerSampleStream::NewL(TInt aBufSize)
hgs
parents:
diff changeset
   247
	{
hgs
parents:
diff changeset
   248
	LOGTEXT(_L("CProfilerSampleStream::NewL - entry"));
hgs
parents:
diff changeset
   249
	CProfilerSampleStream* self = new(ELeave) CProfilerSampleStream(aBufSize);
hgs
parents:
diff changeset
   250
    CleanupStack::PushL(self);
hgs
parents:
diff changeset
   251
    self->ConstructL();
hgs
parents:
diff changeset
   252
    CleanupStack::Pop(self);
hgs
parents:
diff changeset
   253
    return self;   
hgs
parents:
diff changeset
   254
	}
hgs
parents:
diff changeset
   255
hgs
parents:
diff changeset
   256
inline CProfilerSampleStream::CProfilerSampleStream(TInt aBufSize) : 
hgs
parents:
diff changeset
   257
    iBufferSize(aBufSize)
hgs
parents:
diff changeset
   258
	{
hgs
parents:
diff changeset
   259
	LOGTEXT(_L("CProfilerSampleStream::CProfilerSampleStream - entry"));
hgs
parents:
diff changeset
   260
	
62
hgs
parents: 51
diff changeset
   261
    iFilledBuffers = 0;
20
hgs
parents:
diff changeset
   262
    iFreeBuffers = 0;
hgs
parents:
diff changeset
   263
    iFinished = 0;
hgs
parents:
diff changeset
   264
    
hgs
parents:
diff changeset
   265
	LOGTEXT(_L("CProfilerSampleStream::CProfilerSampleStream - exit"));	
hgs
parents:
diff changeset
   266
	}
hgs
parents:
diff changeset
   267
hgs
parents:
diff changeset
   268
inline CProfilerSampleStream::~CProfilerSampleStream()
hgs
parents:
diff changeset
   269
	{
hgs
parents:
diff changeset
   270
	LOGTEXT(_L("CProfilerSampleStream::~CProfilerSampleStream - entry"));
hgs
parents:
diff changeset
   271
hgs
parents:
diff changeset
   272
	// empty all buffers
hgs
parents:
diff changeset
   273
	EmptyBuffers();
62
hgs
parents: 51
diff changeset
   274
	User::Free(iFilledBuffers);
hgs
parents: 51
diff changeset
   275
    	User::Free(iFreeBuffers);
hgs
parents: 51
diff changeset
   276
	//delete iFilledBuffers;
hgs
parents: 51
diff changeset
   277
	//delete iFreeBuffers;
20
hgs
parents:
diff changeset
   278
	    
hgs
parents:
diff changeset
   279
	LOGTEXT(_L("CProfilerSampleStream::~CProfilerSampleStream - exit"));
hgs
parents:
diff changeset
   280
	}
hgs
parents:
diff changeset
   281
hgs
parents:
diff changeset
   282
inline void CProfilerSampleStream::ConstructL()
hgs
parents:
diff changeset
   283
	{
hgs
parents:
diff changeset
   284
hgs
parents:
diff changeset
   285
	}
hgs
parents:
diff changeset
   286
hgs
parents:
diff changeset
   287
inline void CProfilerSampleStream::SetWriter(CWriterPluginInterface& aWriter)
hgs
parents:
diff changeset
   288
    {
hgs
parents:
diff changeset
   289
    // set writer plugin
hgs
parents:
diff changeset
   290
    iWriter = &aWriter;
hgs
parents:
diff changeset
   291
    }
hgs
parents:
diff changeset
   292
hgs
parents:
diff changeset
   293
inline void CProfilerSampleStream::Finalise()
hgs
parents:
diff changeset
   294
	{
hgs
parents:
diff changeset
   295
	LOGTEXT(_L("CProfilerSampleStream::Finalise - entry"));
hgs
parents:
diff changeset
   296
	}
hgs
parents:
diff changeset
   297
hgs
parents:
diff changeset
   298
inline void CProfilerSampleStream::ResetBuffers()
hgs
parents:
diff changeset
   299
    {
hgs
parents:
diff changeset
   300
hgs
parents:
diff changeset
   301
    // empty buffers
hgs
parents:
diff changeset
   302
    EmptyBuffers();
hgs
parents:
diff changeset
   303
hgs
parents:
diff changeset
   304
    // re-initialise buffers
hgs
parents:
diff changeset
   305
    InitialiseBuffers();
hgs
parents:
diff changeset
   306
    }
hgs
parents:
diff changeset
   307
hgs
parents:
diff changeset
   308
inline void CProfilerSampleStream::InitialiseBuffers()
hgs
parents:
diff changeset
   309
    {
hgs
parents:
diff changeset
   310
    // re-initialize member variables
hgs
parents:
diff changeset
   311
    iFilledBuffers = 0;
hgs
parents:
diff changeset
   312
    iFreeBuffers = 0;
hgs
parents:
diff changeset
   313
    iFinished = 0;
hgs
parents:
diff changeset
   314
    
hgs
parents:
diff changeset
   315
    // create three(orig. two) new TBapBuf objects and add them to the
hgs
parents:
diff changeset
   316
    // list of free buffers
hgs
parents:
diff changeset
   317
    for(TInt i(0);i<KInitialFreeBufferAmount;i++)
hgs
parents:
diff changeset
   318
        {
hgs
parents:
diff changeset
   319
        // alloc new buffer
hgs
parents:
diff changeset
   320
        TBapBuf* newBuf = (TBapBuf*)User::Alloc(sizeof(TBapBuf));
62
hgs
parents: 51
diff changeset
   321
        if(newBuf != 0)
hgs
parents: 51
diff changeset
   322
            {
hgs
parents: 51
diff changeset
   323
            newBuf->iBuffer = (TUint8*)User::Alloc(iBufferSize);
hgs
parents: 51
diff changeset
   324
            if(newBuf->iBuffer != 0)
hgs
parents: 51
diff changeset
   325
                {
hgs
parents: 51
diff changeset
   326
                // initialize the new buffer
hgs
parents: 51
diff changeset
   327
                newBuf->iBufferSize = iBufferSize;
hgs
parents: 51
diff changeset
   328
                newBuf->iDataSize = 0;
hgs
parents: 51
diff changeset
   329
                newBuf->iNext = 0;
hgs
parents: 51
diff changeset
   330
                newBuf->iDes = new TPtr8((TUint8*)newBuf,sizeof(TBapBuf));
hgs
parents: 51
diff changeset
   331
                newBuf->iDes->SetLength(sizeof(TBapBuf));
hgs
parents: 51
diff changeset
   332
                newBuf->iBufDes = new TPtr8((TUint8*)newBuf->iBuffer,iBufferSize);
hgs
parents: 51
diff changeset
   333
                newBuf->iBufDes->SetLength(iBufferSize);
hgs
parents: 51
diff changeset
   334
                LOGSTRING3("CProfilerSampleStream::InitialiseBuffers - newBuf 0x%x newBuf->iNext 0x%x",newBuf, newBuf->iNext);
hgs
parents: 51
diff changeset
   335
                AddToFreeBuffers(newBuf);
hgs
parents: 51
diff changeset
   336
                }
hgs
parents: 51
diff changeset
   337
            else
hgs
parents: 51
diff changeset
   338
                {
hgs
parents: 51
diff changeset
   339
                delete newBuf->iBuffer;
hgs
parents: 51
diff changeset
   340
                delete newBuf;
hgs
parents: 51
diff changeset
   341
                LOGTEXT(_L("CProfilerSampleStream::InitialiseBuffers - Out of memory (1)!!"));
hgs
parents: 51
diff changeset
   342
                }
hgs
parents: 51
diff changeset
   343
            }
hgs
parents: 51
diff changeset
   344
        else
hgs
parents: 51
diff changeset
   345
            {
hgs
parents: 51
diff changeset
   346
            LOGTEXT(_L("CProfilerSampleStream::InitialiseBuffers - Out of memory (2)!!"));
hgs
parents: 51
diff changeset
   347
            delete newBuf;
hgs
parents: 51
diff changeset
   348
            }       
20
hgs
parents:
diff changeset
   349
        }
hgs
parents:
diff changeset
   350
    }
hgs
parents:
diff changeset
   351
hgs
parents:
diff changeset
   352
inline void CProfilerSampleStream::EmptyBuffers()
hgs
parents:
diff changeset
   353
    {
hgs
parents:
diff changeset
   354
	LOGTEXT(_L("CProfilerSampleStream::EmptyBuffers - entry"));
hgs
parents:
diff changeset
   355
hgs
parents:
diff changeset
   356
	// delete all free buffers
hgs
parents:
diff changeset
   357
	while(iFreeBuffers != 0)
hgs
parents:
diff changeset
   358
	    {
hgs
parents:
diff changeset
   359
		LOGSTRING2("CProfilerSampleStream::EmptyBuffers - deleting 0x%x",iFreeBuffers);
hgs
parents:
diff changeset
   360
hgs
parents:
diff changeset
   361
		// store the next buffer in the list
hgs
parents:
diff changeset
   362
		TBapBuf* nextFree = iFreeBuffers->iNext;
hgs
parents:
diff changeset
   363
		// delete the first one in the list
hgs
parents:
diff changeset
   364
		delete iFreeBuffers->iBufDes;
hgs
parents:
diff changeset
   365
		delete iFreeBuffers->iDes;
hgs
parents:
diff changeset
   366
		delete iFreeBuffers->iBuffer;
62
hgs
parents: 51
diff changeset
   367
		//delete iFreeBuffers;
hgs
parents: 51
diff changeset
   368
		User::Free(iFreeBuffers);
20
hgs
parents:
diff changeset
   369
		// set the list start to the next buffer
hgs
parents:
diff changeset
   370
		iFreeBuffers = nextFree;
hgs
parents:
diff changeset
   371
	    }
hgs
parents:
diff changeset
   372
	iFreeBuffers = 0;
62
hgs
parents: 51
diff changeset
   373
	// delete all filled buffers
hgs
parents: 51
diff changeset
   374
	    while(iFilledBuffers != 0)
hgs
parents: 51
diff changeset
   375
	        {
hgs
parents: 51
diff changeset
   376
	        LOGSTRING2("CProfilerSampleStream::EmptyBuffers - deleting 0x%x",iFilledBuffers);
hgs
parents: 51
diff changeset
   377
hgs
parents: 51
diff changeset
   378
	        // store the next buffer in the list
hgs
parents: 51
diff changeset
   379
	        TBapBuf* nextFilled = iFilledBuffers->iNext;
hgs
parents: 51
diff changeset
   380
	        // delete the first one in the list
hgs
parents: 51
diff changeset
   381
	        delete iFilledBuffers->iBufDes;
hgs
parents: 51
diff changeset
   382
	        delete iFilledBuffers->iDes;
hgs
parents: 51
diff changeset
   383
	        delete iFilledBuffers->iBuffer;
hgs
parents: 51
diff changeset
   384
	        delete iFilledBuffers;
hgs
parents: 51
diff changeset
   385
	        User::Free(iFilledBuffers);
hgs
parents: 51
diff changeset
   386
	        // set the list start to the next buffer
hgs
parents: 51
diff changeset
   387
	        iFilledBuffers = nextFilled;
hgs
parents: 51
diff changeset
   388
	        }
hgs
parents: 51
diff changeset
   389
	    iFilledBuffers = 0;
20
hgs
parents:
diff changeset
   390
	LOGTEXT(_L("CProfilerSampleStream::EmptyBuffers - exit"));
hgs
parents:
diff changeset
   391
    }
hgs
parents:
diff changeset
   392
hgs
parents:
diff changeset
   393
inline TBapBuf* CProfilerSampleStream::GetNextFreeBuffer()
62
hgs
parents: 51
diff changeset
   394
	{
hgs
parents: 51
diff changeset
   395
	LOGTEXT(_L("CProfilerSampleStream::GetNextFreeBuffer - entry"));
20
hgs
parents:
diff changeset
   396
hgs
parents:
diff changeset
   397
	// get a new buffer from the free buffers list
hgs
parents:
diff changeset
   398
	TBapBuf* nextFree = iFreeBuffers;
hgs
parents:
diff changeset
   399
	
hgs
parents:
diff changeset
   400
	// check if we got a buffer or not
hgs
parents:
diff changeset
   401
	if(nextFree == 0)
hgs
parents:
diff changeset
   402
	    {
hgs
parents:
diff changeset
   403
		// if there are no free buffers,
hgs
parents:
diff changeset
   404
		// create a new one
hgs
parents:
diff changeset
   405
		LOGTEXT(_L("CProfilerSampleStream::GetNextFreeBuffer - creating new buffer"));
hgs
parents:
diff changeset
   406
		TBapBuf* newBuf = (TBapBuf*)User::Alloc(sizeof(TBapBuf));
hgs
parents:
diff changeset
   407
		if(newBuf != 0)
hgs
parents:
diff changeset
   408
		    {
hgs
parents:
diff changeset
   409
			newBuf->iBuffer = (TUint8*)User::Alloc(iBufferSize);
hgs
parents:
diff changeset
   410
			if(newBuf->iBuffer != 0)
hgs
parents:
diff changeset
   411
			    {
hgs
parents:
diff changeset
   412
				newBuf->iBufferSize = iBufferSize;
hgs
parents:
diff changeset
   413
				newBuf->iDataSize = 0;
hgs
parents:
diff changeset
   414
				newBuf->iNext = 0;
hgs
parents:
diff changeset
   415
				newBuf->iDes = new TPtr8((TUint8*)newBuf,sizeof(TBapBuf));
hgs
parents:
diff changeset
   416
				newBuf->iDes->SetLength(sizeof(TBapBuf));
hgs
parents:
diff changeset
   417
				newBuf->iBufDes = new TPtr8((TUint8*)newBuf->iBuffer,iBufferSize);
hgs
parents:
diff changeset
   418
				newBuf->iBufDes->SetLength(iBufferSize);
hgs
parents:
diff changeset
   419
				nextFree = newBuf;
hgs
parents:
diff changeset
   420
			    }
hgs
parents:
diff changeset
   421
			else
hgs
parents:
diff changeset
   422
			    {
62
hgs
parents: 51
diff changeset
   423
			    delete newBuf->iBufDes;
hgs
parents: 51
diff changeset
   424
			    delete newBuf->iDes;
hgs
parents: 51
diff changeset
   425
			    delete newBuf->iBuffer;
hgs
parents: 51
diff changeset
   426
			    delete newBuf;
hgs
parents: 51
diff changeset
   427
			    delete nextFree;
20
hgs
parents:
diff changeset
   428
				LOGTEXT(_L("CProfilerSampleStream::GetNextFreeBuffer - Out of memory (1)!!"));
hgs
parents:
diff changeset
   429
				return 0;
hgs
parents:
diff changeset
   430
			    }
hgs
parents:
diff changeset
   431
		    }
hgs
parents:
diff changeset
   432
		else
hgs
parents:
diff changeset
   433
		    {
hgs
parents:
diff changeset
   434
			LOGTEXT(_L("CProfilerSampleStream::GetNextFreeBuffer - Out of memory (2)!!"));
hgs
parents:
diff changeset
   435
			delete newBuf;
62
hgs
parents: 51
diff changeset
   436
			delete nextFree;
20
hgs
parents:
diff changeset
   437
			return 0;
hgs
parents:
diff changeset
   438
		    }		
62
hgs
parents: 51
diff changeset
   439
	    }// nextFree != 0
20
hgs
parents:
diff changeset
   440
	else
hgs
parents:
diff changeset
   441
	    {
hgs
parents:
diff changeset
   442
		// set the list to point to next free buffer
62
hgs
parents: 51
diff changeset
   443
	    LOGSTRING3("CProfilerSampleStream::GetNextFreeBuffer 0x%x buf 0x%x inext", nextFree, nextFree->iNext);
20
hgs
parents:
diff changeset
   444
		iFreeBuffers = nextFree->iNext;
hgs
parents:
diff changeset
   445
	    }
hgs
parents:
diff changeset
   446
hgs
parents:
diff changeset
   447
	LOGTEXT(_L("CProfilerSampleStream::GetNextFreeBuffer - exit"));
hgs
parents:
diff changeset
   448
	return nextFree;
hgs
parents:
diff changeset
   449
    }
hgs
parents:
diff changeset
   450
hgs
parents:
diff changeset
   451
inline void CProfilerSampleStream::AddToFilledBuffers(TBapBuf* aFilledBuffer)
hgs
parents:
diff changeset
   452
    {
62
hgs
parents: 51
diff changeset
   453
    LOGSTRING4("CProfilerSampleStream::AddToFilledBuffers - entry, size %d aFilledBuffer* 0x%x iNext 0x%x", aFilledBuffer->iDataSize, aFilledBuffer, aFilledBuffer->iNext);
hgs
parents: 51
diff changeset
   454
    //LOGSTRING3("CProfilerSampleStream::AddToFilledBuffers  iFilledBuffers* 0x%x iNext 0x%x",iFilledBuffers, iFilledBuffers->iNext);
20
hgs
parents:
diff changeset
   455
    // add this buffer to the list of filled buffers
hgs
parents:
diff changeset
   456
    if(iFilledBuffers == 0)
hgs
parents:
diff changeset
   457
        {
62
hgs
parents: 51
diff changeset
   458
        LOGSTRING("CProfilerSampleStream::AddToFilledBuffers iFilledBuffers == 0");
20
hgs
parents:
diff changeset
   459
        // the list is empty, so add the the beginning of the list
hgs
parents:
diff changeset
   460
        // there is no next buffer in the list at the moment
hgs
parents:
diff changeset
   461
        aFilledBuffer->iNext = 0;
hgs
parents:
diff changeset
   462
        iFilledBuffers = aFilledBuffer;
hgs
parents:
diff changeset
   463
        }
hgs
parents:
diff changeset
   464
    else
hgs
parents:
diff changeset
   465
        {
62
hgs
parents: 51
diff changeset
   466
        LOGSTRING("CProfilerSampleStream::AddToFilledBuffers iFilledBuffers != 0");
20
hgs
parents:
diff changeset
   467
        // there are buffers in the list, add this buffer to the beginning of the list
62
hgs
parents: 51
diff changeset
   468
        if(aFilledBuffer == iFilledBuffers)
hgs
parents: 51
diff changeset
   469
            {
hgs
parents: 51
diff changeset
   470
            LOGSTRING("CProfilerSampleStream::AddToFilledBuffers iFilledBuffers same");
hgs
parents: 51
diff changeset
   471
            }
hgs
parents: 51
diff changeset
   472
        else
hgs
parents: 51
diff changeset
   473
            {
hgs
parents: 51
diff changeset
   474
            LOGSTRING("CProfilerSampleStream::AddToFilledBuffers iFilledBuffers different");
hgs
parents: 51
diff changeset
   475
            LOGSTRING3("iFilledBuffers 0x%x iFilledBuffers->iNext 0x%x", iFilledBuffers, iFilledBuffers->iNext);
hgs
parents: 51
diff changeset
   476
            if(iFilledBuffers->iNext != 0)
hgs
parents: 51
diff changeset
   477
                {
hgs
parents: 51
diff changeset
   478
                LOGSTRING3("next buf 0x%x ->iNext 0x%x", iFilledBuffers->iNext,iFilledBuffers->iNext->iNext );
hgs
parents: 51
diff changeset
   479
                }
hgs
parents: 51
diff changeset
   480
            }
hgs
parents: 51
diff changeset
   481
            aFilledBuffer->iNext = iFilledBuffers;
hgs
parents: 51
diff changeset
   482
            iFilledBuffers = aFilledBuffer;
20
hgs
parents:
diff changeset
   483
        }
62
hgs
parents: 51
diff changeset
   484
    LOGSTRING3("CProfilerSampleStream::AddToFilledBuffers - exit, iFilledBuffer* 0x%x ->iNext 0x%x", iFilledBuffers, iFilledBuffers->iNext);
hgs
parents: 51
diff changeset
   485
    //LOGTEXT(_L("CProfilerSampleStream::AddToFilledBuffers - exit "));
20
hgs
parents:
diff changeset
   486
    }
hgs
parents:
diff changeset
   487
hgs
parents:
diff changeset
   488
TBapBuf* CProfilerSampleStream::GetNextFilledBuffer()
hgs
parents:
diff changeset
   489
    {
hgs
parents:
diff changeset
   490
    LOGTEXT(_L("CProfilerSampleStream::GetNextFilledBuffer - entry"));
hgs
parents:
diff changeset
   491
    if(iFilledBuffers == 0)
hgs
parents:
diff changeset
   492
        {
hgs
parents:
diff changeset
   493
        // there are no filled buffers in the list
hgs
parents:
diff changeset
   494
        LOGTEXT(_L("CProfilerSampleStream::GetNextFilledBuffer - no filled bufs"));
hgs
parents:
diff changeset
   495
        return 0;
hgs
parents:
diff changeset
   496
        }
hgs
parents:
diff changeset
   497
    else
hgs
parents:
diff changeset
   498
        {   
hgs
parents:
diff changeset
   499
        // get a buffer from the end of the list
hgs
parents:
diff changeset
   500
        TBapBuf* buf = iFilledBuffers;
hgs
parents:
diff changeset
   501
        TBapBuf* prev = 0;
62
hgs
parents: 51
diff changeset
   502
        if(buf)
20
hgs
parents:
diff changeset
   503
            {
62
hgs
parents: 51
diff changeset
   504
            LOGSTRING3("CProfilerSampleStream::GetNextFilledBuffer buf 0x%x, inext 0x%x", buf, buf->iNext);
hgs
parents: 51
diff changeset
   505
            if(buf->iNext == 0)
hgs
parents: 51
diff changeset
   506
                {
hgs
parents: 51
diff changeset
   507
                // this was the last (and only) buffer
hgs
parents: 51
diff changeset
   508
                iFilledBuffers = 0;
hgs
parents: 51
diff changeset
   509
                LOGTEXT(_L("CProfilerSampleStream::GetNextFilledBuffer - last filled"));
hgs
parents: 51
diff changeset
   510
                return buf;
hgs
parents: 51
diff changeset
   511
                }
hgs
parents: 51
diff changeset
   512
            else
20
hgs
parents:
diff changeset
   513
                {
62
hgs
parents: 51
diff changeset
   514
                LOGSTRING2("CProfilerSampleStream::GetNextFilledBuffer - searching last filled, inext 0x%x ", buf->iNext);
hgs
parents: 51
diff changeset
   515
                while(buf->iNext != 0)
hgs
parents: 51
diff changeset
   516
                    {
hgs
parents: 51
diff changeset
   517
                    // there are two or more buffers in the list
hgs
parents: 51
diff changeset
   518
                    // proceed until the end of the list is found
hgs
parents: 51
diff changeset
   519
                    LOGSTRING3("CProfilerSampleStream::GetNextFilledBuffer - searching. buf 0x%x, inext 0x%x", buf, buf->iNext);
hgs
parents: 51
diff changeset
   520
                    prev = buf;
hgs
parents: 51
diff changeset
   521
                    buf = buf->iNext;
hgs
parents: 51
diff changeset
   522
                    }
hgs
parents: 51
diff changeset
   523
                // now buf->next is 0, return buf and set the next
hgs
parents: 51
diff changeset
   524
                // element of prev to NULL
hgs
parents: 51
diff changeset
   525
                prev->iNext = 0;
hgs
parents: 51
diff changeset
   526
                LOGSTRING3("CProfilerSampleStream::GetNextFilledBuffer - found last. buf 0x%x, iNext 0x%x", buf, buf->iNext);
hgs
parents: 51
diff changeset
   527
                return buf;
20
hgs
parents:
diff changeset
   528
                }
hgs
parents:
diff changeset
   529
            }
62
hgs
parents: 51
diff changeset
   530
        else{
hgs
parents: 51
diff changeset
   531
            LOGTEXT(_L("CProfilerSampleStream::GetNextFilledBuffer - nullihan se siellä"));
hgs
parents: 51
diff changeset
   532
            }   
20
hgs
parents:
diff changeset
   533
        }
hgs
parents:
diff changeset
   534
    }
hgs
parents:
diff changeset
   535
hgs
parents:
diff changeset
   536
inline void CProfilerSampleStream::AddToFreeBuffers(TBapBuf* aFreeBuffer)
hgs
parents:
diff changeset
   537
    {
hgs
parents:
diff changeset
   538
	LOGTEXT(_L("CProfilerSampleStream::AddToFreeBuffers - entry"));
hgs
parents:
diff changeset
   539
hgs
parents:
diff changeset
   540
	// set data size of the buffer to 0
hgs
parents:
diff changeset
   541
	aFreeBuffer->iDataSize = 0;
hgs
parents:
diff changeset
   542
hgs
parents:
diff changeset
   543
	// add this buffer to the list of free buffers
hgs
parents:
diff changeset
   544
	if(iFreeBuffers == 0)
hgs
parents:
diff changeset
   545
	    {
hgs
parents:
diff changeset
   546
		// this is the first buffer, so set the next to point to NULL
hgs
parents:
diff changeset
   547
	    aFreeBuffer->iNext = 0;
hgs
parents:
diff changeset
   548
	    }
hgs
parents:
diff changeset
   549
	else
hgs
parents:
diff changeset
   550
	    {
hgs
parents:
diff changeset
   551
		// otherwise set to point to the beginning of the list
hgs
parents:
diff changeset
   552
	    aFreeBuffer->iNext = iFreeBuffers;
hgs
parents:
diff changeset
   553
	    }
hgs
parents:
diff changeset
   554
hgs
parents:
diff changeset
   555
	// set this buffer to be the first one in the list
hgs
parents:
diff changeset
   556
	iFreeBuffers = aFreeBuffer;
hgs
parents:
diff changeset
   557
62
hgs
parents: 51
diff changeset
   558
	LOGSTRING3("CProfilerSampleStream::AddToFreeBuffers - exit iFreeBuffers 0x%x iFreeBuffers->iNext 0x%x",iFreeBuffers, iFreeBuffers->iNext);
20
hgs
parents:
diff changeset
   559
    }
hgs
parents:
diff changeset
   560
hgs
parents:
diff changeset
   561
void CProfilerSampleStream::NotifyWriter()
hgs
parents:
diff changeset
   562
    {
hgs
parents:
diff changeset
   563
    // notify writer plugin to write data from filled buffer list
hgs
parents:
diff changeset
   564
    LOGTEXT(_L("CProfilerSampleStream::NotifyWriter() - entry"));
hgs
parents:
diff changeset
   565
    iWriter->WriteData();
hgs
parents:
diff changeset
   566
    LOGTEXT(_L("CProfilerSampleStream::NotifyWriter() - exit"));
hgs
parents:
diff changeset
   567
    }
hgs
parents:
diff changeset
   568
hgs
parents:
diff changeset
   569
// end of file
hgs
parents:
diff changeset
   570
hgs
parents:
diff changeset
   571
hgs
parents:
diff changeset
   572