sl@0: // Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of the License "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // Kernel Event handler for Run Mode Debug. sl@0: // sl@0: sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: sl@0: #include sl@0: #include "debug_logging.h" sl@0: #include "d_process_tracker.h" sl@0: #include "d_rmd_stepping.h" sl@0: #include "rm_debug_kerneldriver.h" sl@0: #include "rm_debug_driver.h" sl@0: #include "rm_debug_eventhandler.h" sl@0: sl@0: sl@0: DRM_DebugEventHandler::DRM_DebugEventHandler() sl@0: : DKernelEventHandler(EventHandler, this) sl@0: { sl@0: LOG_MSG("DRM_DebugEventHandler::DRM_DebugEventHandler()"); sl@0: sl@0: for(TInt i=0; iOpen(); sl@0: if (err != KErrNone) sl@0: return err; sl@0: iDevice = aDevice; sl@0: sl@0: iChannel = (DRM_DebugChannel*)aChannel; //Don't add ref the channel, since channel closes the event handler before it ever gets destroyed. sl@0: sl@0: err = aClient->Open(); sl@0: if (err != KErrNone) sl@0: return err; sl@0: iClientThread = aClient; sl@0: sl@0: // Use a semaphore to protect our data structures from concurrent access. sl@0: err = Kern::SemaphoreCreate(iLock, _L("RM_DebugEventHandlerLock"), 1 /* Initial count */); sl@0: if (err != KErrNone) sl@0: return err; sl@0: sl@0: sl@0: return Add(); sl@0: } sl@0: sl@0: sl@0: DRM_DebugEventHandler::~DRM_DebugEventHandler() sl@0: { sl@0: LOG_MSG("DRM_DebugEventHandler::~DRM_DebugEventHandler()"); sl@0: sl@0: if (iLock) sl@0: iLock->Close(NULL); sl@0: sl@0: if (iDevice) sl@0: iDevice->Close(NULL); sl@0: sl@0: if (iClientThread) sl@0: Kern::SafeClose((DObject*&)iClientThread, NULL); sl@0: sl@0: } sl@0: sl@0: sl@0: TInt DRM_DebugEventHandler::Start() sl@0: { sl@0: LOG_MSG("DRM_DebugEventHandler::Start()"); sl@0: sl@0: iTracking = ETrue; sl@0: sl@0: return KErrNone; sl@0: } sl@0: sl@0: sl@0: TInt DRM_DebugEventHandler::Stop() sl@0: { sl@0: LOG_MSG("DRM_DebugEventHandler::Stop()"); sl@0: sl@0: iTracking = EFalse; sl@0: sl@0: return KErrNone; sl@0: } sl@0: sl@0: sl@0: TUint DRM_DebugEventHandler::EventHandler(TKernelEvent aType, TAny* a1, TAny* a2, TAny* aThis) sl@0: { sl@0: return ((DRM_DebugEventHandler*)aThis)->HandleEvent(aType, a1, a2); sl@0: } sl@0: sl@0: sl@0: sl@0: TUint DRM_DebugEventHandler::HandleEvent(TKernelEvent aType, TAny* a1, TAny* a2) sl@0: { sl@0: if((!iTracking) || (aType > (TUint32)EEventLimit)) sl@0: { sl@0: return ERunNext; sl@0: } sl@0: return HandleSpecificEvent(aType,a1,a2) ? EExcHandled : ERunNext; sl@0: } sl@0: sl@0: TBool DRM_DebugEventHandler::HandleSpecificEvent(TKernelEvent aType, TAny* a1, TAny* a2) sl@0: { sl@0: TBool ret = EFalse; sl@0: sl@0: NKern::ThreadEnterCS(); sl@0: Kern::SemaphoreWait(*iLock); sl@0: sl@0: if (iChannel) sl@0: { sl@0: ret = (iChannel->*(iEventHandlers[aType]))(a1, a2); sl@0: } sl@0: sl@0: Kern::SemaphoreSignal(*iLock); sl@0: NKern::ThreadLeaveCS(); sl@0: sl@0: switch(aType) sl@0: { sl@0: case EEventHwExc: sl@0: case EEventKillThread: sl@0: { sl@0: LOG_MSG2("DRM_DebugEventHandler::HandleEvent() -> FSWait(), kernel event type: %d", (TUint32)aType); sl@0: TheDProcessTracker.FSWait(); sl@0: LOG_MSG("DRM_DebugEventHandler::HandleEvent() <- FSWait()"); sl@0: break; sl@0: } sl@0: default: sl@0: break; sl@0: } sl@0: return ret; sl@0: } sl@0: