root/src/add-ons/kernel/file_systems/netfs/shared/TaskManager.cpp
// 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;
        }
}