debugsrv/runmodedebug/rmdriver/inc/d_debug_agent.h
author hgs
Fri, 27 Aug 2010 11:37:29 +0300
changeset 42 0ff24a8f6ca2
child 56 aa2539c91954
permissions -rw-r--r--
201033
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
42
hgs
parents:
diff changeset
     1
// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     2
// All rights reserved.
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
hgs
parents:
diff changeset
     4
// under the terms of the License "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     7
//
hgs
parents:
diff changeset
     8
// Initial Contributors:
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    10
//
hgs
parents:
diff changeset
    11
// Contributors:
hgs
parents:
diff changeset
    12
//
hgs
parents:
diff changeset
    13
// Description:
hgs
parents:
diff changeset
    14
// Purpose: Kernel-side tracking of debug agent information associated
hgs
parents:
diff changeset
    15
// with each process being debugged.
hgs
parents:
diff changeset
    16
// 
hgs
parents:
diff changeset
    17
//
hgs
parents:
diff changeset
    18
hgs
parents:
diff changeset
    19
#ifndef D_DEBUG_AGENT_H
hgs
parents:
diff changeset
    20
#define D_DEBUG_AGENT_H
hgs
parents:
diff changeset
    21
hgs
parents:
diff changeset
    22
#include <rm_debug_api.h>
hgs
parents:
diff changeset
    23
#include "d_driver_event_info.h"
hgs
parents:
diff changeset
    24
hgs
parents:
diff changeset
    25
/**
hgs
parents:
diff changeset
    26
* Handles events from the kernel, filters them according to the debug agent's requests, 
hgs
parents:
diff changeset
    27
* and signals these events to the user side in FIFO-style. 
hgs
parents:
diff changeset
    28
* @see TKernelEventAction
hgs
parents:
diff changeset
    29
* @see TEventInfo
hgs
parents:
diff changeset
    30
*/
hgs
parents:
diff changeset
    31
class DDebugAgent : public DBase
hgs
parents:
diff changeset
    32
	{
hgs
parents:
diff changeset
    33
public:
hgs
parents:
diff changeset
    34
	static DDebugAgent* New(TUint64 aId);
hgs
parents:
diff changeset
    35
	~DDebugAgent();
hgs
parents:
diff changeset
    36
hgs
parents:
diff changeset
    37
	TInt SetEventAction(Debug::TEventType aEvent, Debug::TKernelEventAction aEventAction);
hgs
parents:
diff changeset
    38
	void GetEvent(TClientDataRequest<Debug::TEventInfo>* aAsyncGetValueRequest, DThread* aClientThread);
hgs
parents:
diff changeset
    39
	TInt EventAction(Debug::TEventType aEvent);
hgs
parents:
diff changeset
    40
hgs
parents:
diff changeset
    41
	TInt CancelGetEvent(void);
hgs
parents:
diff changeset
    42
	void NotifyEvent(const TDriverEventInfo& aEventInfo);
hgs
parents:
diff changeset
    43
	TUint64 Id();
hgs
parents:
diff changeset
    44
hgs
parents:
diff changeset
    45
protected:
hgs
parents:
diff changeset
    46
	DDebugAgent(TUint64 aId);
hgs
parents:
diff changeset
    47
	TInt Construct();
hgs
parents:
diff changeset
    48
hgs
parents:
diff changeset
    49
private:
hgs
parents:
diff changeset
    50
	void QueueEvent(const TDriverEventInfo& aEventInfo);
hgs
parents:
diff changeset
    51
	TBool BufferEmpty() const;
hgs
parents:
diff changeset
    52
	TBool BufferFull() const;
hgs
parents:
diff changeset
    53
	TBool BufferCanStoreEvent() const;
hgs
parents:
diff changeset
    54
	TBool BufferAtCriticalLevel() const;
hgs
parents:
diff changeset
    55
	void IncrementHeadPosition(void);
hgs
parents:
diff changeset
    56
	void IncrementTailPosition(void);
hgs
parents:
diff changeset
    57
	TInt NumberOfEmptySlots() const;
hgs
parents:
diff changeset
    58
	void LockEventQueue(void);
hgs
parents:
diff changeset
    59
	void UnlockEventQueue(void);
hgs
parents:
diff changeset
    60
hgs
parents:
diff changeset
    61
private:
hgs
parents:
diff changeset
    62
hgs
parents:
diff changeset
    63
	TUint64	iId;
hgs
parents:
diff changeset
    64
	Debug::TKernelEventAction iEventActions[Debug::EEventsLast];
hgs
parents:
diff changeset
    65
hgs
parents:
diff changeset
    66
	/**
hgs
parents:
diff changeset
    67
	* Object used to write events back to DSS thread
hgs
parents:
diff changeset
    68
	* @see TEventInfo
hgs
parents:
diff changeset
    69
	*/
hgs
parents:
diff changeset
    70
	TClientDataRequest<Debug::TEventInfo>* iRequestGetEventStatus;
hgs
parents:
diff changeset
    71
hgs
parents:
diff changeset
    72
	DThread* iClientThread;
hgs
parents:
diff changeset
    73
hgs
parents:
diff changeset
    74
	/** 
hgs
parents:
diff changeset
    75
	* Ring buffer of pending events. Access to it is controlled by 
hgs
parents:
diff changeset
    76
	* @see iEventQueueLock
hgs
parents:
diff changeset
    77
	*/
hgs
parents:
diff changeset
    78
	RArray<TDriverEventInfo> iEventQueue;
hgs
parents:
diff changeset
    79
hgs
parents:
diff changeset
    80
	/**
hgs
parents:
diff changeset
    81
	* Ring buffer head. Points to the next empty slot in iEventQueue
hgs
parents:
diff changeset
    82
	* @see iEventQueue
hgs
parents:
diff changeset
    83
	*/
hgs
parents:
diff changeset
    84
	TInt iHead;	
hgs
parents:
diff changeset
    85
hgs
parents:
diff changeset
    86
	/**
hgs
parents:
diff changeset
    87
	* Ring buffer tail. Points to the oldest full slot in iEventQueue
hgs
parents:
diff changeset
    88
	* @see iEventQueue 
hgs
parents:
diff changeset
    89
	*/
hgs
parents:
diff changeset
    90
	TInt iTail;
hgs
parents:
diff changeset
    91
hgs
parents:
diff changeset
    92
	/** 
hgs
parents:
diff changeset
    93
	* Control access to event queue.
hgs
parents:
diff changeset
    94
	* @see iEventQueue
hgs
parents:
diff changeset
    95
	*/
hgs
parents:
diff changeset
    96
	DSemaphore* iEventQueueLock;
hgs
parents:
diff changeset
    97
hgs
parents:
diff changeset
    98
	/**
hgs
parents:
diff changeset
    99
	* Keeps track of how many free slots are available in the event queue.
hgs
parents:
diff changeset
   100
	* @see iEventQueue
hgs
parents:
diff changeset
   101
	*/
hgs
parents:
diff changeset
   102
	TInt iFreeSlots;
hgs
parents:
diff changeset
   103
hgs
parents:
diff changeset
   104
	/**
hgs
parents:
diff changeset
   105
	* Boolean to indicate if we have told the agent that we are ignoring trace events
hgs
parents:
diff changeset
   106
	* @see QueueEvent
hgs
parents:
diff changeset
   107
	*/
hgs
parents:
diff changeset
   108
	TBool iIgnoringTrace;
hgs
parents:
diff changeset
   109
	
hgs
parents:
diff changeset
   110
	/**
hgs
parents:
diff changeset
   111
	* Used to control the delivery of events to the client so that only 
hgs
parents:
diff changeset
   112
	* when more requests than deliveries have taken place can we deliver the 
hgs
parents:
diff changeset
   113
	* next event
hgs
parents:
diff changeset
   114
	* 
hgs
parents:
diff changeset
   115
	* Incremented when a request for event takes place
hgs
parents:
diff changeset
   116
	* @see GetEvent
hgs
parents:
diff changeset
   117
	* 
hgs
parents:
diff changeset
   118
	* Decremented when an event is delivered. 
hgs
parents:
diff changeset
   119
	* @see NotifyEvent
hgs
parents:
diff changeset
   120
	* 
hgs
parents:
diff changeset
   121
	* Cleared when event requests are cancelled
hgs
parents:
diff changeset
   122
	* @see CancelGetEvent
hgs
parents:
diff changeset
   123
	* 
hgs
parents:
diff changeset
   124
	*/
hgs
parents:
diff changeset
   125
	TInt   iEventBalance;
hgs
parents:
diff changeset
   126
hgs
parents:
diff changeset
   127
	/**
hgs
parents:
diff changeset
   128
	* Length of kernel-event queue.
hgs
parents:
diff changeset
   129
	* This is a power of two for efficiency when using the 
hgs
parents:
diff changeset
   130
	* remainder operator
hgs
parents:
diff changeset
   131
	* @see DDebugAgent::iEventQueue
hgs
parents:
diff changeset
   132
	*/
hgs
parents:
diff changeset
   133
	static const TUint KNumberOfEventsToQueue = 128;
hgs
parents:
diff changeset
   134
hgs
parents:
diff changeset
   135
	/**
hgs
parents:
diff changeset
   136
	* This determines the number of events at which we stop accepting 
hgs
parents:
diff changeset
   137
	* low priority events into the event queue.
hgs
parents:
diff changeset
   138
	* @see DDebugAgent::BufferAtCriticalLevel
hgs
parents:
diff changeset
   139
	* @see DDebugAgent::iEventQueue
hgs
parents:
diff changeset
   140
	*/
hgs
parents:
diff changeset
   141
	static const TUint KCriticalBufferSize = 64;
hgs
parents:
diff changeset
   142
hgs
parents:
diff changeset
   143
	/**
hgs
parents:
diff changeset
   144
	* If we encounter an event that will take down the agent (eg a process critical thread crashing)
hgs
parents:
diff changeset
   145
	* we use this flag to stop trying to deliver thread death notifications to it.
hgs
parents:
diff changeset
   146
	*/
hgs
parents:
diff changeset
   147
	TBool iAgentDying;
hgs
parents:
diff changeset
   148
	};
hgs
parents:
diff changeset
   149
hgs
parents:
diff changeset
   150
#endif // D_DEBUG_AGENT_H
hgs
parents:
diff changeset
   151