summaryrefslogtreecommitdiff
path: root/src/Task.cc
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/Task.cc
parent0c4f27688622053a35d5b14ad138a6cd0fba20c4 (diff)
Since tasks can be on different task managers, one has to signal them a bit differently.
Diffstat (limited to 'src/Task.cc')
-rw-r--r--src/Task.cc24
1 files changed, 23 insertions, 1 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() {