kerneltest/e32test/demandpaging/t_svrpinning.cpp
branchRCL_3
changeset 42 a179b74831c9
parent 6 0173bcd7697c
equal deleted inserted replaced
41:0ffb4e86fcc9 42:a179b74831c9
    70 	{
    70 	{
    71 public:
    71 public:
    72 	enum TTestMode
    72 	enum TTestMode
    73 		{
    73 		{
    74 		EStop,
    74 		EStop,
    75 		ETestPinAll,
    75 		ETestRdPinAll,
    76 		ETestPinEven,
    76 		ETestRdUnpin3,
    77 		ETestPinOdd,
    77 		ETestRdUnpin2,
    78 		ETestPin3,
    78 		ETestRdUnpin1,
    79 		ETestPin2,
    79 		ETestRdUnpin0,
    80 		ETestPin1,
    80 		ETestWrPinAll,
    81 		ETestPin0,
    81 		ETestWrPinNone,
    82 		ETestPinWritable,
       
    83 		ETestUnpinWritable,
       
    84 		ETestPinOOM,
    82 		ETestPinOOM,
    85 		ETestPinDefault,
    83 		ETestPinDefault,
    86 		ETestDeadServer,
    84 		ETestDeadServer,
    87 		};
    85 		};
    88 //Override pure virtual
    86 //Override pure virtual
   154 RSemaphore gSem;
   152 RSemaphore gSem;
   155 RSemaphore gSem1;
   153 RSemaphore gSem1;
   156 
   154 
   157 TInt CTestSession::CheckDesPresent(const RMessage2& aMessage, TUint aArgIndex, TBool aExpected, TBool aWrite)
   155 TInt CTestSession::CheckDesPresent(const RMessage2& aMessage, TUint aArgIndex, TBool aExpected, TBool aWrite)
   158 	{
   156 	{
       
   157 	TRequestStatus clientStat;
       
   158 	
   159 	if (aExpected)
   159 	if (aExpected)
       
   160 		{
   160 		RDebug::Printf("  Checking message argument at %d is present", aArgIndex);
   161 		RDebug::Printf("  Checking message argument at %d is present", aArgIndex);
       
   162 		}
   161 	else
   163 	else
       
   164 		{
   162 		RDebug::Printf("  Checking message argument at %d is not present", aArgIndex);
   165 		RDebug::Printf("  Checking message argument at %d is not present", aArgIndex);
   163 
   166 		// Start watching for client thread death
       
   167 		RThread clientThread;
       
   168 		aMessage.Client(clientThread);
       
   169 		clientThread.Logon(clientStat);
       
   170 		clientThread.Close();
       
   171 		}
       
   172 		
   164 	// Get the length of the descriptor and verify it is as expected.
   173 	// Get the length of the descriptor and verify it is as expected.
   165 	TInt length = aMessage.GetDesLength(aArgIndex);
   174 	TInt length = aMessage.GetDesLength(aArgIndex);
   166 	if (length < KErrNone)
   175 	if (length < KErrNone)
   167 		{
   176 		{
   168 		RDebug::Printf("  Error getting descriptor length %d", length);
   177 		RDebug::Printf("  Error getting descriptor length %d", length);
   175 		}
   184 		}
   176 	if (!aWrite)
   185 	if (!aWrite)
   177 		{// Now read the descriptor and verify that it is present or not.
   186 		{// Now read the descriptor and verify that it is present or not.
   178 		TBuf8<5> des;
   187 		TBuf8<5> des;
   179 		TInt r = aMessage.Read(aArgIndex, des);
   188 		TInt r = aMessage.Read(aArgIndex, des);
   180 		TBool pass;
   189 		if (r != (aExpected ? KErrNone : KErrBadDescriptor))
   181 		if (iClientDied)
       
   182 			pass = r == KErrDied || r == KErrBadDescriptor;
       
   183 		else
       
   184 			pass = r == (aExpected ? KErrNone : KErrBadDescriptor);
       
   185 		if (!pass)
       
   186 			{
   190 			{
   187 			RDebug::Printf("  Error reading descriptor data r %d", r);
   191 			RDebug::Printf("  Unexpected value returned from aMessage.Read:%d", r);
   188 			return KErrGeneral;
   192 			return KErrGeneral;
   189 			}
   193 			}
   190 		if (r==KErrNone && (des[0] != 'a' || des[1] != 'r' || des[2] != 'g'))
   194 		if (r==KErrNone && (des[0] != 'a' || des[1] != 'r' || des[2] != 'g'))
   191 			{// The incorrect descriptor data has been passed.
   195 			{// The incorrect descriptor data has been passed.
   192 			RDebug::Printf("  Error in descriptor data is corrupt r %d", r);
   196 			RDebug::Printf("  Error in descriptor data is corrupt r %d", r);
   205 		TPtr8 argPtr = argTmp->Des();
   209 		TPtr8 argPtr = argTmp->Des();
   206 		argPtr.SetLength(max);
   210 		argPtr.SetLength(max);
   207 		for (TInt i = 0; i < max; i++)
   211 		for (TInt i = 0; i < max; i++)
   208 			argPtr[i] = (TUint8)aArgIndex;
   212 			argPtr[i] = (TUint8)aArgIndex;
   209 		TInt r = aMessage.Write(aArgIndex, argPtr);
   213 		TInt r = aMessage.Write(aArgIndex, argPtr);
   210 		TBool pass;
   214 		if (r != (aExpected ? KErrNone : KErrBadDescriptor))
   211 		if (iClientDied)
       
   212 			pass = r == KErrDied || r == KErrBadDescriptor;
       
   213 		else
       
   214 			pass = r == (aExpected ? KErrNone : KErrBadDescriptor);
       
   215 		if (!pass)
       
   216 			{
   215 			{
   217 			RDebug::Printf("  Error writing to the descriptor data r %d", r);
   216 			RDebug::Printf("  Unexpected value returned from aMessage.Write:%d", r);
   218 			return KErrGeneral;
   217 			return KErrGeneral;
   219 			}
   218 			}
   220 		}
   219 		}
   221 
   220 
   222 	if (!aExpected)
   221 	if (!aExpected)
   223 		{// The client should have been killed as the data wasn't present.
   222 		{// The client should have been killed as the data wasn't present.
   224 		if(!iClientDied)
   223 		RDebug::Printf("  CheckDesPresent: Waiting for client to die");
   225 			User::After(500000); // allow time for client to die before next test
   224 		User::WaitForRequest(clientStat);
   226 		iClientDied = ETrue;
   225 		iClientDied = ETrue;
       
   226 		RDebug::Printf("  CheckDesPresent: Client dead");
   227 		}
   227 		}
   228 	return KErrNone;
   228 	return KErrNone;
   229 	}
   229 	}
   230 
   230 
   231 TInt CTestSession::CheckArgsPresent(const RMessage2& aMessage, TBool arg0Present, TBool arg1Present, TBool arg2Present, TBool arg3Present, TBool aWrite=EFalse)
   231 TInt CTestSession::CheckArgsPresent(const RMessage2& aMessage, TBool arg0Present, TBool arg1Present, TBool arg2Present, TBool arg3Present, TBool aWrite=EFalse)
   241 	DPTest::FlushCache();
   241 	DPTest::FlushCache();
   242 
   242 
   243 	TInt r = User::SetRealtimeState(User::ERealtimeStateOn);
   243 	TInt r = User::SetRealtimeState(User::ERealtimeStateOn);
   244 	if (r != KErrNone)
   244 	if (r != KErrNone)
   245 		{
   245 		{
   246 		RDebug::Printf("Error setting realtime state r = %d", r);
   246 		RDebug::Printf("CheckArgsPresent: Error setting realtime state r = %d", r);
   247 		return r;
   247 		return r;
   248 		}
   248 		}
   249 
   249 
   250 	r = CheckDesPresent(aMessage, 0, arg0Present, aWrite);
   250 	r = CheckDesPresent(aMessage, 0, arg0Present, aWrite);
   251 	if (r == KErrNone)
   251 	if ((r == KErrNone) && !iClientDied)
   252 		r = CheckDesPresent(aMessage, 1, arg1Present, aWrite);
   252 		r = CheckDesPresent(aMessage, 1, arg1Present, aWrite);
   253 	if (r == KErrNone)
   253 	if ((r == KErrNone) && !iClientDied)
   254 		r = CheckDesPresent(aMessage, 2, arg2Present, aWrite);
   254 		r = CheckDesPresent(aMessage, 2, arg2Present, aWrite);
   255 	if (r == KErrNone)
   255 	if ((r == KErrNone) && !iClientDied)
   256 		r = CheckDesPresent(aMessage, 3, arg3Present, aWrite);
   256 		r = CheckDesPresent(aMessage, 3, arg3Present, aWrite);
   257 
   257 
   258 	User::SetRealtimeState(User::ERealtimeStateOff);
   258 	User::SetRealtimeState(User::ERealtimeStateOff);
   259 
   259 
   260 	return r;
   260 	return r;
   261 	}
   261 	}
   262 
   262 
   263 void CTestSession::ServiceL(const RMessage2& aMessage)
   263 EXPORT_C void CTestSession::ServiceL(const RMessage2& aMessage)
   264 //
   264 //
   265 // Virtual message-handler
   265 // Virtual message-handler
   266 //
   266 //
   267 	{
   267 	{
   268 	TInt r = KErrNone;
   268 	TInt r = KErrNone;
   270 	switch (aMessage.Function())
   270 	switch (aMessage.Function())
   271 		{
   271 		{
   272 		case EStop:
   272 		case EStop:
   273 			CActiveScheduler::Stop();
   273 			CActiveScheduler::Stop();
   274 			break;
   274 			break;
   275 		case ETestPinAll:
   275 		case ETestRdPinAll:
   276 			r = CheckArgsPresent(aMessage, ETrue, ETrue, ETrue, ETrue);
   276 			r = CheckArgsPresent(aMessage, ETrue, ETrue, ETrue, ETrue);
   277 			break;
   277 			break;
   278 		case ETestPinOdd:
   278 		case ETestRdUnpin3:
   279 			r = CheckArgsPresent(aMessage, EFalse, ETrue, EFalse, ETrue);
       
   280 			break;
       
   281 		case ETestPinEven:
       
   282 			r = CheckArgsPresent(aMessage, ETrue, EFalse, ETrue, EFalse);
       
   283 			break;
       
   284 		case ETestPin3:
       
   285 			r = CheckArgsPresent(aMessage, ETrue, ETrue, ETrue, EFalse);
   279 			r = CheckArgsPresent(aMessage, ETrue, ETrue, ETrue, EFalse);
   286 			break;
   280 			break;
   287 		case ETestPin2:
   281 		case ETestRdUnpin2:
   288 			r = CheckArgsPresent(aMessage, ETrue, ETrue, EFalse, EFalse);
   282 			r = CheckArgsPresent(aMessage, ETrue, ETrue, EFalse, ETrue);
   289 			break;
   283 			break;
   290 		case ETestPin1:
   284 		case ETestRdUnpin1:
   291 			r = CheckArgsPresent(aMessage, ETrue, EFalse, EFalse, EFalse);
   285 			r = CheckArgsPresent(aMessage, ETrue,  EFalse,  ETrue, ETrue);
   292 			break;
   286 			break;
   293 		case ETestPin0:
   287 		case ETestRdUnpin0:
       
   288 			r = CheckArgsPresent(aMessage, EFalse, ETrue, ETrue, ETrue);
       
   289 			break;
   294 		case ETestPinDefault:
   290 		case ETestPinDefault:
   295 			r = CheckArgsPresent(aMessage, EFalse, EFalse, EFalse, EFalse);
   291 			r = CheckArgsPresent(aMessage, EFalse, EFalse, EFalse, EFalse);
   296 			break;
   292 			break;
   297 		case ETestPinWritable:
   293 		case ETestWrPinAll:
   298 			r = CheckArgsPresent(aMessage, ETrue, ETrue, ETrue, ETrue, ETrue);
   294 			r = CheckArgsPresent(aMessage, ETrue, ETrue, ETrue, ETrue, ETrue);
   299 			break;
   295 			break;
   300 		case ETestUnpinWritable:
   296 		case ETestWrPinNone:
   301 			r = CheckArgsPresent(aMessage, EFalse, EFalse, EFalse, EFalse, ETrue);
   297 			r = CheckArgsPresent(aMessage, EFalse, EFalse, EFalse, EFalse, ETrue);
   302 			break;
   298 			break;
   303 		default:
   299 		default:
       
   300 			RDebug::Printf("CTestSession::ServiceL Unsupported Function: %d", aMessage.Function());
   304 			r = KErrNotSupported;
   301 			r = KErrNotSupported;
   305 
   302 
   306 		}
   303 		}
   307  	aMessage.Complete(r);
   304  	aMessage.Complete(r);
   308 
   305 
   445 		test(0);
   442 		test(0);
   446 		}
   443 		}
   447 
   444 
   448 	switch((TInt)aTestMode)
   445 	switch((TInt)aTestMode)
   449 		{
   446 		{
   450 		case CTestSession::ETestPinAll:
   447 		case CTestSession::ETestRdPinAll:
   451 			test.Printf(_L("Test pinning all args\n"));
   448 			test.Printf(_L("Test pinning all args\n"));
   452 			r = session.PublicSendReceive(CTestSession::ETestPinAll, TIpcArgs(&arg0, &arg1, &arg2, &arg3).PinArgs());
   449 			r = session.PublicSendReceive(CTestSession::ETestRdPinAll, TIpcArgs(&arg0, &arg1, &arg2, &arg3).PinArgs());
   453 			break;
   450 			break;
   454 
   451 
   455 		case CTestSession::ETestPinOdd:
   452 		case CTestSession::ETestRdUnpin3:
   456 			test.Printf(_L("Test pinning odd args\n"));
   453 			test.Printf(_L("Read Arg3 unpinned\n"));
   457 			r = session.PublicSendReceive(CTestSession::ETestPinOdd, TIpcArgs(&arg0, &argTmpBuf, &arg2, &arg3).PinArgs(EFalse, ETrue, EFalse, ETrue));
   454 			r = session.PublicSendReceive(CTestSession::ETestRdUnpin3, TIpcArgs(&arg0, argTmp, &argTmpBuf, &arg3).PinArgs(ETrue, ETrue, ETrue, EFalse));
   458 			break;
   455 			break;
   459 
   456 
   460 		case CTestSession::ETestPinEven:
   457 		case CTestSession::ETestRdUnpin2:
   461 			test.Printf(_L("Test pinning even args\n"));
   458 			test.Printf(_L("Read Arg2 unpinned\n"));
   462 			r = session.PublicSendReceive(CTestSession::ETestPinEven, TIpcArgs(&arg0, &arg1, argTmp, &arg3).PinArgs(ETrue, EFalse, ETrue, EFalse));
   459 			r = session.PublicSendReceive(CTestSession::ETestRdUnpin2, TIpcArgs(argTmp, &arg1, &arg2, &arg3).PinArgs(ETrue, ETrue, EFalse,  ETrue));
   463 			break;
   460 			break;
   464 
   461 
   465 		case CTestSession::ETestPin3:
   462 		case CTestSession::ETestRdUnpin1:
   466 			test.Printf(_L("Test pinning 3 args\n"));
   463 			test.Printf(_L("Read Arg1 unpinned\n"));
   467 			r = session.PublicSendReceive(CTestSession::ETestPin3, TIpcArgs(&arg0, &arg1, &arg2, &arg3).PinArgs(ETrue, ETrue, ETrue, EFalse));
   464 			r = session.PublicSendReceive(CTestSession::ETestRdUnpin1, TIpcArgs(&argTmpBuf, &arg1, &arg2, &arg3).PinArgs(ETrue, EFalse,  ETrue,  ETrue));
   468 			break;
   465 			break;
   469 
   466 
   470 		case CTestSession::ETestPin2:
   467 		case CTestSession::ETestRdUnpin0:
   471 			test.Printf(_L("Test pinning 2 args\n"));
   468 			test.Printf(_L("Read Arg0 unpinned\n"));
   472 			r = session.PublicSendReceive(CTestSession::ETestPin2, TIpcArgs(argTmp, &arg1, &arg2, &arg3).PinArgs(ETrue, ETrue, EFalse, EFalse));
   469 			r = session.PublicSendReceive(CTestSession::ETestRdUnpin0, TIpcArgs(&arg0, &arg1, &arg2, &arg3).PinArgs(EFalse, ETrue, ETrue, ETrue));
   473 			break;
       
   474 
       
   475 		case CTestSession::ETestPin1:
       
   476 			test.Printf(_L("Test pinning 1 args\n"));
       
   477 			r = session.PublicSendReceive(CTestSession::ETestPin1, TIpcArgs(&argTmpBuf, &arg1, &arg2, &arg3).PinArgs(ETrue, EFalse, EFalse, EFalse));
       
   478 			break;
       
   479 
       
   480 		case CTestSession::ETestPin0:
       
   481 			test.Printf(_L("Test pinning 0 args\n"));
       
   482 			r = session.PublicSendReceive(CTestSession::ETestPin0, TIpcArgs(&arg0, &arg1, &arg2, &arg3).PinArgs(EFalse, EFalse, EFalse, EFalse));
       
   483 			break;
   470 			break;
   484 
   471 
   485 		case CTestSession::ETestPinDefault:
   472 		case CTestSession::ETestPinDefault:
   486 			test.Printf(_L("Test the default pinning policy of this server\n"));
   473 			test.Printf(_L("Test the default pinning policy of this server\n"));
   487 			r = session.PublicSendReceive(CTestSession::ETestPinDefault, TIpcArgs(&arg0, &arg1, &arg2, argTmp));
   474 			r = session.PublicSendReceive(CTestSession::ETestPinDefault, TIpcArgs(&arg0, &arg1, &arg2, argTmp));
   488 			break;
   475 			break;
   489 
   476 
   490 		case CTestSession::ETestPinWritable:
   477 		case CTestSession::ETestWrPinAll:
   491 			test.Printf(_L("Test writing to pinned descriptors\n"));
   478 			test.Printf(_L("Test writing to pinned descriptors\n"));
   492 			r = session.PublicSendReceive(CTestSession::ETestPinWritable, TIpcArgs(&arg0, &arg3, &arg4, &arg5).PinArgs(ETrue, ETrue, ETrue, ETrue));
   479 			r = session.PublicSendReceive(CTestSession::ETestWrPinAll, TIpcArgs(&arg0, &arg3, &arg4, &arg5).PinArgs(ETrue, ETrue, ETrue, ETrue));
   493 			// Verify the index of each argument has been written to each descriptor.
   480 			// Verify the index of each argument has been written to each descriptor.
   494 			{
   481 			{
   495 			TUint maxLength = arg0.MaxLength();
   482 			TUint maxLength = arg0.MaxLength();
   496 			test_Equal(maxLength, arg0.Length());
   483 			test_Equal(maxLength, arg0.Length());
   497 			TUint j = 0;
   484 			TUint j = 0;
   510 			for (j = 0; j < maxLength; j++)
   497 			for (j = 0; j < maxLength; j++)
   511 				test_Equal(3, arg5[j]);
   498 				test_Equal(3, arg5[j]);
   512 			}
   499 			}
   513 			break;
   500 			break;
   514 
   501 
   515 		case CTestSession::ETestUnpinWritable:
   502 		case CTestSession::ETestWrPinNone:
   516 			test.Printf(_L("Test writing to unpinned descriptors\n"));
   503 			test.Printf(_L("Test writing to unpinned descriptors\n"));
   517 			r = session.PublicSendReceive(CTestSession::ETestUnpinWritable, TIpcArgs(&arg0, &arg3, &arg4, &arg5).PinArgs(EFalse, EFalse, EFalse, EFalse));
   504 			r = session.PublicSendReceive(CTestSession::ETestWrPinNone, TIpcArgs(&arg0, &arg3, &arg4, &arg5).PinArgs(EFalse, EFalse, EFalse, EFalse));
   518 			// Verify the index of each argument has been written to each descriptor.
   505 			// Verify the index of each argument has been written to each descriptor.
   519 			// Unless this is a pinnning server than the thread will be panicked before we reach there.
   506 			// Unless this is a pinnning server than the thread will be panicked before we reach there.
   520 			{
   507 			{
   521 			TUint maxLength = arg0.MaxLength();
   508 			TUint maxLength = arg0.MaxLength();
   522 			test_Equal(maxLength, arg0.Length());
   509 			test_Equal(maxLength, arg0.Length());
   540 
   527 
   541 		case CTestSession::ETestDeadServer:
   528 		case CTestSession::ETestDeadServer:
   542 			test.Printf(_L("Test pinning to dead server\n"));
   529 			test.Printf(_L("Test pinning to dead server\n"));
   543 			gSem.Signal();
   530 			gSem.Signal();
   544 			gSem1.Wait();
   531 			gSem1.Wait();
   545 			r = session.PublicSendReceive(CTestSession::ETestPinAll, TIpcArgs(&arg0, &arg1, &arg2, &arg3).PinArgs());
   532 			r = session.PublicSendReceive(CTestSession::ETestRdPinAll, TIpcArgs(&arg0, &arg1, &arg2, &arg3).PinArgs());
   546 			break;
   533 			break;
   547 
   534 
   548 		case CTestSession::ETestPinOOM:
   535 		case CTestSession::ETestPinOOM:
   549 			test.Printf(_L("Pinning OOM tests\n"));
   536 			test.Printf(_L("Pinning OOM tests\n"));
   550 			__KHEAP_MARK;
   537 			__KHEAP_MARK;
   552 			TUint i;
   539 			TUint i;
   553 			r = KErrNoMemory;
   540 			r = KErrNoMemory;
   554 			for (i = 0; i < KMaxKernelAllocations && r == KErrNoMemory; i++)
   541 			for (i = 0; i < KMaxKernelAllocations && r == KErrNoMemory; i++)
   555 				{
   542 				{
   556 				__KHEAP_FAILNEXT(i);
   543 				__KHEAP_FAILNEXT(i);
   557 				r = session.PublicSendReceive(CTestSession::ETestPinAll, TIpcArgs(&arg0, &arg1, &arg2, &arg3).PinArgs());
   544 				r = session.PublicSendReceive(CTestSession::ETestRdPinAll, TIpcArgs(&arg0, &arg1, &arg2, &arg3).PinArgs());
   558 				__KHEAP_RESET;
   545 				__KHEAP_RESET;
   559 				}
   546 				}
   560 			test.Printf(_L("SendReceive took %d tries\n"),i);
   547 			test.Printf(_L("SendReceive took %d tries\n"),i);
   561 			test_KErrNone(r);
   548 			test_KErrNone(r);
   562 
   549 
   632 		// Wait for the server to start and then create a session to it.
   619 		// Wait for the server to start and then create a session to it.
   633 		gSem.Wait();
   620 		gSem.Wait();
   634 		RSession session;
   621 		RSession session;
   635 		test_KErrNone(session.PublicCreateSession(_L("CTestServer"),5));
   622 		test_KErrNone(session.PublicCreateSession(_L("CTestServer"),5));
   636 		
   623 		
   637 		for (	TUint clientTest = CTestSession::ETestPinAll; 
   624 		for (	TUint clientTest = CTestSession::ETestRdPinAll; 
   638 				clientTest <= CTestSession::ETestPinDefault && !exitFailure;
   625 				clientTest <= CTestSession::ETestPinDefault && !exitFailure;
   639 				clientTest++)
   626 				clientTest++)
   640 			{
   627 			{
   641 			// Create the client thread it needs to have a paged stack and heap.
   628 			// Create the client thread it needs to have a paged stack and heap.
   642 			TThreadCreateInfo clientInfo(_L("Client Thread"), ClientThread, 10 * gPageSize, (TAny*)clientTest);
   629 			TThreadCreateInfo clientInfo(_L("Client Thread"), ClientThread, 10 * gPageSize, (TAny*)clientTest);
   652 			// Wait for the client thread to end.
   639 			// Wait for the client thread to end.
   653 			User::WaitForRequest(clientStat);
   640 			User::WaitForRequest(clientStat);
   654 
   641 
   655 			// If all the descriptor arguments were not pinned then the client 
   642 			// If all the descriptor arguments were not pinned then the client 
   656 			// thread should have been panicked.
   643 			// thread should have been panicked.
   657 			TBool expectPanic = (clientTest == CTestSession::ETestPinAll || 
   644 			TBool expectPanic = (clientTest == CTestSession::ETestRdPinAll || 
   658 								clientTest == CTestSession::ETestPinWritable ||
   645 								clientTest == CTestSession::ETestWrPinAll ||
   659 								clientTest == CTestSession::ETestPinOOM )? 0 : 1;
   646 								clientTest == CTestSession::ETestPinOOM )? 0 : 1;
   660 			expectPanic = !UpdateExpected(!expectPanic);
   647 			expectPanic = !UpdateExpected(!expectPanic);
   661 
   648 
   662 			TInt exitReason = clientThread.ExitReason();
   649 			TInt exitReason = clientThread.ExitReason();
   663 			TInt exitType = clientThread.ExitType();
   650 			TInt exitType = clientThread.ExitType();
   664 			if (expectPanic)
   651 			if (expectPanic)
   665 				{
   652 				{
   666 				if (exitType != EExitPanic || 
   653 				if (exitType != EExitPanic || 
   667 					exitReason != EIllegalFunctionForRealtimeThread ||
   654 					exitReason != EIllegalFunctionForRealtimeThread ||
   668 					clientThread.ExitCategory() != _L("KERN-EXEC"))
   655 					clientThread.ExitCategory() != _L("KERN-EXEC"))
   669 					{// Thread didn't panic as expected.
   656 					{
       
   657 					test.Printf(_L("Thread didn't panic as expected\n"));
   670 					exitFailure = ETrue;
   658 					exitFailure = ETrue;
   671 					}
   659 					}
   672 				}
   660 				}
   673 			else
   661 			else
   674 				{
   662 				{
   675 				if (exitType != EExitKill || exitReason != KErrNone)
   663 				if (exitType != EExitKill || exitReason != KErrNone)
   676 					{// Thread didn't exit gracefully as expected.
   664 					{
       
   665 					test.Printf(_L("Thread didn't exit gracefully as expected\n"));
   677 					exitFailure = ETrue;
   666 					exitFailure = ETrue;
   678 					}
   667 					}
   679 				}
   668 				}
       
   669 			test(!exitFailure);
   680 			CLOSE_AND_WAIT(clientThread);
   670 			CLOSE_AND_WAIT(clientThread);
   681 			}
   671 			}
   682 
   672 
   683 		test.Next(_L("Test client sending message to closed server"));
   673 		test.Next(_L("Test client sending message to closed server"));
   684 		TThreadCreateInfo clientInfo(_L("Client Thread"), ClientThread, 10 * gPageSize, (TAny*)CTestSession::ETestDeadServer);
   674 		TThreadCreateInfo clientInfo(_L("Client Thread"), ClientThread, 10 * gPageSize, (TAny*)CTestSession::ETestDeadServer);
   695 		session.PublicSendReceive(CTestSession::EStop, TIpcArgs());
   685 		session.PublicSendReceive(CTestSession::EStop, TIpcArgs());
   696 		session.Close();
   686 		session.Close();
   697 		User::WaitForRequest(serverStat);
   687 		User::WaitForRequest(serverStat);
   698 		if (serverThread.ExitType() != EExitKill)
   688 		if (serverThread.ExitType() != EExitKill)
   699 			{
   689 			{
   700 			test.Printf(_L("!!Server thread did something bizarre %d"), serverThread.ExitReason());
   690 			test.Printf(_L("!!Server thread did something bizarre %d\n"), serverThread.ExitReason());
   701 			}
   691 			}
   702 
   692 
   703 		gSem1.Signal();
   693 		gSem1.Signal();
   704 		User::WaitForRequest(clientStat);
   694 		User::WaitForRequest(clientStat);
   705 		test_Equal(EExitKill, clientThread.ExitType());
   695 		test_Equal(EExitKill, clientThread.ExitType());
   708 		CLOSE_AND_WAIT(clientThread);
   698 		CLOSE_AND_WAIT(clientThread);
   709 		CLOSE_AND_WAIT(serverThread);
   699 		CLOSE_AND_WAIT(serverThread);
   710 		CLOSE_AND_WAIT(gSem);
   700 		CLOSE_AND_WAIT(gSem);
   711 		CLOSE_AND_WAIT(gSem1);
   701 		CLOSE_AND_WAIT(gSem1);
   712 		}
   702 		}
   713 	test(!exitFailure);
       
   714 
   703 
   715 	test.Next(_L("Test server setting pinning policy after server started"));
   704 	test.Next(_L("Test server setting pinning policy after server started"));
   716 	RThread serverThread;
   705 	RThread serverThread;
   717 	test_KErrNone(serverThread.Create(_L("Server Thread"),ServerThread,KDefaultStackSize,KHeapMinSize,KHeapMaxSize, (TAny*)gServerPinningState));
   706 	test_KErrNone(serverThread.Create(_L("Server Thread"),ServerThread,KDefaultStackSize,KHeapMinSize,KHeapMaxSize, (TAny*)gServerPinningState));
   718 	TRequestStatus serverStat;
   707 	TRequestStatus serverStat;