summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/Task.cc34
-rw-r--r--lib/TaskMan.cc53
2 files changed, 63 insertions, 24 deletions
diff --git a/lib/Task.cc b/lib/Task.cc
index c34d0e3..2db8ce5 100644
--- a/lib/Task.cc
+++ b/lib/Task.cc
@@ -37,26 +37,24 @@ String Task::GetName() {
return "Unknow Task";
}
-int Task::Suspend() throw (GeneralException) {
- int r;
-
+void Task::Suspend() throw (GeneralException) {
cerr << "Suspending task " << GetName() << "...\n";
-
suspended = true;
-
- r = setjmp(env);
-
- if (!r) throw TaskSwitch();
-
- return r;
+ throw TaskSwitch();
}
-void Task::Resume(int val) throw (GeneralException) {
- cerr << "Resuming task " << GetName() << "...\n";
- if (suspended) {
- suspended = false;
- longjmp(env, val);
- } else {
- throw GeneralException(String("Task ") + GetName() + " was not suspended.");
- }
+void WaitFor(Handle * h) {
+ w4ha.push_back(h);
+}
+
+void WaitFor(Task * t) {
+ w4ta.push_back(t);
+}
+
+void WaitFor(pid_t p) {
+ w4pr.push_back(p);
+}
+
+void WaitFor(struct timeval t) {
+ w4to.push_back(t);
}
diff --git a/lib/TaskMan.cc b/lib/TaskMan.cc
index f8ba303..9abffb1 100644
--- a/lib/TaskMan.cc
+++ b/lib/TaskMan.cc
@@ -1,18 +1,59 @@
-#include <TaskMan.h>
+#include <signal.h>
+#include "TaskMan.h"
-bool TaskMan::Inited = false;
+bool TaskMan::inited = false;
+
+static got_sigchild = 0;
+
+void taskman_sigchild(int sig) {
+ got_sigchild = 1;
+ signal(SIGCHILD, taskman_sigchild);
+}
TaskMan::TaskMan() throw (GeneralException) {
- if (Inited) {
- throw GeneralException("Another Task Manager is already running, aborting.");
+ throw GeneralException("You can't instanciate a Task Manager.");
+}
+
+void TaskMan::Init() throw (GeneralException) {
+ if (inited) {
+ throw GeneralException("Task Manager already initialised.");
}
- Inited = true;
+ signal(SIGCHILD, taskman_sigchild);
+
+ inited = true;
+ number = 0;
}
int TaskMan::AddTask(Task * t) {
+ TaskList.push_back(t);
+ number++;
+
+ return 0;
+}
+
+int TaskMan::RemoveTask(Task * t) {
+ int i;
+ for (i = 0; i < number; i++) {
+ if (TaskList[i] == t) {
+ TaskList.erase(i);
+ number--;
+ return 0;
+ }
+ }
+ return -1;
}
-void TaskMan::MainLoop() {
+void TaskMan::MainLoop() throw (GeneralException) {
+ while (1) {
+ if (number == 0) {
+ throw GeneralException("TaskMan: No more task to manage.");
+ }
+
+#ifdef HAVE_POLL
+
+#else
+#endif
+ }
}