piprofiler/plugins/GeneralsPlugin/inc/MemoryEventHandler.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 27 May 2010 14:26:55 +0300
changeset 22 a009639409f5
permissions -rw-r--r--
Revision: 201021 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:  
*
*/
#include "MemSamplerImpl.h"

#ifndef __PI_MEMORY_EVENT_HANDLER__
#define __PI_MEMORY_EVENT_HANDLER__

#include <piprofiler/ProfilerGenericClassesKrn.h>

// CONSTANTS
const TInt KEventBufferSize = 257;

class DProfilerSampleBuffer;

class DMemoryEventHandler : public DKernelEventHandler
    {
public:
    // constructor
    DMemoryEventHandler(DProfilerSampleBuffer*  aSampleBuffer);
    TInt Create();
    ~DMemoryEventHandler();
    TInt Start();
    TInt Stop();
    TBool Tracking() {return iTracking;}
       
    TBool SampleNeeded();
    
private:
    static TUint EventHandler(TKernelEvent aEvent, TAny* a1, TAny* a2, TAny* aThis);
    TUint HandleEvent(TKernelEvent aType, TAny* a1, TAny* a2);
    // handle chunk activity
    TBool HandleAddChunk(DChunk* aChunk);
    TBool HandleUpdateChunk(DChunk* aChunk);
    TBool HandleDeleteChunk(DChunk* aChunk);
    // handle chunk activity
    TBool HandleAddThread(DThread* aThread);
    TBool HandleUpdateThread(DThread* aThread);
    TBool HandleDeleteThread(DThread* aThread);
    // handle chunk activity
    TBool HandleAddProcess(DProcess* aProcess);
    TBool HandleUpdateProcess(DProcess* aProcess);
    TBool HandleDeleteProcess(DProcess* aProcess);
    // handle library activity
    TBool HandleAddLibrary(DLibrary* aLibrary, DThread* aThread);
    TBool HandleDeleteLibrary(DLibrary* aLibrary);
    
    // data handling
    TInt AddHeader();
    TInt AddFooter();
    TInt EncodeTotalMemory();
    TInt EncodeNameCode();
    TInt EncodeNewCode();
    TInt EncodeUpdateCode();
    TInt EncodeRemoveCode();
    TInt EncodeChunkName(DThread& t);
    TInt EncodeChunkName(DChunk& c);
    TInt EncodeChunkName(DLibrary& l);
    TInt EncodeChunkData(DThread& t);
    TInt EncodeChunkData(DChunk& c);
    TInt EncodeChunkData(DLibrary& l, DThread& t);
private:
    /** Lock serialising calls to event handler */
    DMutex* iLock;
    TBool iTracking;

    DProfilerSampleBuffer*  iSampleBuffer;
    TInt iCounters[EEventLimit];
    
    TUint32     iCount;
    
    TUint8      iSample[KEventBufferSize];
    TPtr8       iSampleDescriptor;
    
    TUint32     iPreviousCount;
    };

#endif