From 4010635b9c3d74e544d37d1e9295316cff01b014 Mon Sep 17 00:00:00 2001 From: Pixel Date: Sun, 9 Oct 2011 21:42:24 -0700 Subject: Starting to integrate libev; timer event works. --- src/Task.cc | 20 +++++++++++++++++++- src/TaskMan.cc | 23 ++++++++++++++++++++--- 2 files changed, 39 insertions(+), 4 deletions(-) (limited to 'src') 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(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 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); +} -- cgit v1.2.3