#include "TaskManager.h"
Task::Task(const char* name)
: fName(name),
fThread(-1),
fTerminating(false),
fDone(true)
{
}
Task::~Task()
{
}
status_t
Task::Run()
{
const char* name = (fName.GetLength() > 0 ? fName.GetString() : "task");
#if USER
fThread = spawn_thread(&_ThreadEntry, name, B_NORMAL_PRIORITY, this);
#else
fThread = spawn_kernel_thread(&_ThreadEntry, name, B_NORMAL_PRIORITY, this);
#endif
if (fThread < 0)
return fThread;
fDone = false;
resume_thread(fThread);
return B_OK;
}
void
Task::Terminate()
{
fTerminating = true;
Stop();
if (fThread >= 0) {
int32 result;
wait_for_thread(fThread, &result);
}
}
bool
Task::IsDone() const
{
return fDone;
}
void
Task::Stop()
{
}
void
Task::SetDone(bool done)
{
fDone = 0;
}
int32
Task::_ThreadEntry(void* data)
{
return ((Task*)data)->_Thread();
}
int32
Task::_Thread()
{
Execute();
return 0;
}
TaskManager::TaskManager()
: fTasks()
{
}
TaskManager::~TaskManager()
{
TerminateAllTasks();
}
status_t
TaskManager::RunTask(Task* task)
{
if (!task)
return B_BAD_VALUE;
fTasks.Insert(task);
status_t error = task->Run();
if (error != B_OK) {
fTasks.Remove(task);
delete task;
}
return error;
}
void
TaskManager::RemoveDoneTasks()
{
Task* task = fTasks.First();
while (task) {
Task* next = fTasks.GetNext(task);
if (task->IsDone()) {
fTasks.Remove(task);
task->Terminate();
delete task;
}
task = next;
}
}
void
TaskManager::TerminateAllTasks()
{
while (Task* task = fTasks.First()) {
fTasks.Remove(task);
task->Terminate();
delete task;
}
}