summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNao Pross <naopross@thearcway.org>2019-01-27 12:55:42 +0100
committerNao Pross <naopross@thearcway.org>2019-01-27 12:55:42 +0100
commit27772ac1987e1a512aae1d525f3dcc0f548ca85e (patch)
treecc92905ad5aa5ff0e2855390c8c4356ad3832918
parentAdd g++ flag to use gold instead of ld for faster linkage (diff)
parentSmall fix T& -> T* (diff)
downloadflatland-27772ac1987e1a512aae1d525f3dcc0f548ca85e.tar.gz
flatland-27772ac1987e1a512aae1d525f3dcc0f548ca85e.zip
Merge remote-tracking branch 'raffa/master'
-rw-r--r--engine/include/core/signal.hpp2
-rw-r--r--engine/include/core/task.hpp2
-rw-r--r--engine/signal.cpp51
-rw-r--r--engine/task.cpp8
-rw-r--r--test/signal_test.cpp13
-rw-r--r--test/task_test.cpp2
6 files changed, 43 insertions, 35 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<std::string>& filters = {});
template<typename R, typename T>
- inline listener::ptr connect(R T::*mf, T& obj,
+ inline listener::ptr connect(R T::*mf, T* obj,
const std::initializer_list<std::string>& filters = {})
{
using namespace std::placeholders;
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..4dcb635 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;
@@ -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)
@@ -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;
}
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() {