From bc09e0d79b29ecc3cb9695c3aa2c5d411b065524 Mon Sep 17 00:00:00 2001 From: Nathan Date: Thu, 13 Mar 2025 16:38:10 -0500 Subject: [PATCH] more work on testMenu --- modules/testMenu/src/testMenu.cpp | 10 ++++++++-- modules/testMenu/src/testMenu.h | 4 ---- src/App.cpp | 22 +++++++++++++++++++--- src/App.h | 8 ++++---- src/Module.h | 4 +++- src/pch.hpp | 2 +- 6 files changed, 35 insertions(+), 15 deletions(-) diff --git a/modules/testMenu/src/testMenu.cpp b/modules/testMenu/src/testMenu.cpp index c0382bd..c925d55 100644 --- a/modules/testMenu/src/testMenu.cpp +++ b/modules/testMenu/src/testMenu.cpp @@ -4,14 +4,17 @@ TestMenu::TestMenu(void* h) { handle = h; } -TestMenu::~TestMenu() {} +TestMenu::~TestMenu() { + std::cout << "TestMenu Destroyed!\n"; +} void TestMenu::run() { std::cout << "Your number is: " << num << "\n" << "1. Add 1\n" << "2. Subtract 1\n" - << "3. Quit\n\n"; + << "3. Unload Module\n\n" + << "4. Quit\n\n"; std::cin >> choice; @@ -23,6 +26,9 @@ void TestMenu::run() { num--; break; case 3: + App::Get().unload(self); + break; + case 4: App::Get().end(); break; default: diff --git a/modules/testMenu/src/testMenu.h b/modules/testMenu/src/testMenu.h index 1e0cb91..063d8e6 100644 --- a/modules/testMenu/src/testMenu.h +++ b/modules/testMenu/src/testMenu.h @@ -16,8 +16,4 @@ extern "C" { Module* create(void* handle) { return new TestMenu(handle); } - - void destroy(Module* m) { - delete m; - } } diff --git a/src/App.cpp b/src/App.cpp index b6d0cfe..961b6d3 100644 --- a/src/App.cpp +++ b/src/App.cpp @@ -20,15 +20,19 @@ App::App(const int& argc, char* argv[]) { App::~App() { std::cout << "\nExiting..."; + for(auto it = modules.begin(); it != modules.end(); it++) { + void* handle = (*it)->getHandle(); + delete *it; + dlclose(handle); + modules.erase(it); + } } void App::run() { std::cout << "\nTesting...\n"; - done = modules.empty(); - // Main loop - while (!done) { + while (!done && !modules.empty()) { for(auto it = modules.begin(); it != modules.end(); it++) (*it)->run(); @@ -64,10 +68,22 @@ void App::load(std::string lib) { } } } + +void App::unload(std::list::iterator it) { + void* handle = (*it)->getHandle(); + delete *it; + dlclose(handle); + modules.erase(it); +} void App::handleArgs(const int& argc, char* argv[]) { int i = 0; + + if(argc == 0) { + printHelp(); + end(); + } while(i < argc) { if(strcmp(argv[i], "-h") == 0) { diff --git a/src/App.h b/src/App.h index 75f9f62..775309f 100644 --- a/src/App.h +++ b/src/App.h @@ -12,9 +12,7 @@ class App { bool done; - std::vector modules; - std::vector mCreators; - std::vector mDestroyers; + std::list modules; public: App(const int&, char*[]); @@ -26,11 +24,13 @@ class App { void load(std::string); + void unload(std::list::iterator); + void handleArgs(const int&, char*[]); void printHelp(); - void end() { done = true; }; + void end() { done = true; } }; #endif diff --git a/src/Module.h b/src/Module.h index 80d8140..7b4daa0 100644 --- a/src/Module.h +++ b/src/Module.h @@ -7,16 +7,18 @@ class Module { public: typedef Module* create_t(void*); - typedef void destroy_t(Module*); + typedef void* destroy_t(Module*); virtual ~Module() {} virtual void run() = 0; std::string getName() const { return name; } + void* getHandle() { return handle; } protected: std::string name; void* handle; + std::list::iterator self; }; #endif diff --git a/src/pch.hpp b/src/pch.hpp index a15dcec..72b2b97 100644 --- a/src/pch.hpp +++ b/src/pch.hpp @@ -3,7 +3,7 @@ #include #include -#include +#include #include