⛏️ index : haiku.git

// TaskManager.cpp

#include "TaskManager.h"

// #pragma mark -
// #pragma mark ----- Task -----

// constructor
Task::Task(const char* name)
	: fName(name),
	  fThread(-1),
	  fTerminating(false),
	  fDone(true)
{
}

// destructor
Task::~Task()
{
}

// Run
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;
}

// Terminate
void
Task::Terminate()
{
	fTerminating = true;
	Stop();
	if (fThread >= 0) {
		int32 result;
		wait_for_thread(fThread, &result);
	}
}

// IsDone
bool
Task::IsDone() const
{
	return fDone;
}

// Stop();
void
Task::Stop()
{
}

// SetDone
void
Task::SetDone(bool done)
{
	fDone = 0;
}

// _ThreadEntry
int32
Task::_ThreadEntry(void* data)
{
	return ((Task*)data)->_Thread();
}

// _Thread
int32
Task::_Thread()
{
	Execute();
	return 0;
}


// #pragma mark -
// #pragma mark ----- TaskManager -----

// constructor
TaskManager::TaskManager()
	: fTasks()
{
}

// destructor
TaskManager::~TaskManager()
{
	TerminateAllTasks();
}

// RunTask
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;
}

// RemoveDoneTasks
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;
	}
}

// TerminateAllTasks
void
TaskManager::TerminateAllTasks()
{
	while (Task* task = fTasks.First()) {
		fTasks.Remove(task);
		task->Terminate();
		delete task;
	}
}