summaryrefslogtreecommitdiff
path: root/src/TaskMan.cc
diff options
context:
space:
mode:
authorPixel <pixel@nobis-crew.org>2011-10-09 21:42:24 -0700
committerPixel <pixel@nobis-crew.org>2011-10-09 21:59:27 -0700
commit4010635b9c3d74e544d37d1e9295316cff01b014 (patch)
treed7fe054af931604fcb7a7ff1f759ddd3281b81a3 /src/TaskMan.cc
parent74adacf6ec1de10b623112605b5d9610163522ec (diff)
Starting to integrate libev; timer event works.
Diffstat (limited to 'src/TaskMan.cc')
-rw-r--r--src/TaskMan.cc23
1 files changed, 20 insertions, 3 deletions
diff --git a/src/TaskMan.cc b/src/TaskMan.cc
index 6730f13..a9ad709 100644
--- a/src/TaskMan.cc
+++ b/src/TaskMan.cc
@@ -8,14 +8,19 @@ static Balau::LocalTmpl<Balau::TaskMan> localTaskMan;
Balau::TaskMan::TaskMan() : m_stopped(false) {
coro_create(&m_returnContext, 0, 0, 0, 0);
- if (!localTaskMan.getGlobal())
+ if (!localTaskMan.getGlobal()) {
localTaskMan.setGlobal(this);
+ m_loop = ev_default_loop(EVFLAG_AUTO);
+ } else {
+ m_loop = ev_loop_new(EVFLAG_AUTO);
+ }
}
Balau::TaskMan * Balau::TaskMan::getTaskMan() { return localTaskMan.get(); }
Balau::TaskMan::~TaskMan() {
Assert(localTaskMan.getGlobal() != this);
+ ev_loop_destroy(m_loop);
}
void Balau::TaskMan::mainLoop() {
@@ -33,8 +38,6 @@ void Balau::TaskMan::mainLoop() {
}
}
- // That's probably where we poll for events
-
// lock pending
// Adding tasks that were added, maybe from other threads
for (iL = m_pendingAdd.begin(); iL != m_pendingAdd.end(); iL++) {
@@ -45,6 +48,14 @@ void Balau::TaskMan::mainLoop() {
m_pendingAdd.clear();
// unlock pending
+ ev_run(m_loop, EVRUN_ONCE);
+
+ // let's check who got signaled, and call them
+ for (iH = m_signaledTasks.begin(); iH != m_signaledTasks.end(); iH++) {
+ t = *iH;
+ t->switchTo();
+ }
+
// Dealing with stopped and faulted tasks.
// First by signalling the waiters.
for (iH = m_tasks.begin(); iH != m_tasks.end(); iH++) {
@@ -60,6 +71,7 @@ void Balau::TaskMan::mainLoop() {
}
}
}
+ m_signaledTasks.clear();
// Then, by destroying them.
bool didDelete;
@@ -85,3 +97,8 @@ void Balau::TaskMan::registerTask(Balau::Task * t) {
m_pendingAdd.push_back(t);
// unlock pending
}
+
+void Balau::TaskMan::signalTask(Task * t) {
+ Assert(m_tasks.find(t) != m_tasks.end());
+ m_signaledTasks.insert(t);
+}