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.First();
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.First()) {
138		fTasks.Remove(task);
139		task->Terminate();
140		delete task;
141	}
142}
143
144