From d03d2dae67381ab228fe0fa134756489e92b9c86 Mon Sep 17 00:00:00 2001 From: Green Sky Date: Fri, 11 Apr 2025 20:46:50 +0200 Subject: [PATCH] add dedicated stopAll() should not change abi --- solanaceae/plugin/plugin.cpp | 14 ++++++++++++-- solanaceae/plugin/plugin.hpp | 7 ++++--- solanaceae/plugin/plugin_manager.cpp | 12 ++++++++---- solanaceae/plugin/plugin_manager.hpp | 3 +++ 4 files changed, 27 insertions(+), 9 deletions(-) diff --git a/solanaceae/plugin/plugin.cpp b/solanaceae/plugin/plugin.cpp index 75a9f63..aaabcfd 100644 --- a/solanaceae/plugin/plugin.cpp +++ b/solanaceae/plugin/plugin.cpp @@ -108,6 +108,8 @@ Plugin::Plugin(Plugin&& other) { _fn_render = other._fn_render; other._fn_render = nullptr; + + _running = other._running; } // unloads the plugin @@ -122,14 +124,22 @@ Plugin::~Plugin(void) { } // runs the start function -uint32_t Plugin::start(SolanaAPI* solana_api) const { +uint32_t Plugin::start(SolanaAPI* solana_api) { assert(valid_plugin); + if (_running) { + return 1; + } + _running = true; return reinterpret_cast(_fn_start)(solana_api); } // stop function -void Plugin::stop(void) const { +void Plugin::stop(void) { assert(valid_plugin); + if (!_running) { + return; + } + _running = false; reinterpret_cast(_fn_stop)(); } diff --git a/solanaceae/plugin/plugin.hpp b/solanaceae/plugin/plugin.hpp index baf6ab7..85f8810 100644 --- a/solanaceae/plugin/plugin.hpp +++ b/solanaceae/plugin/plugin.hpp @@ -22,6 +22,8 @@ struct Plugin { void* _fn_tick = nullptr; void* _fn_render = nullptr; + bool _running = false; + void* loadSymbol(const char* name); // loads lib and gets name (and version) @@ -32,12 +34,11 @@ struct Plugin { // unloads the plugin ~Plugin(void); - // runs the start function - uint32_t start(SolanaAPI* solana_api) const; + uint32_t start(SolanaAPI* solana_api); // stop function - void stop(void) const; + void stop(void); // update functions float tick(float delta) const; diff --git a/solanaceae/plugin/plugin_manager.cpp b/solanaceae/plugin/plugin_manager.cpp index d64fb8b..e12ad98 100644 --- a/solanaceae/plugin/plugin_manager.cpp +++ b/solanaceae/plugin/plugin_manager.cpp @@ -26,10 +26,7 @@ void g_provideInstance__internal(const char* id, const char* version, const char } // extern C PluginManager::~PluginManager(void) { - // destruct in reverse! - for (auto it = _plugins.rbegin(); it != _plugins.rend(); it++) { - it->stop(); - } + stopAll(); } bool PluginManager::add(const std::string& plug_path) { @@ -48,6 +45,13 @@ bool PluginManager::add(const std::string& plug_path) { return true; } +void PluginManager::stopAll(void) { + // destruct in reverse! + for (auto it = _plugins.rbegin(); it != _plugins.rend(); it++) { + it->stop(); + } +} + float PluginManager::tick(float delta) { float min_interval {std::numeric_limits::max()}; diff --git a/solanaceae/plugin/plugin_manager.hpp b/solanaceae/plugin/plugin_manager.hpp index 1637fce..6cde537 100644 --- a/solanaceae/plugin/plugin_manager.hpp +++ b/solanaceae/plugin/plugin_manager.hpp @@ -47,6 +47,9 @@ struct PluginManager { bool add(const std::string& plug_path); + // stops, but does not remove/unload, all plugins + void stopAll(void); + // returns the minimum time until next call is wanted in seconds float tick(float delta); float render(float delta);