From d068bcbabdad3e8ba101b7c46857179232328517 Mon Sep 17 00:00:00 2001 From: Nathan Date: Sat, 12 Apr 2025 18:00:12 -0500 Subject: [PATCH] modules must pass dynamic handles to static dependencies --- include/utils/App/App.h | 33 +++++++++++++++++++++---- modules/ImguiModule/src/ImguiModule.cpp | 2 +- modules/MainGUI/src/MainGUI.cpp | 2 +- modules/Ollama/src/Ollama.cpp | 2 +- modules/Terminal/src/Terminal.cpp | 2 +- 5 files changed, 32 insertions(+), 9 deletions(-) diff --git a/include/utils/App/App.h b/include/utils/App/App.h index a4b92d9..e335854 100644 --- a/include/utils/App/App.h +++ b/include/utils/App/App.h @@ -39,7 +39,15 @@ namespace Archimedes { virtual void run() = 0; - virtual void stopModule(std::string lib) { toClose.push_back(lib); } + virtual void stopModule(std::string lib) { + //unload modules that depend on the one we are unloading + for(std::string s : runOrder) { + if(modules[s]->deps.find(lib) != modules[s]->deps.end()) { + stopModule(s); + } + } + toClose.push_back(lib); + } virtual void startModule(std::variant m) { toOpen.push_back(m); } @@ -148,27 +156,42 @@ namespace Archimedes { virtual void unload(std::string name) { + std::cout << "Attempting to unload module: " << name << std::endl; + if(modules.find(name) == modules.end()) return; - +/* //unload modules that depend on the one we are unloading for(std::string s : runOrder) { if(modules[s]->deps.find(name) != modules[s]->deps.end()) { unload(s); } } - +*/ Module* m = modules[name]; void* h = m->getHandle(); modules[name] = nullptr; + runOrder.remove(name); + if(h) { + //don't dlclose if other modules are still in runOrder! + bool closable = true; + for(auto s = runOrder.begin(); s != runOrder.end(); s++) { + if(modules[*s]->getHandle() == h) { + closable = false; + } + } + delete m; - dlclose(h); + + if(closable) { + dlclose(h); + } } - runOrder.remove(name); + std::cout << "Successfully unloaded module: " << name << std::endl << "runOrder.empty(): " << runOrder.empty() << std::endl; } virtual void printHelp() = 0; diff --git a/modules/ImguiModule/src/ImguiModule.cpp b/modules/ImguiModule/src/ImguiModule.cpp index faaab7a..d90e5a6 100644 --- a/modules/ImguiModule/src/ImguiModule.cpp +++ b/modules/ImguiModule/src/ImguiModule.cpp @@ -11,7 +11,7 @@ ImguiModule::ImguiModule(Archimedes::App* a, void* h = nullptr) : Archimedes::Mo name = "ImguiModule"; - WindowModule* wm = new WindowModule(a); + WindowModule* wm = new WindowModule(a, h); deps[wm->getName()] = wm; } diff --git a/modules/MainGUI/src/MainGUI.cpp b/modules/MainGUI/src/MainGUI.cpp index 901142e..c74b1ea 100644 --- a/modules/MainGUI/src/MainGUI.cpp +++ b/modules/MainGUI/src/MainGUI.cpp @@ -6,7 +6,7 @@ MainGUI::MainGUI(Archimedes::App* a, void* h) : Archimedes::Module(a, h) { name = "MainGUI"; - ImguiModule* im = new ImguiModule(a, nullptr); + ImguiModule* im = new ImguiModule(a, h); deps[im->getName()] = im; } diff --git a/modules/Ollama/src/Ollama.cpp b/modules/Ollama/src/Ollama.cpp index c4da1f0..49ee80c 100644 --- a/modules/Ollama/src/Ollama.cpp +++ b/modules/Ollama/src/Ollama.cpp @@ -7,7 +7,7 @@ Ollama::Ollama(Archimedes::App* a, void* h) : Archimedes::Module(a, h) { name = "Ollama"; - ImguiModule* im = new ImguiModule(a, nullptr); + ImguiModule* im = new ImguiModule(a, h); deps[im->getName()] = im; } diff --git a/modules/Terminal/src/Terminal.cpp b/modules/Terminal/src/Terminal.cpp index e2a60e9..ba1eae6 100644 --- a/modules/Terminal/src/Terminal.cpp +++ b/modules/Terminal/src/Terminal.cpp @@ -12,7 +12,7 @@ Terminal::Terminal(Archimedes::App* a, void* h) : Archimedes::Module(a, h) { name = "Terminal"; - ImguiModule* im = new ImguiModule(a, nullptr); + ImguiModule* im = new ImguiModule(a, h); deps[im->getName()] = im; }