summaryrefslogtreecommitdiff
path: root/src
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
parent74adacf6ec1de10b623112605b5d9610163522ec (diff)
Starting to integrate libev; timer event works.
Diffstat (limited to 'src')
-rw-r--r--src/Task.cc20
-rw-r--r--src/TaskMan.cc23
2 files changed, 39 insertions, 4 deletions
diff --git a/src/Task.cc b/src/Task.cc
index 73a2329..e5c971d 100644
--- a/src/Task.cc
+++ b/src/Task.cc
@@ -67,9 +67,27 @@ Balau::Task * Balau::Task::getCurrentTask() {
void Balau::Task::waitFor(Balau::Events::BaseEvent * e) {
e->registerOwner(this);
- // probably have to register the event in the Task manager
+}
+
+void Balau::Events::BaseEvent::doSignal() {
+ m_signal = true;
+ m_task->getTaskMan()->signalTask(m_task);
}
Balau::Events::TaskEvent::TaskEvent(Task * taskWaited) : m_taskWaited(taskWaited) {
m_taskWaited->m_waitedBy.push_back(this);
}
+
+Balau::Events::Timeout::Timeout(ev_tstamp tstamp) {
+ m_evt.set<Timeout, &Timeout::evt_cb>(this);
+ m_evt.set(tstamp);
+}
+
+void Balau::Events::Timeout::gotOwner(Task * task) {
+ m_evt.set(task->getTaskMan()->getLoop());
+ m_evt.start();
+}
+
+void Balau::Events::Timeout::evt_cb(ev::timer & w, int revents) {
+ doSignal();
+}
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);
+}