summaryrefslogtreecommitdiffstats
path: root/engine/signal.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engine/signal.cpp')
-rw-r--r--engine/signal.cpp34
1 files changed, 23 insertions, 11 deletions
diff --git a/engine/signal.cpp b/engine/signal.cpp
index 0a57caa..d6be29b 100644
--- a/engine/signal.cpp
+++ b/engine/signal.cpp
@@ -20,12 +20,25 @@ channel::~channel()
channels.erase(label);
}
-void channel::start(priority_t prior)
+bool channel::start(priority_t prior, job * _job)
{
+ npdebug("Trying to map channel: ", label);
+
+ if (map())
+ checker.reset(); // force count to zero, it should remove task too
+ else
+ return false;
+
npdebug("Starting channel: ", label);
+ // take main job if no job is specified
+ if (!_job)
+ _job = &flat::main_job();
+
// Initialize task
- checker = flat::main_job().delegate_task(&channel::check_and_call, this, prior);
+ checker = _job->delegate_task(&channel::check_and_call, this, prior);
+
+ return true;
}
bool channel::map()
@@ -97,16 +110,17 @@ listener::ptr channel::connect(listener::callback f, const std::initializer_list
return nullptr;
}
-channel::ptr channel::create(const std::string& id, priority_t prior)
+bool channel::legit() const
{
- ptr out = std::make_shared<channel>(id);
-
- if (!out->map())
- return nullptr;
+ return mapped;
+}
- out->start(prior);
+channel::ptr channel::create(const std::string& id, priority_t prior, job * _job)
+{
+ ptr out = std::make_shared<channel>(id);
- return out;
+ // do not create a non-legit channel
+ return out->start(prior, _job) ? out : nullptr;
}
channel::ptr channel::find(const std::string& id)
@@ -119,8 +133,6 @@ channel::ptr channel::find(const std::string& id)
return (it == channels.end()) ? nullptr : (*it).second.lock();
}
-int step = 0;
-
void channel::check_and_call()
{
if (!stack.empty()) {