summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--includes/Task.h7
-rw-r--r--src/Task.cc24
-rw-r--r--src/TaskMan.cc2
3 files changed, 30 insertions, 3 deletions
diff --git a/includes/Task.h b/includes/Task.h
index 22c522e..9244347 100644
--- a/includes/Task.h
+++ b/includes/Task.h
@@ -65,10 +65,15 @@ class TaskEvent : public BaseEvent {
TaskEvent(Task * taskWaited);
virtual ~TaskEvent();
void ack();
+ void signal();
Task * taskWaited() { return m_taskWaited; }
+ void evt_cb(ev::async & w, int revents) { doSignal(); }
+ protected:
+ virtual void gotOwner(Task * task);
private:
Task * m_taskWaited;
- bool m_ack;
+ bool m_ack, m_distant;
+ ev::async m_evt;
};
class Async : public BaseEvent {
diff --git a/src/Task.cc b/src/Task.cc
index 3a6f8ad..b512e23 100644
--- a/src/Task.cc
+++ b/src/Task.cc
@@ -114,13 +114,35 @@ void Balau::Events::BaseEvent::doSignal() {
}
}
-Balau::Events::TaskEvent::TaskEvent(Task * taskWaited) : m_taskWaited(taskWaited), m_ack(false) {
+Balau::Events::TaskEvent::TaskEvent(Task * taskWaited) : m_taskWaited(taskWaited), m_ack(false), m_distant(false) {
m_taskWaited->m_waitedBy.push_back(this);
}
+void Balau::Events::TaskEvent::signal() {
+ if (m_distant)
+ m_evt.send();
+ doSignal();
+}
+
+void Balau::Events::TaskEvent::gotOwner(Task * task) {
+ TaskMan * tm = task->getMyTaskMan();
+
+ m_evt.stop();
+ if (tm != m_taskWaited->getMyTaskMan()) {
+ m_evt.set(tm->getLoop());
+ m_evt.set<TaskEvent, &TaskEvent::evt_cb>(this);
+ m_evt.start();
+ m_distant = true;
+ } else {
+ m_distant = false;
+ }
+}
+
Balau::Events::TaskEvent::~TaskEvent() {
if (!m_ack)
ack();
+ if (m_distant)
+ m_evt.stop();
}
void Balau::Events::TaskEvent::ack() {
diff --git a/src/TaskMan.cc b/src/TaskMan.cc
index 81811db..375a94d 100644
--- a/src/TaskMan.cc
+++ b/src/TaskMan.cc
@@ -173,7 +173,7 @@ void Balau::TaskMan::mainLoop() {
Task::waitedByList_t::iterator i;
for (i = t->m_waitedBy.begin(); i != t->m_waitedBy.end(); i++) {
Events::TaskEvent * e = *i;
- e->doSignal();
+ e->signal();
}
}
}