summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPixel <pixel@nobis-crew.org>2011-11-17 08:28:17 -0800
committerPixel <pixel@nobis-crew.org>2011-11-17 08:28:17 -0800
commit250b303a9e36f1ddcb3e3b28a130a8674839a3a7 (patch)
treed99b7583a29a0fede0388d0948961d9db4a9eb61 /src
parent0c4f27688622053a35d5b14ad138a6cd0fba20c4 (diff)
Since tasks can be on different task managers, one has to signal them a bit differently.
Diffstat (limited to 'src')
-rw-r--r--src/Task.cc24
-rw-r--r--src/TaskMan.cc2
2 files changed, 24 insertions, 2 deletions
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();
}
}
}