TInt CTContentUpdateReceiver::ThreadFunction(TAny* aAny) { // get clean-up stack CTrapCleanup* cleanup=CTrapCleanup::New(); RThread thread; _LIT(KTestReceiver, "TestReceiver"); __ASSERT_ALWAYS(cleanup!=NULL, thread.Panic( KTestReceiver, KErrNoMemory)); // create an active scheduler and server CActiveScheduler *pA = new CActiveScheduler; __ASSERT_ALWAYS(pA != NULL, thread.Panic( KTestReceiver, KErrNoMemory)); //Install the active scheduler CActiveScheduler::Install(pA); CTContentUpdateReceiver *pCB = NULL; TInt screen = * (static_cast <TInt*> (aAny)); TRAPD(err, pCB = CTContentUpdateReceiver::NewL(screen)); __ASSERT_ALWAYS(err == KErrNone, thread.Panic( KTestReceiver, err)); *(static_cast <CTContentUpdateReceiver**> (aAny)) = pCB; // Let everyone know that we are ready to // deal with requests. RThread::Rendezvous(KErrNone); // And start fielding requests from client(s). CActiveScheduler::Start(); // Tidy up... delete pCB; delete pA; delete cleanup; return KErrNone; }
LOCAL_D void TestSelfSuspend(TOwnerType anOwnerType) // // Test running a thread that suspends itself. This activity has // deadlocked the Emulator in the past // { RThread suspendThread; TInt r; TRequestStatus s; TInt jit=User::JustInTime(); test.Start(_L("Test running a thread which suspends itself")); test.Next(_L("Create the thread")); r=suspendThread.Create(KNullDesC,SuspendThread,KDefaultStackSize,KHeapSize,KHeapSize,(TAny*)NULL,anOwnerType); test(r==KErrNone); suspendThread.Logon(s); suspendThread.Resume(); test.Next(_L("Wait a second")); User::After(1000000); User::SetJustInTime(EFalse); suspendThread.Panic(_L("FEDCBA9876543210fedcba"),999); User::WaitForRequest(s); User::SetJustInTime(jit); test(suspendThread.ExitType()==EExitPanic); test(suspendThread.ExitReason()==999); test(suspendThread.ExitCategory()==_L("FEDCBA9876543210")); CLOSE_AND_WAIT(suspendThread); test.End(); }
GLDEF_C TInt E32Main() { test.Title(); TBuf<256> cmd; TFullName fn; User::CommandLine(cmd); TLex lex(cmd); TPtrC threadSpec(lex.NextToken()); TFindThread ft(threadSpec); TExitType exitType=EExitKill; TInt exitCode=0; if (!lex.Eos()) { TPtrC xtSpec(lex.NextToken()); TPtrC xc(xtSpec); TChar xt0=xtSpec[0]; if (xt0.IsAlpha()) { xt0.LowerCase(); if (xt0==TChar('t')) exitType=EExitTerminate; else if (xt0==TChar('p')) exitType=EExitPanic; new(&xc) TPtrC(lex.NextToken()); } if (xc.Length()) { TLex lex2(xc); lex2.Val(exitCode); } } while (ft.Next(fn)==KErrNone) { test.Printf(_L("Killing %S\n"),&fn); RThread t; TInt r=t.Open(ft); if (r==KErrNone) { // FIXME: SHOULD REMOVE CRITICALNESS - WOULD NEED DEVICE DRIVER switch (exitType) { case EExitKill: t.Kill(exitCode); break; case EExitTerminate: t.Terminate(exitCode); break; case EExitPanic: t.Panic(KPanicCat,exitCode); break; default: break; } t.Close(); } } return 0; }