--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/e32test/dmav2/test_thread.h Mon Jan 18 21:31:10 2010 +0200
@@ -0,0 +1,140 @@
+/*
+* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "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: Some helper classes to assist with writing multi-threaded tests
+*
+*/
+
+
+#ifndef __TEST_THREAD_H__
+#define __TEST_THREAD_H__
+
+#include <e32base.h>
+#include <e32debug.h>
+#define __E32TEST_EXTENSION__
+#include <e32test.h>
+#include <e32cmn_private.h>
+
+_LIT(KPanicCat, "test_thread.h");
+
+
+static const TInt KHeapSize=0x2000;
+
+enum TPanicCode
+ {
+ EThreadCreateFailed
+ };
+
+/**
+A utility class for running functions in other threads/processes
+*/
+class TTestRemote
+ {
+public:
+ virtual TInt WaitForExitL() = 0;
+ virtual ~TTestRemote()
+ {}
+
+ virtual void Rendezvous(TRequestStatus& aStatus) = 0;
+
+protected:
+ TTestRemote()
+ {}
+
+ static TInt RunFunctor(TAny* aFunctor);
+
+ TRequestStatus iLogonStatus;
+ static TInt iCount;
+ };
+
+class TTestThread : public TTestRemote
+ {
+public:
+ TTestThread(const TDesC& aName, TThreadFunction aFn, TAny* aData, TBool aAutoResume=ETrue);
+
+ /**
+ Run aFunctor in another thread
+ */
+ TTestThread(const TDesC& aName, TFunctor& aFunctor, TBool aAutoResume=ETrue);
+
+ ~TTestThread();
+
+ void Resume();
+
+ /**
+ If thread exited normally, return its return code
+ Otherwise, leave with exit reason
+ */
+ virtual TInt WaitForExitL();
+
+ virtual void Rendezvous(TRequestStatus& aStatus);
+
+private:
+ void Init(const TDesC& aName, TThreadFunction aFn, TAny* aData, TBool aAutoResume);
+
+ RThread iThread;
+ };
+
+class CTest : public CBase, public TFunctor
+ {
+public:
+ ~CTest();
+
+ virtual void operator()();
+ virtual void RunTest() = 0;
+ virtual CTest* Clone() const = 0;
+
+ /**
+ Prints a formatted description of the test
+ */
+ void Announce() const;
+
+ const TDesC& Name() const;
+
+ /**
+ Should print the type of test, with no newlines.
+ eg. "Transfer", "Fragmentation"
+ TODO drop the function, just add a test type member
+ */
+ virtual void PrintTestType() const = 0;
+
+ /**
+ Display any information about test environment, with no newlines
+ eg. "DMA channel 16"
+ The base class version prints nothing.
+ */
+ virtual void PrintTestInfo() const;
+
+protected:
+ CTest(const TDesC& aName, TInt aIterations);
+ CTest(const CTest& aOther);
+
+ //It would be useful to have an RTest member, but this can't be
+ //initialised untill the new thread is running as it will refer to
+ //the creating thread
+ RBuf iName;
+ const TInt iIterations;
+ };
+
+/**
+Make aNumberOfThreads copies of aTest and run
+each in its own thread
+
+@param test Reference to test object
+@param aTest Referance
+*/
+void MultipleTestRun(RTest& test, const CTest& aTest, TInt aNumberOfThreads);
+
+void MultipleTestRun(const RPointerArray<CTest>& aTests);
+#endif // #ifndef __TEST_THREAD_H__
+