1 /*
2 * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
3 * Distributed under the terms of the MIT License.
4 */
5 #ifndef TEST_THREAD_H
6 #define TEST_THREAD_H
7
8
9 #include <KernelExport.h>
10
11 #include "TestContext.h"
12
13
14 template<typename ObjectType, typename ParameterType>
15 class TestThread {
16 public:
TestThread(ObjectType * object,void (ObjectType::* method)(TestContext &,ParameterType *),ParameterType * argument)17 TestThread(ObjectType* object,
18 void (ObjectType::*method)(TestContext&, ParameterType*),
19 ParameterType* argument)
20 :
21 fObject(object),
22 fMethod(method),
23 fArgument(argument)
24 {
25 }
26
Spawn(const char * name,int32 priority)27 thread_id Spawn(const char* name, int32 priority)
28 {
29 return GlobalTestContext::Current()->SpawnThread(_Entry, name, priority,
30 this);
31 }
32
33 private:
_Entry(void * data)34 static status_t _Entry(void* data)
35 {
36 TestThread* thread = (TestThread*)data;
37 (thread->fObject->*thread->fMethod)(
38 *GlobalTestContext::Current()->CurrentContext(), thread->fArgument);
39 delete thread;
40 return B_OK;
41 }
42
43 private:
44 ObjectType* fObject;
45 void (ObjectType::*fMethod)(TestContext&, ParameterType*);
46 ParameterType* fArgument;
47 };
48
49
50 template<typename ObjectType, typename ParameterType>
51 thread_id
SpawnThread(ObjectType * object,void (ObjectType::* method)(TestContext &,ParameterType *),const char * name,int32 priority,ParameterType * arg)52 SpawnThread(ObjectType* object,
53 void (ObjectType::*method)(TestContext&, ParameterType*), const char* name,
54 int32 priority, ParameterType* arg)
55 {
56 TestThread<ObjectType, ParameterType>* thread
57 = new(std::nothrow) TestThread<ObjectType, ParameterType>(object,
58 method, arg);
59 if (thread == NULL)
60 return B_NO_MEMORY;
61
62 return thread->Spawn(name, priority);
63 }
64
65
66 #endif // TEST_THREAD_H
67