kerneltest/e32test/debug/d_eventtracker.h
author Mike Kinghan <mikek@symbian.org>
Mon, 19 Jul 2010 14:32:36 +0100
branchGCC_SURGE
changeset 210 b592f7984442
parent 0 a41df078684a
permissions -rw-r--r--
Fix for bug 3292 - [GCCE] Possible undefined behaviour warning in kerneltest/f32test/server/t_fatcharsetconv_SpecificCases.cpp Fix for bug 3293 - [GCCE] Incorrect operator precedence assumptions in kerneltest/f32test/server/t_fsrv.cpp Fix for bug 3295 - [GCCE] deprecated conversion from string constant to 'char*' in f32test build Fix for bug 3297 - [GCCE] Operator precedence warnings in kerneltest/f32test/demandpaging/t_nandpaging.cpp Fix for bug 3309 - [GCCE] Terminal backslashes in comments are parsed as line-continuations in f32test

// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
// All rights reserved.
// This component and the accompanying materials are made available
// under the terms of the License "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:
// e32test/debug/d_eventtracker.h
// 
//

#ifndef __D_EVENTTRACKER_H__
#define __D_EVENTTRACKER_H__

#include "platform.h"


/** Base class for representing objects being tracked.  */

class TTrackedItem
	{
public:
	TTrackedItem(const DBase* aObject);
	
public:
	SDblQueLink iLink;
	const DBase* const iObject; 		// key
	TBool iAccountedFor;
	};

/** Subclass for representing DObjects being tracked.  */

class TTrackedObject : public TTrackedItem
	{
public:
	TTrackedObject(DObject* aObject, TObjectType aType);
	TBool CheckIntegrity(const TDesC& aName, TObjectType aType) const;

public:
	TFullName iFullName;
	const TObjectType iType;
	};

/** Subclass for representing DCodeSegs being tracked.  */

class TTrackedCodeSeg : public TTrackedItem
	{
public:
	TTrackedCodeSeg(const DCodeSeg* aCodeSeg);
	TBool CheckIntegrity(TInt aAccessCount) const;

public:
	TInt iAccessCount;
	};


/** Event handler and container for all objects being tracked.  */

class DEventTracker : public DKernelEventHandler
	{
public:
	DEventTracker();
	TInt Create(DLogicalDevice* aDevice, TBool aUseHook);
	~DEventTracker();
	TInt Start();
	TInt Stop();

private:
	static TUint EventHandler(TKernelEvent aEvent, TAny* a1, TAny* a2, TAny* aThis);
	TUint HandleEvent(TKernelEvent aType, TAny* a1, TAny* a2);
	TInt AddExistingObjects();
	TInt AddObjectsFromContainer(TObjectType aType);
	TInt AddCodeSegsFromList();
	TInt CheckIntegrity();
	void CheckContainerIntegrity(TObjectType aType);
	void CheckCodeSegListIntegrity();
	void CheckAllAccountedFor();

	TTrackedItem* LookupItem(DBase* aItem) const;

	void AddObject(TObjectType aType, DObject* aObject);
	void RemoveObject(TObjectType aType, DObject* aObject);
	void UpdateObject(TObjectType aType, DObject* aObject, TBool aMustBeRenamed);
	void AddCodeSeg(DCodeSeg* aCodeSeg, DProcess* aProcess);
	void RemoveCodeSeg(DCodeSeg* aCodeSeg, DProcess* aProcess);
	void ProcessLoaded(DProcess* aProcess);

	void StopTracking();
	void DumpCounters() const;

	static void BranchToEventHandler();
	static TUint BreakPointSize();

	// Dummy handler to be copied into RAM
	static TUint DummyHandler(TKernelEvent aEvent, TAny* a1, TAny* a2);

	// Size of dummy handler
	static TUint DummyHandlerSize();

	// Copy the default handler
	static void CopyDummyHandler(TLinAddr aLinAddr);

private:
	/** Lock serialising calls to event handler */
	DMutex* iLock;
	TBool iTracking;
	/** Tracking list (of TTrackedItem).
		Must be accessed only when tracking is disabled or with iLock held.
		Object addresses are used as keys and so must be unique.
	 */
	SDblQue iItems;
	TInt iOOM;
	TInt iErrorCount;
	TInt iCounters[EEventLimit];
	DLogicalDevice* iDevice;	// open reference to LDD for avoiding lifetime issues
	};

GLREF_D DEventTracker* TheEventTracker;

#endif // __D_EVENTTRACKER_H__