diff -r 96e5fb8b040d -r 36bfc973b146 kerneltest/e32test/smpsoak/t_smpsoakspin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kerneltest/e32test/smpsoak/t_smpsoakspin.cpp Thu Jan 07 13:38:45 2010 +0200 @@ -0,0 +1,287 @@ +// Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32test\t_smpsoakspin.cpp +// + +#define __E32TEST_EXTENSION__ +#include +#include +#include + + +#include "d_smpsoak.h" + +#define PRINT(string) if (!gQuiet) test.Printf(string) +#define PRINT1(string,param) if (!gQuiet) test.Printf(string,param) +#define TESTNEXT(string) if (!gQuiet) test.Next(string) + +#define DEBUG_PRINT(__args) test.Printf __args + +//------------globals--------------------- +LOCAL_D RTest test(_L("T_SMPSOAKSPIN")); +LOCAL_D TBool gQuiet = EFalse; +LOCAL_D TBool gAbort = EFalse; + +TInt TestCpuCount = 0; + +const TInt KTimerPeriod = 10000; + +const TInt KHeapMinSize=0x1000; +const TInt KHeapMaxSize=0x1000; + +// Create a new thread +RThread *spinthread = new RThread; + +//Periadic Bip +CPeriodic* Timer; + +TInt SMPSpinThread(TAny*); + + +struct TThread + { + RThread thread; + TDesC threadName; + TInt threadPriority; + TInt cpuAffinity; + TInt loopCount; + TInt endLoopDelay; + TBool fixedCPU; + TBool endFlag; + }; + +TThread ThreadTable[] = + { + { RThread(), _L("Thread1"), EPriorityAbsoluteHigh, 0, 1000, 100, EFalse, EFalse}, + { RThread(), _L("Thread2"), EPriorityAbsoluteHigh, 0, 1000, 100, EFalse, EFalse}, + }; + +enum + { + KThreads = (TInt)(sizeof(ThreadTable) / sizeof(TThread)) +}; + +void ShowHelp() + { + PRINT(_L("***************************************\n")); + PRINT(_L("The following are available commands\n")); + PRINT(_L("Esc to exit\n")); + PRINT(_L("***************************************\n")); + } + +TInt NumberOfCpus() + { + TInt r = UserSvr::HalFunction(EHalGroupKernel, EKernelHalNumLogicalCpus, 0, 0); + test(r>0); + return r; + } + + +void ParseCommandLine () + { + TBuf<64> c; + + User::CommandLine(c); + c.LowerCase(); + + if (c != KNullDesC) + { + TLex lex(c); + TPtrC token; + + while (token.Set(lex.NextToken()), token != KNullDesC) + { + if (token.Mid(0) == _L("quiet")) + { + gQuiet = ETrue; + continue; + } + + if (token.Mid(0) == _L("verbose")) + { + gQuiet = EFalse; + continue; + } + } + } + } + +// CActive class to monitor KeyStrokes from User +class CActiveConsole : public CActive + { +public: + CActiveConsole(); + ~CActiveConsole(); + void GetCharacter(); + static TInt Callback(TAny* aCtrl); + static CPeriodic* TimerL(); +private: + + + // Defined as pure virtual by CActive; + // implementation provided by this class. + virtual void DoCancel(); + // Defined as pure virtual by CActive; + // implementation provided by this class, + virtual void RunL(); + void ProcessKeyPressL(TChar aChar); + }; + +// Class CActiveConsole +CActiveConsole::CActiveConsole() + : CActive(EPriorityHigh) + { + CActiveScheduler::Add(this); + } + +CActiveConsole::~CActiveConsole() + { + Cancel(); + } + +CPeriodic* CActiveConsole::TimerL() + { + return(CPeriodic::NewL(EPriorityNormal)); + } + +// Callback function for timer expiry +TInt CActiveConsole::Callback(TAny* aControl) + { + return KErrNone; + } + +void CActiveConsole::GetCharacter() + { + test.Console()->Read(iStatus); + SetActive(); + } + +void CActiveConsole::DoCancel() + { + PRINT(_L("CActiveConsole::DoCancel\n")); + test.Console()->ReadCancel(); + } + +void CActiveConsole::ProcessKeyPressL(TChar aChar) + { + if (aChar == EKeyEscape) + { + PRINT(_L("CActiveConsole: ESC key pressed -> stopping active scheduler...\n")); + CActiveScheduler::Stop(); + return; + } + aChar.UpperCase(); + GetCharacter(); + } + +void CActiveConsole::RunL() + { + ProcessKeyPressL(static_cast(test.Console()->KeyCode())); + } + +TInt E32Main() + { + test.Title(); + __UHEAP_MARK; + test.Start(_L("SMP Soak Test")); + + test.Next(_L("Load device driver")); + TInt r = User::LoadLogicalDevice(_L("d_smpsoak.ldd")); + if (r == KErrNotFound) + { + test.Printf(_L("Test not supported on this platform because the D_SMPSOAK.LDD Driver is Not Present\n")); + test.End(); + return 0; + } + + test.Next(_L("Calling rt.Open")); + RSMPSoak rt; + r = rt.Open(); + if (r!=KErrNone) + { + test.Printf(_L("Error- Couldn't able to open soak driver:%d"),r); + return r; + } + test.Next(_L("rt.Open called")); + + spinthread->Create(_L("SMPSpinThread"), SMPSpinThread, KDefaultStackSize, KHeapMinSize, KHeapMaxSize, &rt); + DEBUG_PRINT((_L("SMPSoak Thread is %x\n"), spinthread)); + + spinthread->SetPriority(EPriorityAbsoluteLow); + + spinthread->Resume(); + + ParseCommandLine(); + + CActiveScheduler* myScheduler = new (ELeave) CActiveScheduler(); + test(myScheduler !=NULL); + CActiveScheduler::Install(myScheduler); + + CPeriodic* theTimer=NULL; + TRAPD(ret,theTimer=CActiveConsole::TimerL()) + test_KErrNone(ret); + theTimer->Start(0,KTimerPeriod,TCallBack(CActiveConsole::Callback)); + + CActiveConsole* myActiveConsole = new CActiveConsole(); + test(myActiveConsole !=NULL); + myActiveConsole->GetCharacter(); + + CActiveScheduler::Start(); + + delete theTimer; + + __UHEAP_MARKEND; + + test.End(); + + return 0; + } + +TInt SMPSpinThread(TAny* rt) +{ + TInt startCpu = 0x00; + TInt endCpu = 0x00; + RTimer timer; + test(timer.CreateLocal()==KErrNone); + TRequestStatus s; + + RSMPSoak* pMyDriver = (RSMPSoak*)rt; + RTest test(_L("SMPSpinThread")); + test.Title(); + + FOREVER + { + startCpu = pMyDriver->TryControl(RSMPSoak::KGETCURRENTCPU, 0); + + timer.After(s, 250000); + User::WaitForRequest(s); + test(s==KErrNone); + DEBUG_PRINT((_L("+"))); + + endCpu = pMyDriver->TryControl(RSMPSoak::KGETCURRENTCPU, 0); + + if(startCpu != endCpu) + { + DEBUG_PRINT((_L("\r\nSMPSoakSpin app:- Thread moved from cpu %d to cpu %d ************\n"), startCpu, endCpu)); + } + if (gAbort) + break; + } + + timer.Cancel(); + DEBUG_PRINT((_L("MyTimer.Cancel() called\n"))); + return 0x00; +} + +