1// TaskManager.cpp 2 3#include "TaskManager.h" 4 5// #pragma mark - 6// #pragma mark ----- Task ----- 7 8// constructor 9Task::Task(const char* name) 10 : fName(name), 11 fThread(-1), 12 fTerminating(false), 13 fDone(true) 14{ 15} 16 17// destructor 18Task::~Task() 19{ 20} 21 22// Run 23status_t 24Task::Run() 25{ 26 const char* name = (fName.GetLength() > 0 ? fName.GetString() : "task"); 27#if USER 28 fThread = spawn_thread(&_ThreadEntry, name, B_NORMAL_PRIORITY, this); 29#else 30 fThread = spawn_kernel_thread(&_ThreadEntry, name, B_NORMAL_PRIORITY, this); 31#endif 32 if (fThread < 0) 33 return fThread; 34 fDone = false; 35 resume_thread(fThread); 36 return B_OK; 37} 38 39// Terminate 40void 41Task::Terminate() 42{ 43 fTerminating = true; 44 Stop(); 45 if (fThread >= 0) { 46 int32 result; 47 wait_for_thread(fThread, &result); 48 } 49} 50 51// IsDone 52bool 53Task::IsDone() const 54{ 55 return fDone; 56} 57 58// Stop(); 59void 60Task::Stop() 61{ 62} 63 64// SetDone 65void 66Task::SetDone(bool done) 67{ 68 fDone = 0; 69} 70 71// _ThreadEntry 72int32 73Task::_ThreadEntry(void* data) 74{ 75 return ((Task*)data)->_Thread(); 76} 77 78// _Thread 79int32 80Task::_Thread() 81{ 82 Execute(); 83 return 0; 84} 85 86 87// #pragma mark - 88// #pragma mark ----- TaskManager ----- 89 90// constructor 91TaskManager::TaskManager() 92 : fTasks() 93{ 94} 95 96// destructor 97TaskManager::~TaskManager() 98{ 99 TerminateAllTasks(); 100} 101 102// RunTask 103status_t 104TaskManager::RunTask(Task* task) 105{ 106 if (!task) 107 return B_BAD_VALUE; 108 fTasks.Insert(task); 109 status_t error = task->Run(); 110 if (error != B_OK) { 111 fTasks.Remove(task); 112 delete task; 113 } 114 return error; 115} 116 117// RemoveDoneTasks 118void 119TaskManager::RemoveDoneTasks() 120{ 121 Task* task = fTasks.GetFirst(); 122 while (task) { 123 Task* next = fTasks.GetNext(task); 124 if (task->IsDone()) { 125 fTasks.Remove(task); 126 task->Terminate(); 127 delete task; 128 } 129 task = next; 130 } 131} 132 133// TerminateAllTasks 134void 135TaskManager::TerminateAllTasks() 136{ 137 while (Task* task = fTasks.GetFirst()) { 138 fTasks.Remove(task); 139 task->Terminate(); 140 delete task; 141 } 142} 143 144