kerneltest/e32test/active/t_schedrace.cpp
author hgs
Mon, 27 Sep 2010 10:52:00 +0100
changeset 273 6a75fa55495f
permissions -rw-r--r--
201037_09
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
273
6a75fa55495f 201037_09
hgs
parents:
diff changeset
     1
// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
6a75fa55495f 201037_09
hgs
parents:
diff changeset
     2
// All rights reserved.
6a75fa55495f 201037_09
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
6a75fa55495f 201037_09
hgs
parents:
diff changeset
     4
// under the terms of the License "Eclipse Public License v1.0"
6a75fa55495f 201037_09
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
6a75fa55495f 201037_09
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
6a75fa55495f 201037_09
hgs
parents:
diff changeset
     7
//
6a75fa55495f 201037_09
hgs
parents:
diff changeset
     8
// Initial Contributors:
6a75fa55495f 201037_09
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    10
//
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    11
// Contributors:
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    12
//
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    13
// Description:
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    14
// e32test\active\t_schedrace.cpp
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    15
// Overview:
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    16
// Test for race conditions in emulator scheduler
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    17
// API Information:
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    18
// RMessage2, RMessagePtr2, RSessionBase, CSession2, CServer2, CPeriodic
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    19
// Details:
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    20
// - The client and server shuttle messages back and forth with variable timing
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    21
// - The client also has a periodic timer, which fires at a random phase relative to the IPC
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    22
// - The client should have higher priority than the server
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    23
// - The race may occur when the timer interrupt preempts kernel code and disables interrupts
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    24
// - The "preempted" code nonetheless runs and sees the "impossible" disabled interrupts
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    25
// - The result is a precondition failure at a random point
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    26
// Platforms/Drives/Compatibility:
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    27
// Will run on all platforms, but precondition failure is expected only on the UDEB emulator.
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    28
// Assumptions/Requirement/Pre-requisites:
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    29
// Failures and causes:
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    30
// Base Port information:
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    31
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    32
#define	__E32TEST_EXTENSION__
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    33
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    34
#include <e32std.h>
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    35
#include <e32std_private.h>
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    36
#include <e32math.h>
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    37
#include <e32panic.h>
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    38
#include <e32svr.h>
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    39
#include <e32test.h>
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    40
#include <e32ver.h>
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    41
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    42
_LIT(KServerName, "CTestServer");
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    43
const TVersion version(KE32MajorVersionNumber,
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    44
					   KE32MinorVersionNumber,
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    45
					   KE32BuildVersionNumber);
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    46
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    47
// Globals for counting number of times each thread/object runs
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    48
TInt nIdleCalls, nTimerCalls, nServerCalls;
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    49
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    50
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    51
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    52
//
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    53
// Server classes and code ...
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    54
//
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    55
class CTestServer : public CServer2
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    56
	{
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    57
public:
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    58
	IMPORT_C CTestServer(RTest* aTest) : CServer2(EPriorityIdle), iTest(aTest) {};
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    59
protected:
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    60
	IMPORT_C CSession2* NewSessionL(const TVersion& aVersion, const RMessage2& aMessage) const;
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    61
public:
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    62
	RTest* iTest;
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    63
	};
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    64
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    65
class CTestSession : public CSession2
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    66
	{
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    67
public:
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    68
	IMPORT_C void ServiceL(const RMessage2& aMessage);
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    69
	enum Action
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    70
		{
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    71
		EStop = 0,
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    72
		EDelay
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    73
		};
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    74
public:
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    75
	RTest* iTest;
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    76
	};
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    77
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    78
//
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    79
// CTestServer functions
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    80
//
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    81
EXPORT_C CSession2* CTestServer::NewSessionL(const TVersion& aVersion, const RMessage2& /*aMessage*/) const
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    82
	{
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    83
	if (User::QueryVersionSupported(version, aVersion) == EFalse)
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    84
		User::Leave(KErrNotSupported);
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    85
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    86
	CTestSession* newCTestSession = new CTestSession;
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    87
	if (newCTestSession == NULL)
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    88
		User::Leave(KErrNoMemory);
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    89
	newCTestSession->iTest = iTest;
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    90
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    91
	return newCTestSession;
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    92
	}
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    93
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    94
//
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    95
// CTestSession functions
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    96
//
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    97
EXPORT_C void CTestSession::ServiceL(const RMessage2& aMessage)
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    98
	{
6a75fa55495f 201037_09
hgs
parents:
diff changeset
    99
	if ((++nServerCalls & 0x03ff) == 10000)		// never true, to suppress message
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   100
		iTest->Printf(_L("S:calls: I=%-7d  S=%-7d  T=%-7d  D=%-7d\n"),
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   101
				nIdleCalls, nServerCalls, nTimerCalls, aMessage.Int0());
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   102
	TInt r = KErrNone;
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   103
	TInt i = 0;
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   104
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   105
	switch (aMessage.Function())
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   106
		{
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   107
	case EStop:
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   108
		CActiveScheduler::Stop();
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   109
		break;
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   110
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   111
	case EDelay:
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   112
		// Spin a bit before replying
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   113
		// The compiler can't optimise this away because 'i' is used below ...
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   114
		for (i = 0; i < aMessage.Int0(); ++i)
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   115
			;
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   116
		break;
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   117
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   118
	default:
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   119
		r = KErrNotSupported;
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   120
		break;
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   121
		}
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   122
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   123
	if (i != -1)								// always true :)
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   124
		aMessage.Complete(r);
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   125
	}
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   126
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   127
//
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   128
// Thread to run the server code
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   129
//
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   130
TInt ServerThread(TAny*)
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   131
	{
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   132
	RTest test(_L("T_SCHEDRACE server"));
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   133
	test.Title();
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   134
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   135
// UserSvr::FsRegisterThread();
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   136
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   137
	test.Start(_L("Create and install ActiveScheduler"));
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   138
	CActiveScheduler* pScheduler = new CActiveScheduler;
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   139
	test_NotNull(pScheduler);
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   140
	CActiveScheduler::Install(pScheduler);
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   141
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   142
	test.Next(_L("Creating and starting Server"));
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   143
	CTestServer* pServer = new CTestServer(&test);
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   144
	test_NotNull(pServer);
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   145
	test_KErrNone(pServer->Start(KServerName));		// Starting a CServer2 also Adds it to the ActiveScheduler
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   146
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   147
	test.Next(_L("Rendezvous with main thread, then Start ActiveScheduler"));
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   148
	RThread self;
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   149
	self.Rendezvous(KErrNone);
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   150
	test.Printf(_L("        There might be something going on beneath this window\n"));
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   151
	CActiveScheduler::Start();
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   152
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   153
	// This code is not reached until the active scheduler exits.
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   154
	test.Next(_L("Destroy Server and ActiveScheduler"));
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   155
	delete pServer;
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   156
	delete pScheduler;
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   157
	test.Close();
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   158
	return (KErrNone);
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   159
	}
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   160
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   161
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   162
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   163
//
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   164
// Client classes and code ...
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   165
//
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   166
class RTestSession : public RSessionBase
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   167
	{
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   168
	public:
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   169
		RTestSession(RTest* aTest, TInt aTicks) : iTest(aTest), iMax(aTicks)
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   170
			{
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   171
			iDelay = iMax;
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   172
			iDelta = -1;
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   173
			};
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   174
		TInt Connect(const TDesC& aServer, int aSlots)
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   175
			{
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   176
			return RSessionBase::CreateSession(aServer, version, aSlots);
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   177
			};
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   178
		TInt SendBlind(TInt aFunction, const TIpcArgs& aArgs) const
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   179
			{
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   180
			return RSessionBase::Send(aFunction, aArgs);
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   181
			};
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   182
		TInt SendSync(TInt aFunction, const TIpcArgs& aArgs) const
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   183
			{
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   184
			return RSessionBase::SendReceive(aFunction, aArgs);
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   185
			};
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   186
		void SendAsync(TInt aFunction, const TIpcArgs& aArgs, TRequestStatus& aStatus) const
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   187
			{
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   188
			RSessionBase::SendReceive(aFunction, aArgs, aStatus);
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   189
			};
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   190
	public:
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   191
		RTest* iTest;
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   192
		TInt iMax;
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   193
		TInt iDelay;
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   194
		TInt iDelta;
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   195
	};
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   196
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   197
RTestSession* TheSession;
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   198
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   199
class CIdler : public CIdle
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   200
	{
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   201
	public:
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   202
		CIdler() : CIdle(EPriorityIdle)
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   203
			{
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   204
			CActiveScheduler::Add(this);
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   205
			};
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   206
		void Callback();
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   207
	};
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   208
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   209
void CIdler::Callback()
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   210
	{
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   211
	if ((++nIdleCalls & 0x03ff) == 10000)		// never true, to suppress message
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   212
		TheSession->iTest->Printf(_L("I:calls: I=%-7d  S=%-7d  T=%-7d  D=%-7d\n"),
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   213
						nIdleCalls, nServerCalls, nTimerCalls, TheSession->iDelay);
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   214
	// TInt delay = Math::Random() & 0xffff;					// up to ~64ms
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   215
	TheSession->SendBlind(CTestSession::EDelay, TIpcArgs(TheSession->iDelay));
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   216
	TheSession->SendAsync(CTestSession::EDelay, TIpcArgs(0), iStatus);
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   217
	SetActive();
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   218
	}
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   219
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   220
//
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   221
// CIdler callback wrapper
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   222
//
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   223
TInt IdleCallback(TAny* aPtr)
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   224
	{
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   225
	((CIdler*)aPtr)->Callback();
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   226
	return EFalse;
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   227
	}
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   228
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   229
//
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   230
// CPeriodic callback
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   231
//
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   232
TInt TimerCallback(TAny*)
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   233
	{
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   234
	if ((++nTimerCalls & 0x003f) == 1)			// true in one out of 64 cycles
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   235
		TheSession->iTest->Printf(_L("T:calls: I=%-7d  S=%-7d  T=%-7d  D=%-7d\n"),
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   236
						nIdleCalls, nServerCalls, nTimerCalls, TheSession->iDelay);
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   237
	if (TheSession->iDelay >= TheSession->iMax)
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   238
		TheSession->iDelta = -1;
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   239
//	if (TheSession->iDelay < 1)
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   240
//		TheSession->iDelta = 1;
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   241
	TheSession->iDelay += TheSession->iDelta;
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   242
	if (TheSession->iDelay < 0)
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   243
		CActiveScheduler::Stop();
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   244
	return ETrue;
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   245
	}
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   246
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   247
//
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   248
// Thread to run the client code
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   249
//
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   250
TInt ClientThread(TAny*)
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   251
	{
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   252
	RTest test(_L("T_SCHEDRACE client"));
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   253
	test.Title();
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   254
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   255
// UserSvr::FsRegisterThread();
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   256
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   257
	test.Start(_L("Create Session"));
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   258
	TheSession = new RTestSession(&test, 5*60*64);	// will run for 5 minutes
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   259
	test_NotNull(TheSession);
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   260
	test_KErrNone(TheSession->Connect(KServerName, 2));
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   261
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   262
	test.Start(_L("Create and install ActiveScheduler"));
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   263
	CActiveScheduler* pScheduler = new CActiveScheduler;
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   264
	test_NotNull(pScheduler);
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   265
	CActiveScheduler::Install(pScheduler);
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   266
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   267
	test.Next(_L("Create timer and idle task"));
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   268
	CPeriodic* pTimer = CPeriodic::New(CActive::EPriorityStandard);
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   269
	test_NotNull(pTimer);
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   270
	CIdler* pIdler = new CIdler();
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   271
	test_NotNull(pIdler);
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   272
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   273
	test.Next(_L("Rendezvous with main thread"));
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   274
	RThread self;
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   275
	self.Rendezvous(KErrNone);
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   276
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   277
	test.Next(_L("Start idle task, timer, and active scheduler"));
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   278
	pIdler->Start(TCallBack(IdleCallback, pIdler));
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   279
	pTimer->Start(1000000, 1000, TCallBack(TimerCallback, pTimer));
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   280
	test.Printf(_L("        There might be something going on beneath this window\n"));
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   281
	CActiveScheduler::Start();
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   282
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   283
	// This code is not reached until the active scheduler exits.
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   284
	TheSession->SendSync(CTestSession::EStop, TIpcArgs());
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   285
	TheSession->Close();
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   286
	test.Next(_L("Destroy Idle task, Timer, and ActiveScheduler"));
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   287
	delete pIdler;
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   288
	delete pTimer;
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   289
	delete pScheduler;
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   290
	test.Close();
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   291
	return (KErrNone);
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   292
	}
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   293
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   294
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   295
//
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   296
// Main program ...
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   297
//
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   298
GLDEF_C TInt E32Main()
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   299
	{
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   300
	RTest test(_L("Main T_SCHEDRACE test"));
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   301
	test.Title();
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   302
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   303
	test.Start(_L("Create server and client threads"));
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   304
	const TInt KHeapMinSize = 0x1000;
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   305
	const TInt KHeapMaxSize = 0x1000;
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   306
	RThread serverThread, clientThread;
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   307
	test_KErrNone(serverThread.Create(_L("Server Thread"), ServerThread, KDefaultStackSize, KHeapMinSize, KHeapMaxSize, NULL));
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   308
	test_KErrNone(clientThread.Create(_L("Client Thread"), ClientThread, KDefaultStackSize, KHeapMinSize, KHeapMaxSize, NULL));
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   309
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   310
	TRequestStatus serverStat, clientStat;
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   311
	serverThread.Rendezvous(serverStat);
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   312
	clientThread.Rendezvous(clientStat);
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   313
	serverThread.SetPriority(EPriorityMuchLess);
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   314
	clientThread.SetPriority(EPriorityMore);
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   315
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   316
	test.Next(_L("Start the threads"));
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   317
	serverThread.Resume();
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   318
	User::WaitForRequest(serverStat);
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   319
	test_KErrNone(serverStat.Int());
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   320
	clientThread.Resume();
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   321
	User::WaitForRequest(clientStat);
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   322
	test_KErrNone(clientStat.Int());
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   323
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   324
	test.Next(_L("Wait for the threads to stop"));
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   325
	serverThread.Logon(serverStat);
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   326
	clientThread.Logon(clientStat);
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   327
	User::WaitForRequest(clientStat);
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   328
	User::WaitForRequest(serverStat);
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   329
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   330
	switch (clientThread.ExitType())
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   331
		{
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   332
	case EExitKill:
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   333
		test.Printf(_L("  Client thread killed\n"));
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   334
		break;
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   335
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   336
	case EExitTerminate:
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   337
		test.Printf(_L("!!Client thread terminated:"));
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   338
		test.Panic(clientThread.ExitCategory(), clientThread.ExitReason());
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   339
		break;
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   340
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   341
	case EExitPanic:
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   342
		test.Panic(_L("!!Client thread panicked:"));
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   343
		test.Panic(clientThread.ExitCategory(), clientThread.ExitReason());
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   344
		break;
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   345
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   346
	default:
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   347
		test.Panic(_L("!!Client thread did something bizarre"), clientThread.ExitReason());
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   348
		break;
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   349
		}
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   350
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   351
	switch (serverThread.ExitType())
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   352
		{
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   353
	case EExitKill:
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   354
		test.Printf(_L("  Server thread killed\n"));
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   355
		break;
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   356
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   357
	case EExitTerminate:
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   358
		test.Printf(_L("!!Server thread terminated:"));
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   359
		test.Panic(serverThread.ExitCategory(), serverThread.ExitReason());
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   360
		break;
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   361
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   362
	case EExitPanic:
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   363
		//
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   364
		// To catch a panic put a breakpoint in User::Panic() (in UCDT\UC_UNC.CPP).
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   365
		//
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   366
		test.Printf(_L("!!Server thread panicked:"));
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   367
		test.Panic(serverThread.ExitCategory(), serverThread.ExitReason());
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   368
		break;
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   369
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   370
	default:
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   371
		test.Panic(_L("!!Server thread did something bizarre"), serverThread.ExitReason());
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   372
		break;
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   373
		}
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   374
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   375
	test.Next(_L("Close the threads"));
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   376
	CLOSE_AND_WAIT(serverThread);
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   377
	CLOSE_AND_WAIT(clientThread);
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   378
	test.End();
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   379
	return (KErrNone);
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   380
	}
6a75fa55495f 201037_09
hgs
parents:
diff changeset
   381