#ifndef __THREAD__
#define __THREAD__
#include <Debug.h>
#include <Looper.h>
#include <OS.h>
#include "ObjectList.h"
#include "FunctionObject.h"
namespace BPrivate {
class SimpleThread {
public:
SimpleThread(int32 priority = B_LOW_PRIORITY, const char* name = 0);
virtual ~SimpleThread();
void Go();
private:
static status_t RunBinder(void*);
virtual void Run() = 0;
protected:
thread_id fScanThread;
int32 fPriority;
const char* fName;
};
class Thread : private SimpleThread {
public:
static void Launch(FunctionObject* functor,
int32 priority = B_LOW_PRIORITY, const char* name = 0);
private:
Thread(FunctionObject*, int32 priority, const char* name);
~Thread();
virtual void Run();
FunctionObject* fFunctor;
};
class ThreadSequence : private SimpleThread {
public:
static void Launch(BObjectList<FunctionObject, true>*, bool async = true,
int32 priority = B_LOW_PRIORITY);
private:
ThreadSequence(BObjectList<FunctionObject, true>*, int32 priority);
~ThreadSequence();
virtual void Run();
static void Run(BObjectList<FunctionObject, true>* list);
BObjectList<FunctionObject, true>* fFunctorList;
};
template <class Param1>
class SingleParamFunctionObjectWorkaround : public
FunctionObjectWithResult<status_t> {
public:
SingleParamFunctionObjectWorkaround(
status_t (*function)(Param1), Param1 param1)
: fFunction(function),
fParam1(param1)
{
}
virtual void operator()()
{ (fFunction)(fParam1); }
virtual ulong Size() const { return sizeof(*this); }
private:
status_t (*fFunction)(Param1);
Param1 fParam1;
};
template <class T>
class SimpleMemberFunctionObjectWorkaround : public
FunctionObjectWithResult<status_t> {
public:
SimpleMemberFunctionObjectWorkaround(status_t (T::*function)(), T* onThis)
: fFunction(function),
fOnThis(onThis)
{
}
virtual void operator()()
{ (fOnThis->*fFunction)(); }
virtual ulong Size() const { return sizeof(*this); }
private:
status_t (T::*fFunction)();
T fOnThis;
};
template <class Param1, class Param2>
class TwoParamFunctionObjectWorkaround : public
FunctionObjectWithResult<status_t> {
public:
TwoParamFunctionObjectWorkaround(status_t (*callThis)(Param1, Param2),
Param1 param1, Param2 param2)
: function(callThis),
fParam1(param1),
fParam2(param2)
{
}
virtual void operator()()
{ (function)(fParam1, fParam2); }
virtual uint32 Size() const { return sizeof(*this); }
private:
status_t (*function)(Param1, Param2);
Param1 fParam1;
Param2 fParam2;
};
template <class Param1, class Param2, class Param3>
class ThreeParamFunctionObjectWorkaround : public
FunctionObjectWithResult<status_t> {
public:
ThreeParamFunctionObjectWorkaround(
status_t (*callThis)(Param1, Param2, Param3),
Param1 param1, Param2 param2, Param3 param3)
: function(callThis),
fParam1(param1),
fParam2(param2),
fParam3(param3)
{
}
virtual void operator()()
{ (function)(fParam1, fParam2, fParam3); }
virtual uint32 Size() const { return sizeof(*this); }
private:
status_t (*function)(Param1, Param2, Param3);
Param1 fParam1;
Param2 fParam2;
Param3 fParam3;
};
template <class Param1, class Param2, class Param3, class Param4>
class FourParamFunctionObjectWorkaround : public
FunctionObjectWithResult<status_t> {
public:
FourParamFunctionObjectWorkaround(
status_t (*callThis)(Param1, Param2, Param3, Param4),
Param1 param1, Param2 param2, Param3 param3, Param4 param4)
: function(callThis),
fParam1(param1),
fParam2(param2),
fParam3(param3),
fParam4(param4)
{
}
virtual void operator()()
{ (function)(fParam1, fParam2, fParam3, fParam4); }
virtual uint32 Size() const { return sizeof(*this); }
private:
status_t (*function)(Param1, Param2, Param3, Param4);
Param1 fParam1;
Param2 fParam2;
Param3 fParam3;
Param4 fParam4;
};
template<class Param1>
void
LaunchInNewThread(const char* name, int32 priority, status_t (*func)(Param1),
Param1 p1)
{
Thread::Launch(new SingleParamFunctionObjectWorkaround<Param1>(func, p1),
priority, name);
}
template<class T>
void
LaunchInNewThread(const char* name, int32 priority, status_t (T::*function)(),
T* onThis)
{
Thread::Launch(new SimpleMemberFunctionObjectWorkaround<T>(function,
onThis), priority, name);
}
template<class Param1, class Param2>
void
LaunchInNewThread(const char* name, int32 priority,
status_t (*func)(Param1, Param2),
Param1 p1, Param2 p2)
{
Thread::Launch(new
TwoParamFunctionObjectWorkaround<Param1, Param2>(func, p1, p2),
priority, name);
}
template<class Param1, class Param2, class Param3>
void
LaunchInNewThread(const char* name, int32 priority,
status_t (*func)(Param1, Param2, Param3),
Param1 p1, Param2 p2, Param3 p3)
{
Thread::Launch(new ThreeParamFunctionObjectWorkaround<Param1, Param2,
Param3>(func, p1, p2, p3), priority, name);
}
template<class Param1, class Param2, class Param3, class Param4>
void
LaunchInNewThread(const char* name, int32 priority,
status_t (*func)(Param1, Param2, Param3, Param4),
Param1 p1, Param2 p2, Param3 p3, Param4 p4)
{
Thread::Launch(new FourParamFunctionObjectWorkaround<Param1, Param2,
Param3, Param4>(func, p1, p2, p3, p4), priority, name);
}
}
using namespace BPrivate;
#endif