debugsrv/runmodedebug/tsrc/rm_debug/multi_target_tests/t_multi_target.cpp
author hgs
Fri, 08 Oct 2010 14:56:39 +0300
changeset 56 aa2539c91954
permissions -rw-r--r--
201041
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
56
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 "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
// Test the ability of the debug system to handle events from several debug targets
hgs
parents:
diff changeset
    15
//
hgs
parents:
diff changeset
    16
//
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
#include <e32base.h>
hgs
parents:
diff changeset
    19
#include <e32property.h>
hgs
parents:
diff changeset
    20
hgs
parents:
diff changeset
    21
#include <hal.h>
hgs
parents:
diff changeset
    22
#include <e32test.h>
hgs
parents:
diff changeset
    23
hgs
parents:
diff changeset
    24
#include "t_multi_target.h"
hgs
parents:
diff changeset
    25
#include "t_target_launcher.h"
hgs
parents:
diff changeset
    26
#include "t_rmdebug_app.h"
hgs
parents:
diff changeset
    27
hgs
parents:
diff changeset
    28
#ifdef KERNEL_OOM_TESTING
hgs
parents:
diff changeset
    29
  #ifdef USER_OOM_TESTING
hgs
parents:
diff changeset
    30
    #error "Cannot define both KERNEL_OOM_TESTING and USER_OOM_TESTING"
hgs
parents:
diff changeset
    31
  #endif
hgs
parents:
diff changeset
    32
#endif
hgs
parents:
diff changeset
    33
hgs
parents:
diff changeset
    34
hgs
parents:
diff changeset
    35
using namespace Debug;
hgs
parents:
diff changeset
    36
hgs
parents:
diff changeset
    37
const TVersion securityServerVersion(0,1,1);
hgs
parents:
diff changeset
    38
hgs
parents:
diff changeset
    39
const TVersion testVersion(2,1,0);
hgs
parents:
diff changeset
    40
hgs
parents:
diff changeset
    41
#ifdef NO_DEBUGTOKEN
hgs
parents:
diff changeset
    42
LOCAL_D RTest test(_L("T_RMDEBUG_MULTI_TARGET"));
hgs
parents:
diff changeset
    43
#endif
hgs
parents:
diff changeset
    44
hgs
parents:
diff changeset
    45
#ifdef SOMECAPS_DEBUGTOKEN
hgs
parents:
diff changeset
    46
LOCAL_D RTest test(_L("T_RMDEBUG_MULTI_TARGET_OEM"));
hgs
parents:
diff changeset
    47
#endif
hgs
parents:
diff changeset
    48
hgs
parents:
diff changeset
    49
#ifdef FEWCAPS_DEBUGTOKEN
hgs
parents:
diff changeset
    50
LOCAL_D RTest test(_L("T_RMDEBUG_MULTI_TARGET_OEM2"));
hgs
parents:
diff changeset
    51
#endif
hgs
parents:
diff changeset
    52
hgs
parents:
diff changeset
    53
hgs
parents:
diff changeset
    54
hgs
parents:
diff changeset
    55
CMultiTargetAgent* CMultiTargetAgent::NewL()
hgs
parents:
diff changeset
    56
//
hgs
parents:
diff changeset
    57
// CMultiTargetAgent::NewL
hgs
parents:
diff changeset
    58
//
hgs
parents:
diff changeset
    59
  {
hgs
parents:
diff changeset
    60
  CMultiTargetAgent* self = new(ELeave) CMultiTargetAgent();
hgs
parents:
diff changeset
    61
hgs
parents:
diff changeset
    62
  self->ConstructL();
hgs
parents:
diff changeset
    63
hgs
parents:
diff changeset
    64
  return self;
hgs
parents:
diff changeset
    65
  }
hgs
parents:
diff changeset
    66
hgs
parents:
diff changeset
    67
hgs
parents:
diff changeset
    68
CMultiTargetAgent::~CMultiTargetAgent()
hgs
parents:
diff changeset
    69
//
hgs
parents:
diff changeset
    70
// CMultiTargetAgent destructor
hgs
parents:
diff changeset
    71
//
hgs
parents:
diff changeset
    72
    {
hgs
parents:
diff changeset
    73
    RDebug::Printf("~CMultiTargetAgent\n");
hgs
parents:
diff changeset
    74
    iServSession.Close();
hgs
parents:
diff changeset
    75
    }
hgs
parents:
diff changeset
    76
hgs
parents:
diff changeset
    77
hgs
parents:
diff changeset
    78
CMultiTargetAgent::CMultiTargetAgent() : 
hgs
parents:
diff changeset
    79
    iEventPtr( (TUint8*)&iEventInfo, sizeof(TEventInfo) )
hgs
parents:
diff changeset
    80
    {
hgs
parents:
diff changeset
    81
    }
hgs
parents:
diff changeset
    82
hgs
parents:
diff changeset
    83
hgs
parents:
diff changeset
    84
void CMultiTargetAgent::ConstructL()
hgs
parents:
diff changeset
    85
//
hgs
parents:
diff changeset
    86
// CMultiTargetAgent::ConstructL
hgs
parents:
diff changeset
    87
//
hgs
parents:
diff changeset
    88
  {
hgs
parents:
diff changeset
    89
  }
hgs
parents:
diff changeset
    90
hgs
parents:
diff changeset
    91
/**
hgs
parents:
diff changeset
    92
 * Helper code for the stepping tests. Returns the number of nanokernel ticks in one second.
hgs
parents:
diff changeset
    93
 *
hgs
parents:
diff changeset
    94
 * @return Number of nanokernel ticks. 0 if unsuccesful.
hgs
parents:
diff changeset
    95
 */
hgs
parents:
diff changeset
    96
TInt CMultiTargetAgent::HelpTicksPerSecond(void)
hgs
parents:
diff changeset
    97
  {
hgs
parents:
diff changeset
    98
  TInt nanokernel_tick_period;
hgs
parents:
diff changeset
    99
  HAL::Get(HAL::ENanoTickPeriod, nanokernel_tick_period);
hgs
parents:
diff changeset
   100
hgs
parents:
diff changeset
   101
  ASSERT(nanokernel_tick_period != 0);
hgs
parents:
diff changeset
   102
hgs
parents:
diff changeset
   103
  static const TInt KOneMillion = 1000000;
hgs
parents:
diff changeset
   104
hgs
parents:
diff changeset
   105
  return KOneMillion/nanokernel_tick_period;
hgs
parents:
diff changeset
   106
  }
hgs
parents:
diff changeset
   107
hgs
parents:
diff changeset
   108
void CMultiTargetAgent::ClientAppL()
hgs
parents:
diff changeset
   109
//
hgs
parents:
diff changeset
   110
// Performs each test in turn
hgs
parents:
diff changeset
   111
//
hgs
parents:
diff changeset
   112
  {
hgs
parents:
diff changeset
   113
  test.Start(_L("ClientAppL"));
hgs
parents:
diff changeset
   114
  TInt err = iServSession.Connect(securityServerVersion);
hgs
parents:
diff changeset
   115
  if (err != KErrNone)
hgs
parents:
diff changeset
   116
      {
hgs
parents:
diff changeset
   117
      User::Panic(_L("Can't open server session"), err);
hgs
parents:
diff changeset
   118
      }
hgs
parents:
diff changeset
   119
  SetupDebugServerL();
hgs
parents:
diff changeset
   120
  LaunchTargetsInOrderL();
hgs
parents:
diff changeset
   121
  RDebug::Printf( "returning from CMultiTargetAgent::ClientAppL" );
hgs
parents:
diff changeset
   122
  test.End();
hgs
parents:
diff changeset
   123
  }
hgs
parents:
diff changeset
   124
hgs
parents:
diff changeset
   125
/**
hgs
parents:
diff changeset
   126
  Launch a process
hgs
parents:
diff changeset
   127
hgs
parents:
diff changeset
   128
  @param aProcess The RProcess object to use to create the process
hgs
parents:
diff changeset
   129
  @param aExeName File name of the executable to create the process from
hgs
parents:
diff changeset
   130
  @param aCommandLine The command line to pass to the new process
hgs
parents:
diff changeset
   131
  @return KErrNone on success, or one of the other system wide error codes
hgs
parents:
diff changeset
   132
  */
hgs
parents:
diff changeset
   133
TInt CMultiTargetAgent::LaunchProcess(RProcess& aProcess, TDesC & aExeName, TDesC & aCommandLine )
hgs
parents:
diff changeset
   134
    {    
hgs
parents:
diff changeset
   135
    TInt err = aProcess.Create( aExeName, aCommandLine );    
hgs
parents:
diff changeset
   136
    if(err != KErrNone)
hgs
parents:
diff changeset
   137
        {
hgs
parents:
diff changeset
   138
        RDebug::Printf( "aProcess.Create ret %d", err);
hgs
parents:
diff changeset
   139
        return err;
hgs
parents:
diff changeset
   140
        }
hgs
parents:
diff changeset
   141
hgs
parents:
diff changeset
   142
    TRequestStatus status = KRequestPending;
hgs
parents:
diff changeset
   143
    aProcess.Rendezvous(status);
hgs
parents:
diff changeset
   144
    if(KRequestPending != status.Int())
hgs
parents:
diff changeset
   145
        {
hgs
parents:
diff changeset
   146
        // startup failed so kill the process
hgs
parents:
diff changeset
   147
        aProcess.Kill(KErrNone);
hgs
parents:
diff changeset
   148
        return status.Int();
hgs
parents:
diff changeset
   149
        }
hgs
parents:
diff changeset
   150
    else
hgs
parents:
diff changeset
   151
        {
hgs
parents:
diff changeset
   152
        // start up succeeded so resume the process
hgs
parents:
diff changeset
   153
        aProcess.Resume();
hgs
parents:
diff changeset
   154
        // Give the process a chance to run
hgs
parents:
diff changeset
   155
        User::After( 500000 );
hgs
parents:
diff changeset
   156
        return KErrNone;
hgs
parents:
diff changeset
   157
        }
hgs
parents:
diff changeset
   158
    }
hgs
parents:
diff changeset
   159
hgs
parents:
diff changeset
   160
void CMultiTargetAgent::SetupDebugServerL()
hgs
parents:
diff changeset
   161
    {
hgs
parents:
diff changeset
   162
    RDebug::Printf( "CMultiTargetAgent::SetupDebugServerL" );
hgs
parents:
diff changeset
   163
    test.Next(_L("SetupDebugServerL\n"));
hgs
parents:
diff changeset
   164
    iTargets.ReserveL( KNumApps );
hgs
parents:
diff changeset
   165
hgs
parents:
diff changeset
   166
    RBuf targetName;
hgs
parents:
diff changeset
   167
    CleanupClosePushL( targetName );
hgs
parents:
diff changeset
   168
hgs
parents:
diff changeset
   169
    for( TInt numApps = 0; numApps < KNumApps; numApps++ )
hgs
parents:
diff changeset
   170
        {
hgs
parents:
diff changeset
   171
        iTargets.AppendL( targetName );
hgs
parents:
diff changeset
   172
        RDebug::Printf( "Attach to DSS for app %d ", numApps );
hgs
parents:
diff changeset
   173
hgs
parents:
diff changeset
   174
        iTargets[numApps].CreateL( KTargetExe().Length() + 2 );
hgs
parents:
diff changeset
   175
        iTargets[numApps].Format( KTargetExe(), numApps+1 );
hgs
parents:
diff changeset
   176
hgs
parents:
diff changeset
   177
        TInt ret = iServSession.AttachExecutable( iTargets[numApps], EFalse );
hgs
parents:
diff changeset
   178
        test( ret == KErrNone );
hgs
parents:
diff changeset
   179
hgs
parents:
diff changeset
   180
        RDebug::Printf( ">SetEventAction app %d,  EEventsStartThread EActionSuspend", numApps );
hgs
parents:
diff changeset
   181
        ret = iServSession.SetEventAction( iTargets[numApps], EEventsStartThread, EActionSuspend );
hgs
parents:
diff changeset
   182
        test( ret == KErrNone );
hgs
parents:
diff changeset
   183
hgs
parents:
diff changeset
   184
        RDebug::Printf( ">SetEventAction app %d,  EEventsAddProcess EActionContinue", numApps );
hgs
parents:
diff changeset
   185
        ret = iServSession.SetEventAction( iTargets[numApps], EEventsAddProcess, EActionContinue );
hgs
parents:
diff changeset
   186
        test( ret == KErrNone );
hgs
parents:
diff changeset
   187
hgs
parents:
diff changeset
   188
        RDebug::Printf( ">SetEventAction app %d,  EEventsRemoveProcess EActionContinue", numApps );
hgs
parents:
diff changeset
   189
        ret = iServSession.SetEventAction( iTargets[numApps], EEventsRemoveProcess, EActionContinue );
hgs
parents:
diff changeset
   190
        test( ret == KErrNone );
hgs
parents:
diff changeset
   191
        }
hgs
parents:
diff changeset
   192
hgs
parents:
diff changeset
   193
    CleanupStack::PopAndDestroy( &targetName ); // targetName
hgs
parents:
diff changeset
   194
hgs
parents:
diff changeset
   195
    }
hgs
parents:
diff changeset
   196
hgs
parents:
diff changeset
   197
hgs
parents:
diff changeset
   198
hgs
parents:
diff changeset
   199
TInt CMultiTargetAgent::LaunchTargetsInOrderL()
hgs
parents:
diff changeset
   200
    {
hgs
parents:
diff changeset
   201
    RDebug::Printf( "CMultiTargetAgent::LaunchTargetsInOrderL" );
hgs
parents:
diff changeset
   202
    
hgs
parents:
diff changeset
   203
    RBuf launcher;
hgs
parents:
diff changeset
   204
    CleanupClosePushL( launcher );
hgs
parents:
diff changeset
   205
    launcher.CreateL( KLauncherExe() );
hgs
parents:
diff changeset
   206
    
hgs
parents:
diff changeset
   207
    RBuf launcherOptions;
hgs
parents:
diff changeset
   208
    CleanupClosePushL( launcherOptions ); 
hgs
parents:
diff changeset
   209
    launcherOptions.CreateL( KTargetOptions().Length() + 2 );
hgs
parents:
diff changeset
   210
    launcherOptions.Format( KTargetOptions(), (TUint)ENormalExit );
hgs
parents:
diff changeset
   211
hgs
parents:
diff changeset
   212
    RDebug::Printf( ">LaunchProcess()" );
hgs
parents:
diff changeset
   213
    RProcess launcherProc; 
hgs
parents:
diff changeset
   214
    CleanupClosePushL( launcherProc );
hgs
parents:
diff changeset
   215
    
hgs
parents:
diff changeset
   216
    TInt ret = LaunchProcess( launcherProc, launcher, launcherOptions );
hgs
parents:
diff changeset
   217
    RDebug::Printf( "<LaunchProcess() ret %d", ret );
hgs
parents:
diff changeset
   218
    
hgs
parents:
diff changeset
   219
    CleanupStack::PopAndDestroy( &launcherProc ); // launcherProc
hgs
parents:
diff changeset
   220
    CleanupStack::PopAndDestroy( &launcherOptions ); // launcherOptions
hgs
parents:
diff changeset
   221
    CleanupStack::PopAndDestroy( &launcher ); //launcher 
hgs
parents:
diff changeset
   222
hgs
parents:
diff changeset
   223
    test( ret == KErrNone );
hgs
parents:
diff changeset
   224
    
hgs
parents:
diff changeset
   225
    RSemaphore launchSemaphore;   
hgs
parents:
diff changeset
   226
    CleanupClosePushL( launchSemaphore );
hgs
parents:
diff changeset
   227
            
hgs
parents:
diff changeset
   228
    TFindSemaphore launchSemFinder( KLaunchSemaphoreNameSearchString );
hgs
parents:
diff changeset
   229
    TFullName semaphoreResult;
hgs
parents:
diff changeset
   230
    ret = launchSemFinder.Next(semaphoreResult);
hgs
parents:
diff changeset
   231
    RDebug::Printf( ">  Find Launch Semaphote.Next ret=%d, %lS", ret, &semaphoreResult );
hgs
parents:
diff changeset
   232
    test( ret == KErrNone );   
hgs
parents:
diff changeset
   233
     
hgs
parents:
diff changeset
   234
    ret = launchSemaphore.OpenGlobal( semaphoreResult );
hgs
parents:
diff changeset
   235
    RDebug::Printf( "> OpenGlobal semaphore ret=%d", ret );         
hgs
parents:
diff changeset
   236
    test( ret == KErrNone );    
hgs
parents:
diff changeset
   237
    
hgs
parents:
diff changeset
   238
    TBool thisLaunchCompleted; 
hgs
parents:
diff changeset
   239
hgs
parents:
diff changeset
   240
    test.Next(_L("LaunchTargetsInOrderL\n"));
hgs
parents:
diff changeset
   241
    for( TInt numLaunches = KNumLaunches; numLaunches > 0; numLaunches-- )
hgs
parents:
diff changeset
   242
        {
hgs
parents:
diff changeset
   243
        for( TInt numApps = KNumApps; numApps > 0; numApps-- )
hgs
parents:
diff changeset
   244
            {
hgs
parents:
diff changeset
   245
            thisLaunchCompleted = EFalse;
hgs
parents:
diff changeset
   246
            // This will trigger the launcher app to launch the next target
hgs
parents:
diff changeset
   247
            RDebug::Printf( " >Semaphore.Signal app=%d, launch=%d", numApps, numLaunches);
hgs
parents:
diff changeset
   248
            launchSemaphore.Signal();
hgs
parents:
diff changeset
   249
            
hgs
parents:
diff changeset
   250
            RBuf8 tgt8Name; 
hgs
parents:
diff changeset
   251
            CleanupClosePushL( tgt8Name );
hgs
parents:
diff changeset
   252
           
hgs
parents:
diff changeset
   253
            RBuf tgtCollapseName;
hgs
parents:
diff changeset
   254
            CleanupClosePushL( tgtCollapseName );
hgs
parents:
diff changeset
   255
                    
hgs
parents:
diff changeset
   256
            tgtCollapseName.CreateL( iTargets[numApps-1] );
hgs
parents:
diff changeset
   257
            tgt8Name.CreateL( tgtCollapseName.Collapse() );
hgs
parents:
diff changeset
   258
            
hgs
parents:
diff changeset
   259
hgs
parents:
diff changeset
   260
            while( ! thisLaunchCompleted )
hgs
parents:
diff changeset
   261
                {
hgs
parents:
diff changeset
   262
                RDebug::Printf( ">GetEvent app %d for %S", numApps, &tgt8Name );
hgs
parents:
diff changeset
   263
                iServSession.GetEvent( iTargets[numApps-1], iStatus, iEventPtr );
hgs
parents:
diff changeset
   264
          
hgs
parents:
diff changeset
   265
                // Wait for the target to get started.
hgs
parents:
diff changeset
   266
                RDebug::Printf( " >Wait for event from target app=%d, launch=%d\n", numApps, numLaunches);
hgs
parents:
diff changeset
   267
                User::WaitForRequest( iStatus );
hgs
parents:
diff changeset
   268
                RDebug::Printf( " <Wait for request returned with status %d", iStatus.Int() );
hgs
parents:
diff changeset
   269
                test( iStatus==KErrNone );
hgs
parents:
diff changeset
   270
    
hgs
parents:
diff changeset
   271
                RDebug::Printf( " > Got iEventType =%d, app=%d", iEventInfo.iEventType, numApps );
hgs
parents:
diff changeset
   272
                switch( iEventInfo.iEventType )
hgs
parents:
diff changeset
   273
                    {
hgs
parents:
diff changeset
   274
                    case EEventsAddProcess:
hgs
parents:
diff changeset
   275
                        {
hgs
parents:
diff changeset
   276
                        RDebug::Printf( "Got EEventsAddProcess" );                        
hgs
parents:
diff changeset
   277
                        TPtrC8 exeNamePtr8( iEventInfo.iAddProcessInfo.iFileName, iEventInfo.iAddProcessInfo.iFileNameLength );
hgs
parents:
diff changeset
   278
                        
hgs
parents:
diff changeset
   279
                        RBuf8 exeName8;
hgs
parents:
diff changeset
   280
                        CleanupClosePushL( exeName8 );
hgs
parents:
diff changeset
   281
                        exeName8.CreateL( exeNamePtr8 );
hgs
parents:
diff changeset
   282
                        RDebug::Printf( " from event: exeName8=%S", &exeName8 );
hgs
parents:
diff changeset
   283
                        CleanupStack::PopAndDestroy( &exeName8 );
hgs
parents:
diff changeset
   284
                        
hgs
parents:
diff changeset
   285
                        RBuf8 compareName8;
hgs
parents:
diff changeset
   286
                        CleanupClosePushL( compareName8 );
hgs
parents:
diff changeset
   287
                        compareName8.CreateL( KTargetExeName().Length() + 10 );
hgs
parents:
diff changeset
   288
                        compareName8.Format( KTargetExeName(), numApps );
hgs
parents:
diff changeset
   289
                        RDebug::Printf( " comparing to: compareName8=%S", &compareName8 );
hgs
parents:
diff changeset
   290
                        
hgs
parents:
diff changeset
   291
                        test( compareName8.CompareC( exeNamePtr8 ) == 0 );
hgs
parents:
diff changeset
   292
                        CleanupStack::PopAndDestroy( &compareName8 );
hgs
parents:
diff changeset
   293
hgs
parents:
diff changeset
   294
                        RDebug::Printf( "Testing if event process id is valid" );
hgs
parents:
diff changeset
   295
                        test( iEventInfo.iProcessIdValid );
hgs
parents:
diff changeset
   296
                        RDebug::Printf( "Got iEventInfo.iProcessId=%d", I64LOW( iEventInfo.iProcessId ) );
hgs
parents:
diff changeset
   297
                        
hgs
parents:
diff changeset
   298
                        RProcess targetProc;
hgs
parents:
diff changeset
   299
                        ret = targetProc.Open( TProcessId( iEventInfo.iProcessId ) );
hgs
parents:
diff changeset
   300
                        RDebug::Printf( "RProcess open ret=%d",ret );
hgs
parents:
diff changeset
   301
                        targetProc.Close();
hgs
parents:
diff changeset
   302
                        test( ret == KErrNone );
hgs
parents:
diff changeset
   303
                        
hgs
parents:
diff changeset
   304
                        break;
hgs
parents:
diff changeset
   305
                        }//EEventsAddProcess
hgs
parents:
diff changeset
   306
                        
hgs
parents:
diff changeset
   307
                    case EEventsStartThread:
hgs
parents:
diff changeset
   308
                        {
hgs
parents:
diff changeset
   309
                        RDebug::Printf( "Got EEventsStartThread" );
hgs
parents:
diff changeset
   310
                         
hgs
parents:
diff changeset
   311
                        TPtrC8 exeNamePtr8( iEventInfo.iStartThreadInfo.iFileName, iEventInfo.iStartThreadInfo.iFileNameLength );
hgs
parents:
diff changeset
   312
                        RBuf8 exe8Name;
hgs
parents:
diff changeset
   313
                        CleanupClosePushL( exe8Name );
hgs
parents:
diff changeset
   314
                        exe8Name.CreateL( exeNamePtr8 );
hgs
parents:
diff changeset
   315
                        RDebug::Printf( " from event: exeName8=%S", &exe8Name );
hgs
parents:
diff changeset
   316
                        CleanupStack::PopAndDestroy( &exe8Name );
hgs
parents:
diff changeset
   317
                        
hgs
parents:
diff changeset
   318
                        test( tgt8Name.CompareC( exeNamePtr8 ) == 0 );
hgs
parents:
diff changeset
   319
                        
hgs
parents:
diff changeset
   320
                        RDebug::Printf( "Testing if event process id is valid" );
hgs
parents:
diff changeset
   321
                        test( iEventInfo.iProcessIdValid );
hgs
parents:
diff changeset
   322
                        RDebug::Printf( "Got iEventInfo.iProcessId=%d", I64LOW( iEventInfo.iProcessId ) );
hgs
parents:
diff changeset
   323
                         
hgs
parents:
diff changeset
   324
                        RDebug::Printf( "Testing if event thread id is valid" );
hgs
parents:
diff changeset
   325
                        test( iEventInfo.iThreadIdValid );
hgs
parents:
diff changeset
   326
                        RDebug::Printf( "Got iEventInfo.iThreadId=%d", I64LOW( iEventInfo.iThreadId ) );
hgs
parents:
diff changeset
   327
                        
hgs
parents:
diff changeset
   328
                        RThread targetThread;
hgs
parents:
diff changeset
   329
                        CleanupClosePushL( targetThread );
hgs
parents:
diff changeset
   330
                        
hgs
parents:
diff changeset
   331
                        ret = targetThread.Open( TThreadId( iEventInfo.iThreadId ) );
hgs
parents:
diff changeset
   332
                        RDebug::Printf( "RThread open ret=%d", ret );
hgs
parents:
diff changeset
   333
                        test( ret == KErrNone ); 
hgs
parents:
diff changeset
   334
                         
hgs
parents:
diff changeset
   335
                        test( iEventInfo.iThreadId == targetThread.Id() );  
hgs
parents:
diff changeset
   336
hgs
parents:
diff changeset
   337
                        RDebug::Printf( "Resuming thread for app=%d, id=%d", numApps, I64LOW( targetThread.Id() ));
hgs
parents:
diff changeset
   338
                        ret = iServSession.ResumeThread( iEventInfo.iThreadId );
hgs
parents:
diff changeset
   339
                        CleanupStack::PopAndDestroy( &targetThread );
hgs
parents:
diff changeset
   340
                        
hgs
parents:
diff changeset
   341
                        test( ret == KErrNone );
hgs
parents:
diff changeset
   342
                        
hgs
parents:
diff changeset
   343
                        ret = iServSession.ResumeThread( iEventInfo.iThreadId );
hgs
parents:
diff changeset
   344
                        break;                    
hgs
parents:
diff changeset
   345
                        }//case EEventsStartThread                        
hgs
parents:
diff changeset
   346
hgs
parents:
diff changeset
   347
                    case ( EEventsRemoveProcess ):
hgs
parents:
diff changeset
   348
                        {
hgs
parents:
diff changeset
   349
                        RDebug::Printf( "*** Got EEventsRemoveProcess. app%d has exited. Moving on to next app", numApps );                        
hgs
parents:
diff changeset
   350
                        thisLaunchCompleted = ETrue;
hgs
parents:
diff changeset
   351
                        break;
hgs
parents:
diff changeset
   352
                        }
hgs
parents:
diff changeset
   353
                        
hgs
parents:
diff changeset
   354
                    default :   
hgs
parents:
diff changeset
   355
                        RDebug::Printf( "Got unknown event" );
hgs
parents:
diff changeset
   356
                        test( EFalse );
hgs
parents:
diff changeset
   357
                        break;
hgs
parents:
diff changeset
   358
                    }
hgs
parents:
diff changeset
   359
                }//while
hgs
parents:
diff changeset
   360
hgs
parents:
diff changeset
   361
            CleanupStack::PopAndDestroy( &tgtCollapseName ); // tgtCollapseName
hgs
parents:
diff changeset
   362
            CleanupStack::PopAndDestroy( &tgt8Name ); // tgt8Name 
hgs
parents:
diff changeset
   363
            }
hgs
parents:
diff changeset
   364
        }    
hgs
parents:
diff changeset
   365
hgs
parents:
diff changeset
   366
    launchSemaphore.Signal();
hgs
parents:
diff changeset
   367
    
hgs
parents:
diff changeset
   368
	CleanupStack::PopAndDestroy( &launchSemaphore ); // launchSemaphore
hgs
parents:
diff changeset
   369
  
hgs
parents:
diff changeset
   370
	for( TInt i = iTargets.Count()-1; i>=0; i-- )
hgs
parents:
diff changeset
   371
		{
hgs
parents:
diff changeset
   372
		RDebug::Printf( "Closing target %d", i );
hgs
parents:
diff changeset
   373
		iTargets[ i ].Close();
hgs
parents:
diff changeset
   374
		}
hgs
parents:
diff changeset
   375
hgs
parents:
diff changeset
   376
	iTargets.Close();
hgs
parents:
diff changeset
   377
	
hgs
parents:
diff changeset
   378
	return KErrNone;
hgs
parents:
diff changeset
   379
    }
hgs
parents:
diff changeset
   380
hgs
parents:
diff changeset
   381
hgs
parents:
diff changeset
   382
GLDEF_C TInt E32Main()
hgs
parents:
diff changeset
   383
    {
hgs
parents:
diff changeset
   384
    TInt ret = KErrNone;
hgs
parents:
diff changeset
   385
   
hgs
parents:
diff changeset
   386
  
hgs
parents:
diff changeset
   387
    CTrapCleanup* trap = CTrapCleanup::New();
hgs
parents:
diff changeset
   388
    if (!trap)
hgs
parents:
diff changeset
   389
      return KErrNoMemory;
hgs
parents:
diff changeset
   390
    test.Title();
hgs
parents:
diff changeset
   391
   
hgs
parents:
diff changeset
   392
    CMultiTargetAgent *runModeAgent = CMultiTargetAgent::NewL();
hgs
parents:
diff changeset
   393
    if (runModeAgent != NULL)
hgs
parents:
diff changeset
   394
        {
hgs
parents:
diff changeset
   395
        __UHEAP_MARK;
hgs
parents:
diff changeset
   396
        TRAP(ret,runModeAgent->ClientAppL());
hgs
parents:
diff changeset
   397
        __UHEAP_MARKEND;
hgs
parents:
diff changeset
   398
        
hgs
parents:
diff changeset
   399
        RDebug::Printf( "ClientAppL returned %d", ret );
hgs
parents:
diff changeset
   400
        delete runModeAgent;
hgs
parents:
diff changeset
   401
        }
hgs
parents:
diff changeset
   402
hgs
parents:
diff changeset
   403
    delete trap;
hgs
parents:
diff changeset
   404
    return ret;
hgs
parents:
diff changeset
   405
    }