diff options
author | ancarola <raffaele.ancarola@epfl.ch> | 2019-01-27 01:08:50 +0100 |
---|---|---|
committer | ancarola <raffaele.ancarola@epfl.ch> | 2019-01-27 01:08:50 +0100 |
commit | 136e37c0e99092798b95a54c1cd22ae0d9ce2f39 (patch) | |
tree | 5979668d618ca5c8480d98800fe88bfb8b36e6d1 | |
parent | Merge remote-tracking branch 'raffa/master' (diff) | |
download | flatland-136e37c0e99092798b95a54c1cd22ae0d9ce2f39.tar.gz flatland-136e37c0e99092798b95a54c1cd22ae0d9ce2f39.zip |
Debug signals attempted
-rw-r--r-- | engine/include/core/task.hpp | 2 | ||||
-rw-r--r-- | engine/signal.cpp | 51 | ||||
-rw-r--r-- | engine/task.cpp | 8 | ||||
-rw-r--r-- | test/signal_test.cpp | 11 |
4 files changed, 40 insertions, 32 deletions
diff --git a/engine/include/core/task.hpp b/engine/include/core/task.hpp index 49e156f..0840e08 100644 --- a/engine/include/core/task.hpp +++ b/engine/include/core/task.hpp @@ -38,7 +38,7 @@ namespace flat { /// add a task methods not owned by the job object (weak_ptr), /// this allows to make the task die when the owner object goes out of scope template<typename R, typename T> - inline std::shared_ptr<task> delegate_task(R T::*mf, T& obj, priority_t p = priority_t::none) { + inline std::shared_ptr<task> delegate_task(R T::*mf, T* obj, priority_t p = priority_t::none) { return delegate_task(std::bind(mf, obj), p); } diff --git a/engine/signal.cpp b/engine/signal.cpp index 5434469..0a57caa 100644 --- a/engine/signal.cpp +++ b/engine/signal.cpp @@ -3,12 +3,13 @@ #include <functional> #include "flatland.hpp" -using namespace std; +#include "debug.hpp" + using namespace flat::core; -map<string, weak_ptr<channel>> channel::channels; +std::map<std::string, std::weak_ptr<channel>> channel::channels; -channel::channel(const string& id) : labelled(id), mapped(false) +channel::channel(const std::string& id) : labelled(id), mapped(false) { } @@ -21,8 +22,10 @@ channel::~channel() void channel::start(priority_t prior) { + npdebug("Starting channel: ", label); + // Initialize task - checker = flat::main_job().delegate_task(&channel::check_and_call, *this, prior); + checker = flat::main_job().delegate_task(&channel::check_and_call, this, prior); } bool channel::map() @@ -33,7 +36,7 @@ bool channel::map() if (!other) { - channels.insert(pair<string, weak_ptr<channel>>(label, weak_from_this())); + channels.insert(std::pair<std::string, std::weak_ptr<channel>>(label, weak_from_this())); mapped = true; } } @@ -41,12 +44,10 @@ bool channel::map() return mapped; } -#include <iostream> - void channel::emit(const signal& sig) { - //cout << "React" << endl; stack.insert(sig); + npdebug("Emitted signal: ", sig.label, " ", this); } bool channel::connect(listener::ptr l) @@ -67,7 +68,7 @@ bool channel::connect(listener::ptr l) void channel::disconnect(listener::ptr l) { listeners.remove_if( - [l](weak_ptr<listener> p){ + [l](std::weak_ptr<listener> p){ listener::ptr pt = p.lock(); return pt.get() == l.get(); @@ -96,7 +97,7 @@ listener::ptr channel::connect(listener::callback f, const std::initializer_list return nullptr; } -channel::ptr channel::create(const string& id, priority_t prior) +channel::ptr channel::create(const std::string& id, priority_t prior) { ptr out = std::make_shared<channel>(id); @@ -108,7 +109,7 @@ channel::ptr channel::create(const string& id, priority_t prior) return out; } -channel::ptr channel::find(const string& id) +channel::ptr channel::find(const std::string& id) { if (id.empty()) return nullptr; @@ -118,17 +119,15 @@ channel::ptr channel::find(const string& id) return (it == channels.end()) ? nullptr : (*it).second.lock(); } +int step = 0; + void channel::check_and_call() { - //std::cout << "Signal check" << std::endl; - // check - //std::cout << "Stack size: " << stack.size() << endl; - if (!stack.empty()) { - std::cout << "Signal detected" << std::endl; + npdebug("Signal detected: ", label, " ", this) - vector<weak_ptr<listener>> to_erase; + std::vector<std::weak_ptr<listener>> to_erase; // TODO, maybe it exists pop /* for each listener_s, catch signal */ @@ -148,7 +147,7 @@ void channel::check_and_call() /* Erase invalidated listeners */ listeners.remove_if( - [](weak_ptr<listener> e) { return e.expired(); }); + [](std::weak_ptr<listener> e) { return e.expired(); }); stack.clear(); // TODO not so efficient } @@ -158,7 +157,7 @@ void channel::check_and_call() /* signal class */ signal::signal( object *sender, - const string& id, + const std::string& id, void *data, priority_t priority) @@ -169,7 +168,7 @@ signal::signal( object *sender, { } -bool signal::emit(const string& chan) const +bool signal::emit(const std::string& chan) const { channel::ptr c = channel::find(chan); @@ -185,7 +184,7 @@ bool signal::emit(const string& chan) const /* listener_s class */ -listener::listener(callback m_callback, const initializer_list<string>& filters) +listener::listener(callback m_callback, const std::initializer_list<std::string>& filters) : m_callback(m_callback), filters(filters) { @@ -196,7 +195,7 @@ listener::~listener() { } -bool listener::check_in_filters(const string& filter) const +bool listener::check_in_filters(const std::string& filter) const { for (const auto& f : filters) { @@ -207,17 +206,17 @@ bool listener::check_in_filters(const string& filter) const return false; } -void listener::add_filter(const string& f) +void listener::add_filter(const std::string& f) { filters.push_back(f); } -void listener::remove_filter(const string& f) +void listener::remove_filter(const std::string& f) { filters.remove(f); } -bool listener::connect(const string& chan) +bool listener::connect(const std::string& chan) { channel::ptr c = channel::find(chan); @@ -227,7 +226,7 @@ bool listener::connect(const string& chan) return bool(c); } -bool listener::disconnect(const string& chan) +bool listener::disconnect(const std::string& chan) { channel::ptr c = channel::find(chan); diff --git a/engine/task.cpp b/engine/task.cpp index cade502..6f0c466 100644 --- a/engine/task.cpp +++ b/engine/task.cpp @@ -8,6 +8,7 @@ #include <vector> #include <iostream> +#include "debug.hpp" using namespace std; @@ -20,6 +21,8 @@ namespace flat { auto shared = std::make_shared<task>(f, p); insert(shared); + npdebug("Task number: ", this->size()); + return shared; } @@ -28,14 +31,15 @@ namespace flat { } void job::invoke_tasks() { + // expired tasks to remove std::vector<job::value_type> to_erase; for (auto tp : *this) { // check that the task has not expired - if (std::shared_ptr<task> t = tp.lock()) + if (std::shared_ptr<task> t = tp.lock()) { std::invoke(*t); - else + } else to_erase.push_back(tp); } diff --git a/test/signal_test.cpp b/test/signal_test.cpp index db5b571..76ab35b 100644 --- a/test/signal_test.cpp +++ b/test/signal_test.cpp @@ -5,7 +5,7 @@ #include "flatland.hpp" #include "exceptions/forcequit.hpp" -#include <iostream> +#include "debug.hpp" using namespace std; using namespace flat; @@ -70,7 +70,7 @@ void lifeloop() if (!(steps % 40)) m_sender->send(); - if (++steps > 2000) + if (++steps > 200) { signal quit(0, "quit"); @@ -78,7 +78,7 @@ void lifeloop() flat::core_channel().emit(quit); } - if (steps > 2100) + if (steps > 205) throw flat::ForceQuit("Too many steps"); } @@ -107,8 +107,13 @@ int main() init_flatland(&win, status, 60); + npdebug("Deleting m_sender") delete m_sender; + + npdebug("Deleting m_listener") delete m_listener; + npdebug("Exiting") + return 0; } |