summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNao Pross <naopross@thearcway.org>2019-01-23 17:09:11 +0100
committerNao Pross <naopross@thearcway.org>2019-01-23 17:09:36 +0100
commitd67447c90ef9bbb4abce24e425e698a846f1bd5d (patch)
treea28790170659abac3223eb75da629bf3c8c44236
parentDelete build directory (diff)
parentFix bug in RAII jobs, debug session on ts3 (diff)
downloadflatland-d67447c90ef9bbb4abce24e425e698a846f1bd5d.tar.gz
flatland-d67447c90ef9bbb4abce24e425e698a846f1bd5d.zip
Merge branch 'raii-task'
-rw-r--r--.gitignore2
-rw-r--r--engine/include/core/priority.hpp2
-rw-r--r--engine/include/core/task.hpp6
-rw-r--r--engine/task.cpp24
m---------lib/libmm0
-rw-r--r--makefile69
-rw-r--r--ninja/rules.ninja4
-rw-r--r--test/task_test.cpp10
8 files changed, 26 insertions, 91 deletions
diff --git a/.gitignore b/.gitignore
index c3e0a43..a054592 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,5 @@
# build files
-bin
+build
**/*.o
# ninja build files
diff --git a/engine/include/core/priority.hpp b/engine/include/core/priority.hpp
index 1219d26..d6c9b35 100644
--- a/engine/include/core/priority.hpp
+++ b/engine/include/core/priority.hpp
@@ -33,7 +33,7 @@ namespace flat {
return lhs.priority() < rhs.priority();
}
- bool operator()(const std::weak_ptr<prioritized> lhs, const std::weak_ptr<prioritized>& rhs) {
+ bool operator()(const std::weak_ptr<prioritized> lhs, const std::weak_ptr<prioritized> rhs) {
if (auto l = lhs.lock()) {
if (auto r = rhs.lock()) {
// if both valid, check their priority
diff --git a/engine/include/core/task.hpp b/engine/include/core/task.hpp
index d886fcd..570e547 100644
--- a/engine/include/core/task.hpp
+++ b/engine/include/core/task.hpp
@@ -24,9 +24,13 @@ namespace flat {
callback m_callback;
};
- struct job : private queue<std::weak_ptr<task>> {
+ struct job : public queue<std::weak_ptr<task>> {
std::shared_ptr<task> make_task(task::callback f, priority_t p = priority_t::none);
void invoke_tasks();
+
+ inline void operator()() {
+ invoke_tasks();
+ }
};
}
}
diff --git a/engine/task.cpp b/engine/task.cpp
index 7f1b08b..8950633 100644
--- a/engine/task.cpp
+++ b/engine/task.cpp
@@ -2,6 +2,8 @@
#include <functional>
#include <memory>
+#include <algorithm>
+#include <cassert>
#include <vector>
@@ -18,27 +20,25 @@ namespace flat {
auto shared = std::make_shared<task>(f, p);
insert(shared);
+
return shared;
}
void job::invoke_tasks() {
- //std::for_each(begin(), end(), [&](auto tp) {
-
- vector<weak_ptr<task>> to_erase;
+ // expired tasks to remove
+ std::vector<job::value_type> to_erase;
- for (auto tp : (*this)) {
- if (tp.expired())
+ for (auto tp : *this) {
+ // check that the task has not expired
+ if (std::shared_ptr<task> t = tp.lock())
+ std::invoke(*t);
+ else
to_erase.push_back(tp);
}
- for (auto tp : to_erase)
+ // delete expired tasks
+ for (auto tp : to_erase) {
erase(tp);
-
- for (auto tp : (*this)) {
- // check that the task has not expired
- // run task
- auto t = tp.lock();
- std::invoke(*t);
}
}
diff --git a/lib/libmm b/lib/libmm
-Subproject e6595cf9c527e97198806c48aa0a14ae8e895e8
+Subproject ba03d198b82733043919fda918a80f4bb81800a
diff --git a/makefile b/makefile
deleted file mode 100644
index 86f67a9..0000000
--- a/makefile
+++ /dev/null
@@ -1,69 +0,0 @@
-# Makefile for symkit 1.0 by Raffaele Ancarola
-# C++ library for physics symulations
-
-NAME := flatland
-BIN := bin/lib$(NAME).so
-CC := g++
-CFLAGS := -Wall -std=c++17
-
-DIRS := engine
-BACKUP := backup
-INSTALL_DIR := /usr/lib
-
-INCLUDES := $(patsubst %,%/include,$(DIRS))
-
-# other required libraries
-LIBS := -lSDL2 #add libraries
-
-SRC := $(wildcard $(patsubst %,%/*.cpp,$(DIRS)))
-OBJ := $(patsubst %.cpp,bin/%.o,$(SRC))
-
-.PHONY: dirs clean install backup restore
-all: $(BIN)
-
-# builds all binaries into the shared library
-
-$(BIN): dirs $(OBJ)
- @printf "\nAssembling binaries\n\n"
- $(CC) $(CFLAGS) -shared -o $@ $(OBJ) -I $(INCLUDES) $(LIBS)
- @printf "\nCompilation successfully completed\n"
-
-# compile all sources
-
-$(OBJ): bin/%.o : %.cpp $(SRC)
- @printf "\nCompiling $<\n"
- $(CC) $(CFLAGS) -c $< -fPIC -o $@ -I $(INCLUDES) $(LIBS)
-
-# phony commands implementation
-
-# install the compiled library into your system
-# be careful with this command because it could not work
-install:
- chmod +x install.sh
- ./install.sh $(BIN) $(INSTALL_DIR)
-
-# generate all necessaries directories
-dirs:
- mkdir -p bin $(patsubst %,bin/%,$(DIRS))
- mkdir -p $(INCLUDES) $(BACKUP)
- @printf "Default directories created\n"
-
-# clean all binaries
-clean:
- rm -rfv bin/*
- @printf "Binary files cleaned\n"
-
-# backup the project in backup/symkit.zip
-backup:
- mkdir -p $(BACKUP)
- rm -rfv $(BACKUP)/*
- zip -r $(BACKUP)/symkit.zip $(DIRS)
- @printf "Backup completed\n"
-
-# restore the last backup, backup/symkit.zip must be present
-restore:
- unzip $(BACKUP)/symkit.zip -d $(BACKUP)
- rm -rfv $(DIRS)
- mv $(patsubst %,$(BACKUP)/%,$(DIRS)) .
- @printf "Backup restored\n"
-
diff --git a/ninja/rules.ninja b/ninja/rules.ninja
index 5897422..6674672 100644
--- a/ninja/rules.ninja
+++ b/ninja/rules.ninja
@@ -1,7 +1,7 @@
includes = -I lib/include -I engine/include
-cflags = -Wall -pedantic -fPIC -std=c++17 -DDEBUG $includes
+cflags = -g -Wall -pedantic -fPIC -std=c++17 -DDEBUG $includes
-libs = #-lSDL2 lib/libmm/build/libmm.a lib/libwsdl2/build/libwsdl2.a
+libs = -lSDL2 lib/libmm/build/libmm.a lib/libwsdl2/build/libwsdl2.a
lflags = $libs
flags = -fdiagnostics-color
diff --git a/test/task_test.cpp b/test/task_test.cpp
index e578bfd..76fb3b7 100644
--- a/test/task_test.cpp
+++ b/test/task_test.cpp
@@ -49,18 +49,18 @@ int main(int argc, char *argv[]) {
job f_job;
// test a function
- auto ciao_fn_task = f_job.make_task(hello);
+ auto hello_fn_task = f_job.make_task(hello);
// test a function ad make the pointer go out of scope
{
- auto hello_fn_task = f_job.make_task(ciao);
+ auto ciao_fn_task = f_job.make_task(ciao);
}
- f_job.invoke_tasks();
+ f_job();
std::cout << std::endl;
std::cout << "Testing methods" << std::endl;
- std::cout << " should print once: today we have no motd!" << std::endl;
+ std::cout << "should print once: today we have no motd!" << std::endl;
job m_job;
// test a method
@@ -76,7 +76,7 @@ int main(int argc, char *argv[]) {
//
// hello!
// hello world!
- m_job.invoke_tasks();
+ m_job();
return 0;
}