diff --git a/flake.nix b/flake.nix index 7bf9c4c..8e8f83d 100755 --- a/flake.nix +++ b/flake.nix @@ -32,6 +32,7 @@ buildPhase = '' g++ \ *.cpp \ + -Wall \ -o $name ''; @@ -54,9 +55,10 @@ buildPhase = '' g++ \ - modules/TestMenu/src/*.cpp src/App.cpp \ + modules/TestMenu/src/**.cpp src/App.cpp \ -fpic -shared \ -I src \ + -Wall \ -o $name ''; @@ -79,9 +81,10 @@ buildPhase = '' g++ \ - modules/Print/src/*.cpp src/App.cpp \ + modules/Print/src/**.cpp src/App.cpp \ -fpic -shared \ -I src -I include \ + -Wall \ -o $name ''; @@ -109,10 +112,11 @@ buildPhase = '' g++ \ - modules/Window/src/*.cpp modules/Window/src/WindowImpl/GLFW/*.cpp src/App.cpp \ + modules/Window/src/**.cpp src/App.cpp \ -fpic -shared \ -I src -I include \ -lGL -lglfw -lGLEW \ + -Wall \ -o $name ''; @@ -137,9 +141,10 @@ buildPhase = '' g++ \ - modules/MainGUI/src/*.cpp src/App.cpp \ + modules/MainGUI/src/**.cpp src/App.cpp \ -fpic -shared \ -I src -I include \ + -Wall \ -o $name ''; diff --git a/modules/Window/src/WindowModule.cpp b/modules/Window/src/WindowModule.cpp index 242b00b..a32ff32 100644 --- a/modules/Window/src/WindowModule.cpp +++ b/modules/Window/src/WindowModule.cpp @@ -4,13 +4,21 @@ WindowModule::WindowModule(void* h, App& a) : Module(h, a) { name = "Window"; } -WindowModule::~WindowModule() {} +WindowModule::~WindowModule() { + delete window; + delete renderer; +} + +void WindowModule::onLoad() { + window = new Window(); + renderer = new Renderer(); +} void WindowModule::run() { - if(window.shouldClose()) { - app.stopModule(self); + if(window->shouldClose()) { + app.end(); } - window.doFrame(); + window->doFrame(); } diff --git a/modules/Window/src/WindowModule.h b/modules/Window/src/WindowModule.h index 66dc33f..dc8f062 100644 --- a/modules/Window/src/WindowModule.h +++ b/modules/Window/src/WindowModule.h @@ -11,11 +11,13 @@ class WindowModule : public Module { void run(); + void onLoad(); + private: - Window window; + Window* window; - Renderer renderer; + Renderer* renderer; }; diff --git a/src/App.cpp b/src/App.cpp index 58c7a28..c73462f 100644 --- a/src/App.cpp +++ b/src/App.cpp @@ -28,31 +28,15 @@ App::~App() { } } -void App::run() { - std::cout << "\nTesting...\n"; - // Main loop - while (!done && !modules.empty()) { +bool App::load(std::string lib, std::list blacklist = {}) { - for(auto it = modules.begin(); it != modules.end(); it++) { - (*it)->run(); - } - - for(auto it = toClose.begin(); it != toClose.end(); it++) { - unload(it); - } - toClose.clear(); - } - -} - -void App::load(std::string lib) { void* h = dlopen(lib.c_str(), RTLD_NOW); if(!h) { - std::cout << "could not open lib: \"" << lib.c_str() << "\"\nError: " << dlerror() << std::endl; - return; + std::cout << "could not open lib at: \"" << lib.c_str() << "\"\nError: " << dlerror() << std::endl; + return false; } Module::create_t* create = (Module::create_t*) dlsym(h, "create"); @@ -63,33 +47,60 @@ void App::load(std::string lib) { Module* m = create(h, App::Get()); - for(auto it = modules.begin(); it != modules.end(); it++) { - - if((*it)->getName() == m->getName()) { - std::cout << "Module \"" << m->getName() << "\" is already loaded!\n"; - return; + for(std::string s : blacklist) { + if(s == m->getName()) { + std::cout << "Module \"" << s << "\" is already loaded!\n"; + delete m; + dlclose(h); + return false; } } + blacklist.push_back(m->getName()); + + bool skip = false; + + for(auto it = m->deps.begin(); it != m->deps.end(); it++) { + for(std::string s : blacklist) { + if(it->first == s) + skip = true; + } + if(skip) { + skip = false; + continue; + } else { + load(it->second, blacklist); + } + } + + modules.push_back(m); m->setSelf(--modules.end()); modules.end()++; + + return true; } void App::unload(std::list::iterator it) { - void* h = (*it)->getHandle(); - - delete *it; + + Module* m = *it; + void* h = m->getHandle(); + + modules.erase(m->self); + delete m; dlclose(h); - modules.erase((*it)->self); } void App::stopModule(std::list::iterator it) { toClose.push_back(*it); } +void App::startModule(std::string lib) { + toOpen.push_back(lib); +} + void App::handleArgs(const int& argc, char* argv[]) { int i = 1; @@ -120,3 +131,30 @@ void App::handleArgs(const int& argc, char* argv[]) { void App::printHelp() { std::cout << "archimedes [ -h | --help ] /path/to/some/library.so\n"; } + + +void App::run() { + std::cout << "\nTesting...\n"; + + for(auto* m : modules) + m->onLoad(); + + // Main loop + while (!done && !modules.empty()) { + + for(auto* m : modules) { + m->run(); + } + + for(auto it = toClose.begin(); it != toClose.end(); it++) { + unload(it); + } + toClose.clear(); + + for(std::string s : toOpen) { + load(s, getBlacklist()); + } + toOpen.clear(); + } + +} diff --git a/src/App.h b/src/App.h index 1d115d6..53d6fcf 100644 --- a/src/App.h +++ b/src/App.h @@ -14,14 +14,22 @@ class App { std::list modules; std::list toClose; + std::list toOpen; - void load(std::string); + bool load(std::string, std::list); void unload(std::list::iterator); void handleArgs(const int&, char*[]); void printHelp(); + std::list getBlacklist() { + std::list l; + for(Module* m : modules) + l.push_back(m->getName()); + return l; + } + public: App(const int&, char*[]); ~App(); @@ -32,6 +40,8 @@ class App { void stopModule(std::list::iterator); + void startModule(std::string); + void end() { done = true; } }; diff --git a/src/Module.h b/src/Module.h index 491daea..4de9f16 100644 --- a/src/Module.h +++ b/src/Module.h @@ -11,11 +11,12 @@ class Module { public: typedef Module* create_t(void*, App&); - typedef void* destroy_t(Module*); Module(void* h, App& a) : handle(h), app(a) {}; virtual ~Module() {} virtual void run() = 0; + virtual void onLoad() = 0; + std::string getName() const { return name; } void* getHandle() { return handle; } @@ -28,6 +29,7 @@ class Module { App& app; + std::unordered_map deps; }; #endif diff --git a/src/pch.hpp b/src/pch.hpp index 070d3bb..a4593f6 100644 --- a/src/pch.hpp +++ b/src/pch.hpp @@ -4,8 +4,11 @@ #include #include #include +#include +#include +#include - +#include //#include //#include