kerneltest/e32test/active/t_idle.cpp
author Tom Cosgrove <tom.cosgrove@nokia.com>
Fri, 28 May 2010 16:29:07 +0100
changeset 30 8aab599e3476
parent 0 a41df078684a
permissions -rw-r--r--
Fix for bug 2283 (RVCT 4.0 support is missing from PDK 3.0.h) Have multiple extension sections in the bld.inf, one for each version of the compiler. The RVCT version building the tools will build the runtime libraries for its version, but make sure we extract all the other versions from zip archives. Also add the archive for RVCT4.

// Copyright (c) 1995-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\active\t_idle.cpp
// Overview:
// Test the CIdle class. A CIdle and CTimer run on the same active scheduler and
// the test displays how their callback function and RunL respectively are called.
// API Information:
// CIdle 
// Details:
// - Create and install active scheduler.
// - Create and start a timer, add this to the active scheduler, request an event
// after a specified interval. The timer will reschedule itself for a finite
// number of times, then it will cancel the CIdle object and then reschedule
// itself again and eventually it will stop the active scheduler.
// - Create a CIdle active object, start a background task that is encapsulated in
// callback function. The CIdle will keep reschedule itself by always returning
// TRUE from the callback.
// - Output some text from timer's RunL and CIdle's callback to show when they are
// called and how they interleave.
// Platforms/Drives/Compatibility:
// All.
// Assumptions/Requirement/Pre-requisites:
// Failures and causes:
// Base Port information:
// 
//

#include <e32test.h>

enum {EIdlePriority=1000,EMoreIdlePriority=800};

class CMyRequestManager : public CActiveScheduler
	{
public:
	virtual void Error(TInt anError) const;
	};

class CMyTimer : public CTimer
	{
public:
	static CMyTimer* New();
	void Start();
	virtual void RunL();
protected:
	CMyTimer(TInt aPriority);
private:
	enum {EMaxCount=10,EStopCount=5,ETimeReq=100000};
	TInt iCount;
	};

LOCAL_D RTest test(_L("T_IDLE"));
LOCAL_D CIdle* MoreIdle;
LOCAL_D TInt TheCount=0;

void CMyRequestManager::Error(TInt anError) const
//
// Called if any Run() method leaves.
//
	{

	test.Panic(anError,_L("CMyRequestManager::Error"));
	}

CMyTimer* CMyTimer::New()
//
// Create a new CMyTimer.
//
	{

	return(new CMyTimer(EIdlePriority));
	}

CMyTimer::CMyTimer(TInt aPriority)
//
// Constructor
//
	: CTimer(aPriority),iCount(0)
	{}

void CMyTimer::Start()
//
// The timer has completed.
//
	{

	TRAPD(r, ConstructL());
	test(r==KErrNone);
	CActiveScheduler::Add(this);
	After(ETimeReq);
	}

void CMyTimer::RunL()
//
// The timer has completed.
//
	{

	iCount++;
	test.Printf(_L("Timer %03d\n"),iCount);
	if (iCount==EStopCount)
		MoreIdle->Cancel();
	if (iCount<EMaxCount)
		After(ETimeReq);
	else
		{
		test.Printf(_L("\n"));
		DoCancel();
		CActiveScheduler::Stop();
		}
	}

TInt IdleResponse(TAny*)
//
//	Respond to the idle callback
//
	{

	test.Printf(_L("\rIdle response number : %6d "),++TheCount);
	return(TRUE);
	}

TInt IdleCancel(TAny*)
//
//	Cancel the other idle object
//
	{

	if (TheCount>9)
		{
		MoreIdle->Cancel();
		return(FALSE);
		}
	return(TRUE);
	}
		
GLDEF_C TInt E32Main()
//
// Test idle objects.
//
    {
	
	test.Title();
	test.Start(_L("Testing idle object cancellation"));
//
	CMyRequestManager* pR=new CMyRequestManager;
	test(pR!=NULL);
	CActiveScheduler::Install(pR);
//
	CMyTimer* pT=CMyTimer::New();
	pT->Start();
	MoreIdle=CIdle::New(EIdlePriority);
	MoreIdle->Start(&IdleResponse);
	CActiveScheduler::Start();	
//
	test.End();
	return(0);
    }