kernel/eka/drivers/debug/rmdebug/rm_debug_eventhandler.cpp
changeset 90 947f0dc9f7a8
parent 0 a41df078684a
--- a/kernel/eka/drivers/debug/rmdebug/rm_debug_eventhandler.cpp	Tue Feb 02 01:24:03 2010 +0200
+++ b/kernel/eka/drivers/debug/rmdebug/rm_debug_eventhandler.cpp	Fri Apr 16 16:24:37 2010 +0300
@@ -44,7 +44,6 @@
 	iEventHandlers[EEventUserTrace] = &DRM_DebugChannel::HandleUserTrace;
 	iEventHandlers[EEventRemoveLibrary] = &DRM_DebugChannel::RemoveLibrary;
 	iEventHandlers[EEventAddLibrary] = &DRM_DebugChannel::AddLibrary;
-	iEventHandlers[EEventRemoveProcess] = &DRM_DebugChannel::RemoveProcess;
 	iEventHandlers[EEventStartThread] = &DRM_DebugChannel::StartThread;
 	iEventHandlers[EEventSwExc] = &DRM_DebugChannel::HandleSwException;
 	iEventHandlers[EEventHwExc] = &DRM_DebugChannel::HandleHwException;
@@ -55,7 +54,7 @@
 
 TInt DRM_DebugEventHandler::Create(DLogicalDevice* aDevice, DLogicalChannel* aChannel, DThread* aClient)
 {
-	LOG_MSG("DRM_DebugEventHandler::Create()");
+	LOG_MSG3("DRM_DebugEventHandler::Create(), aClientthread=0x%08x id=%d", aClient, aClient->iId);
 
 	TInt err;
 	err = aDevice->Open();
@@ -71,7 +70,7 @@
 	iClientThread = aClient;
 
 	// Use a semaphore to protect our data structures from concurrent access.
-	err = Kern::SemaphoreCreate(iLock, _L("RM_DebugEventHandlerLock"), 1 /* Initial count */);
+	err = Kern::SemaphoreCreate(iProtectionLock, _L("RM_DebugEventHandlerLock"), 1 /* Initial count */);
 	if (err != KErrNone)
 		return err;
 
@@ -84,8 +83,8 @@
 {
 	LOG_MSG("DRM_DebugEventHandler::~DRM_DebugEventHandler()");
 
-	if (iLock)
-		iLock->Close(NULL);
+	if (iProtectionLock)
+		iProtectionLock->Close(NULL);
 	
 	if (iDevice)
 		iDevice->Close(NULL);	
@@ -125,7 +124,17 @@
 
 TUint DRM_DebugEventHandler::HandleEvent(TKernelEvent aType, TAny* a1, TAny* a2)
 	{
-	if((!iTracking) || (aType > (TUint32)EEventLimit))
+	
+	/*
+	 * Check if we are tracking things at all OR 
+	 * this event is beyond the limit of known events OR 
+	 * this event is from the debug thread itself (don't want to debug ourselves) OR
+	 * this event has a handler (there is no point in proceeding without a handler)
+	 */
+	if( (!iTracking) || 
+			(aType > (TUint32)EEventLimit) ||
+			(iClientThread == &Kern::CurrentThread()) ||
+	    (iEventHandlers[aType] == &DRM_DebugChannel::HandleUnsupportedEvent) )
 		{
 		return ERunNext;
 		}
@@ -137,14 +146,14 @@
 	TBool ret = EFalse;
 
 	NKern::ThreadEnterCS();
-	Kern::SemaphoreWait(*iLock);
-	
+	LockDataAccess();
+
+
 	if (iChannel)
 		{
 		ret = (iChannel->*(iEventHandlers[aType]))(a1, a2);
 		}
-
-	Kern::SemaphoreSignal(*iLock);
+	ReleaseDataAccess();
 	NKern::ThreadLeaveCS();
 
 	switch(aType)