From 136e37c0e99092798b95a54c1cd22ae0d9ce2f39 Mon Sep 17 00:00:00 2001 From: ancarola Date: Sun, 27 Jan 2019 01:08:50 +0100 Subject: Debug signals attempted --- engine/include/core/task.hpp | 2 +- engine/signal.cpp | 51 ++++++++++++++++++++++---------------------- engine/task.cpp | 8 +++++-- 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 - inline std::shared_ptr delegate_task(R T::*mf, T& obj, priority_t p = priority_t::none) { + inline std::shared_ptr 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 #include "flatland.hpp" -using namespace std; +#include "debug.hpp" + using namespace flat::core; -map> channel::channels; +std::map> 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>(label, weak_from_this())); + channels.insert(std::pair>(label, weak_from_this())); mapped = true; } } @@ -41,12 +44,10 @@ bool channel::map() return mapped; } -#include - 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 p){ + [l](std::weak_ptr 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(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> to_erase; + std::vector> 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 e) { return e.expired(); }); + [](std::weak_ptr 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& filters) +listener::listener(callback m_callback, const std::initializer_list& 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 #include +#include "debug.hpp" using namespace std; @@ -20,6 +21,8 @@ namespace flat { auto shared = std::make_shared(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 to_erase; for (auto tp : *this) { // check that the task has not expired - if (std::shared_ptr t = tp.lock()) + if (std::shared_ptr 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 +#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; } -- cgit v1.2.1 From c01180b74cc111db70753b29c90ce9016b187c8f Mon Sep 17 00:00:00 2001 From: ancarola Date: Sun, 27 Jan 2019 01:13:55 +0100 Subject: Small fix T& -> T* --- engine/include/core/signal.hpp | 2 +- test/signal_test.cpp | 2 +- test/task_test.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/engine/include/core/signal.hpp b/engine/include/core/signal.hpp index 606d61a..e21b73e 100644 --- a/engine/include/core/signal.hpp +++ b/engine/include/core/signal.hpp @@ -124,7 +124,7 @@ namespace flat const std::initializer_list& filters = {}); template - inline listener::ptr connect(R T::*mf, T& obj, + inline listener::ptr connect(R T::*mf, T* obj, const std::initializer_list& filters = {}) { using namespace std::placeholders; diff --git a/test/signal_test.cpp b/test/signal_test.cpp index 76ab35b..4dcb635 100644 --- a/test/signal_test.cpp +++ b/test/signal_test.cpp @@ -44,7 +44,7 @@ public: c_listener(channel::ptr chan) { - lis = chan->connect(&c_listener::method_listener, *this); + lis = chan->connect(&c_listener::method_listener, this); } void method_listener(const object *o, signal::package msg) diff --git a/test/task_test.cpp b/test/task_test.cpp index 04bb23d..1db5098 100644 --- a/test/task_test.cpp +++ b/test/task_test.cpp @@ -16,7 +16,7 @@ private: public: message(job& job) { // add an example job - mytask = job.delegate_task(&message::print_motd, *this); + mytask = job.delegate_task(&message::print_motd, this); } void print_date() { -- cgit v1.2.1