summaryrefslogtreecommitdiff
path: root/lib/TaskMan.cc
diff options
context:
space:
mode:
Diffstat (limited to 'lib/TaskMan.cc')
-rw-r--r--lib/TaskMan.cc75
1 files changed, 39 insertions, 36 deletions
diff --git a/lib/TaskMan.cc b/lib/TaskMan.cc
index ded359a..1af9234 100644
--- a/lib/TaskMan.cc
+++ b/lib/TaskMan.cc
@@ -4,6 +4,7 @@
#include "TaskMan.h"
vector<Task *> TaskMan::TaskList;
+vector<Task *> TaskMan::Zombies;
int TaskMan::number = 0;
bool TaskMan::inited = false;
@@ -30,59 +31,61 @@ void TaskMan::Init() throw (GeneralException) {
}
int TaskMan::AddTask(Task * t) {
+ if (!inited) {
+ Init();
+ }
TaskList.push_back(t);
number++;
return 0;
}
-int TaskMan::RemoveTask(Task * t) {
- int i;
+void TaskMan::MainLoop() throw (GeneralException) {
+ TaskList_t::iterator p;
+ Task * t;
- for (i = 0; i < number; i++) {
- if (TaskList[i] == t) {
- TaskList.erase(&TaskList[i]);
- number--;
- return 0;
- }
+ int no_burst;
+
+ if (!inited) {
+ Init();
}
- return -1;
-}
-
-void TaskMan::MainLoop() throw (GeneralException) {
- Task ** p, * t;
while (1) {
+ cerr << "TaskMan: Begin of main loop with " << number << " task to handle.\n";
+
if (number == 0) {
throw GeneralException("TaskMan: No more task to manage.");
}
- p = TaskList.begin();
-
- while (1) {
- t = *p;
-
-#ifdef HAVE_POLL
-#else
-#endif
+ no_burst = 0;
+ while (!no_burst) {
+ no_burst = 1;
+ /* First, we will check for any burning task and run 'em */
+ for (p = TaskList.begin(); p && (p != TaskList.end()); p++) {
+ t = *p;
- try {
- t->Run();
- }
- catch (TaskSwitch) {
- continue;
- }
- if (t->GetState() == TASK_DONE) {
- TaskList.erase(p);
- }
+ if (t->GetState() == TASK_BURST) {
+ t->Run();
+ }
- if (p == TaskList.end()) {
- break;
+ if (t->GetState() == TASK_BURST) {
+ no_burst = 0;
+ } else if (t->GetState() == TASK_DONE) {
+ TaskList.erase(p);
+ number--;
+ p--;
+ if (t->HasToClean()) {
+ delete t;
+ } else {
+ Zombies.push_back(t);
+ }
+ }
}
-
- p++;
}
-
-
}
+
+#ifdef HAVE_POLL
+#else
+#endif
+
}