diff -r 0008ccd16016 -r 13fbfa31d2ba kerneltest/e32test/thread/t_thread.cpp --- a/kerneltest/e32test/thread/t_thread.cpp Fri Sep 17 08:37:04 2010 +0300 +++ b/kerneltest/e32test/thread/t_thread.cpp Mon Oct 04 02:35:35 2010 +0300 @@ -1,4 +1,4 @@ -// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). +// Copyright (c) 1995-2010 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" @@ -314,17 +314,29 @@ return(KErrNone); } -TInt StartInstructionThread(RThread& aT, const TDesC& aName, TInt aInstruction, TOwnerType aOwnerType, TRequestStatus* aL, TRequestStatus* aR) +TInt StartInstructionThread(RThread& aT, const TDesC& aName, TInt aInstruction, RAllocator* aAllocator, TOwnerType aOwnerType, TRequestStatus* aL, TRequestStatus* aR) { - TInt r = aT.Create(aName, &InstructionThread, KDefaultStackSize, KHeapSize, KHeapSize, (TAny*)aInstruction, aOwnerType); + TInt r; + + if (aAllocator == NULL) + { + r = aT.Create(aName, &InstructionThread, KDefaultStackSize, KHeapSize, KHeapSize, (TAny*)aInstruction, aOwnerType); + } + else + { + r = aT.Create(aName, &InstructionThread, KDefaultStackSize, aAllocator, (TAny*)aInstruction, aOwnerType); + } + if (r!=KErrNone) return r; + if (aL) { aT.Logon(*aL); TInt s = aL->Int(); test_Equal(s, KRequestPending); } + if (aR) { aT.Rendezvous(*aR); @@ -335,6 +347,7 @@ s = aR->Int(); test_KErrNone(s); } + return r; } @@ -404,7 +417,7 @@ thread.Close(); test.Next(_L("Create ENormal")); - r = StartInstructionThread(thread, _L("Thread"), ENormal, EOwnerProcess, 0, 0); + r = StartInstructionThread(thread, _L("Thread"), ENormal, NULL, EOwnerProcess, 0, 0); test_KErrNone(r); test.Next(_L("Test priorities")); @@ -547,7 +560,7 @@ for (TInt xx=0;xx<10;xx++) { test.Printf(_L("\r%02d"),xx); - r = StartInstructionThread(thread, _L("Thread1"), ENormal, anOwnerType, &stat, 0); + r = StartInstructionThread(thread, _L("Thread1"), ENormal, NULL, anOwnerType, &stat, 0); test_KErrNone(r); thread.Resume(); User::WaitForRequest(stat); @@ -556,7 +569,7 @@ test.Printf(_L("\n")); test.Next(_L("Panic within thread")); - r = StartInstructionThread(thread, _L("Thread2"), EInstrPanic, anOwnerType, &stat, 0); + r = StartInstructionThread(thread, _L("Thread2"), EInstrPanic, NULL, anOwnerType, &stat, 0); test_KErrNone(r); test(thread.ExitType()==EExitPending); thread.Resume(); @@ -570,11 +583,27 @@ TInt ijk; TUint seed[2] = { 0xadf85458, 0 }; TUint maxcount = 0; + RHeap* temporaryHeap = User::ChunkHeap(NULL, KHeapSize*8192, KHeapSize*8192); + test(temporaryHeap != NULL); for (ijk=0; ijk<8192; ++ijk) { if (!(ijk&255)) test.Printf(_L("%d\n"), ijk); - r = StartInstructionThread(thread, _L("Thread3"), EWait, anOwnerType, &stat, 0); + + // + // For this test we need to use a temporary heap created in advance as we + // will be panicking the thread at any point during its creation and since + // the heap would have been allocated by the user side thread, it is + // possible that if we let it allocate its own heap, the kernel may not + // be able to close it in the temporary states of creation or when + // TLocalThreadData::DllSetTls() grabs a temporary handle on the heap. + // In those cases RTest::CloseHandleAndWaitForDestruction() would timeout + // and the test would fail. + // + // In addition, if we shared the creating thread's heap allocations may + // be left behind and cause the heap mark test to fail on this thread. + // + r = StartInstructionThread(thread, _L("Thread3"), EWait, temporaryHeap, anOwnerType, &stat, 0); test_KErrNone(r); __e32_atomic_store_ord32(&IFLAG, 0); thread.Resume(); @@ -604,9 +633,10 @@ r = RTest::CloseHandleAndWaitForDestruction(thread); test_KErrNone(r); } + temporaryHeap->Close(); test.Next(_L("Internal exit")); - r = StartInstructionThread(thread, _L("Thread4"), ENormal, anOwnerType, &stat, 0); + r = StartInstructionThread(thread, _L("Thread4"), ENormal, NULL, anOwnerType, &stat, 0); test_KErrNone(r); test(thread.ExitType()==EExitPending); thread.Resume(); @@ -617,7 +647,7 @@ CLOSE_AND_WAIT(thread); test.Next(_L("External terminate")); - r = StartInstructionThread(thread, _L("Thread5"), EWait, anOwnerType, &stat, &rstat); + r = StartInstructionThread(thread, _L("Thread5"), EWait, NULL, anOwnerType, &stat, &rstat); test_KErrNone(r); test.Next(_L("Terminate")); thread.Terminate(KTerminationReason); @@ -630,7 +660,7 @@ CLOSE_AND_WAIT(thread); test.Next(_L("External kill")); - r = StartInstructionThread(thread, _L("Thread6"), EWait, anOwnerType, &stat, &rstat); + r = StartInstructionThread(thread, _L("Thread6"), EWait, NULL, anOwnerType, &stat, &rstat); test_KErrNone(r); thread.Suspend(); thread.Resume();