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
14template<typename ObjectType, typename ParameterType>
15class TestThread {
16public:
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
27	thread_id Spawn(const char* name, int32 priority)
28	{
29		return GlobalTestContext::Current()->SpawnThread(_Entry, name, priority,
30			this);
31	}
32
33private:
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
43private:
44	ObjectType*		fObject;
45	void			(ObjectType::*fMethod)(TestContext&, ParameterType*);
46	ParameterType*	fArgument;
47};
48
49
50template<typename ObjectType, typename ParameterType>
51thread_id
52SpawnThread(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