add dedicated stopAll()
should not change abi
This commit is contained in:
		| @@ -108,6 +108,8 @@ Plugin::Plugin(Plugin&& other) { | |||||||
|  |  | ||||||
| 	_fn_render = other._fn_render; | 	_fn_render = other._fn_render; | ||||||
| 	other._fn_render = nullptr; | 	other._fn_render = nullptr; | ||||||
|  |  | ||||||
|  | 	_running = other._running; | ||||||
| } | } | ||||||
|  |  | ||||||
| // unloads the plugin | // unloads the plugin | ||||||
| @@ -122,14 +124,22 @@ Plugin::~Plugin(void) { | |||||||
| } | } | ||||||
|  |  | ||||||
| // runs the start function | // runs the start function | ||||||
| uint32_t Plugin::start(SolanaAPI* solana_api) const { | uint32_t Plugin::start(SolanaAPI* solana_api) { | ||||||
| 	assert(valid_plugin); | 	assert(valid_plugin); | ||||||
|  | 	if (_running) { | ||||||
|  | 		return 1; | ||||||
|  | 	} | ||||||
|  | 	_running = true; | ||||||
| 	return reinterpret_cast<decltype(&solana_plugin_start)>(_fn_start)(solana_api); | 	return reinterpret_cast<decltype(&solana_plugin_start)>(_fn_start)(solana_api); | ||||||
| } | } | ||||||
|  |  | ||||||
| // stop function | // stop function | ||||||
| void Plugin::stop(void) const { | void Plugin::stop(void) { | ||||||
| 	assert(valid_plugin); | 	assert(valid_plugin); | ||||||
|  | 	if (!_running) { | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  | 	_running = false; | ||||||
| 	reinterpret_cast<decltype(&solana_plugin_stop)>(_fn_stop)(); | 	reinterpret_cast<decltype(&solana_plugin_stop)>(_fn_stop)(); | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -22,6 +22,8 @@ struct Plugin { | |||||||
| 	void* _fn_tick = nullptr; | 	void* _fn_tick = nullptr; | ||||||
| 	void* _fn_render = nullptr; | 	void* _fn_render = nullptr; | ||||||
|  |  | ||||||
|  | 	bool _running = false; | ||||||
|  |  | ||||||
| 	void* loadSymbol(const char* name); | 	void* loadSymbol(const char* name); | ||||||
|  |  | ||||||
| 	// loads lib and gets name (and version) | 	// loads lib and gets name (and version) | ||||||
| @@ -32,12 +34,11 @@ struct Plugin { | |||||||
| 	// unloads the plugin | 	// unloads the plugin | ||||||
| 	~Plugin(void); | 	~Plugin(void); | ||||||
|  |  | ||||||
|  |  | ||||||
| 	// runs the start function | 	// runs the start function | ||||||
| 	uint32_t start(SolanaAPI* solana_api) const; | 	uint32_t start(SolanaAPI* solana_api); | ||||||
|  |  | ||||||
| 	// stop function | 	// stop function | ||||||
| 	void stop(void) const; | 	void stop(void); | ||||||
|  |  | ||||||
| 	// update functions | 	// update functions | ||||||
| 	float tick(float delta) const; | 	float tick(float delta) const; | ||||||
|   | |||||||
| @@ -26,10 +26,7 @@ void g_provideInstance__internal(const char* id, const char* version, const char | |||||||
| } // extern C | } // extern C | ||||||
|  |  | ||||||
| PluginManager::~PluginManager(void) { | PluginManager::~PluginManager(void) { | ||||||
| 	// destruct in reverse! | 	stopAll(); | ||||||
| 	for (auto it = _plugins.rbegin(); it != _plugins.rend(); it++) { |  | ||||||
| 		it->stop(); |  | ||||||
| 	} |  | ||||||
| } | } | ||||||
|  |  | ||||||
| bool PluginManager::add(const std::string& plug_path) { | bool PluginManager::add(const std::string& plug_path) { | ||||||
| @@ -48,6 +45,13 @@ bool PluginManager::add(const std::string& plug_path) { | |||||||
| 	return true; | 	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 PluginManager::tick(float delta) { | ||||||
| 	float min_interval {std::numeric_limits<float>::max()}; | 	float min_interval {std::numeric_limits<float>::max()}; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -47,6 +47,9 @@ struct PluginManager { | |||||||
|  |  | ||||||
| 	bool add(const std::string& plug_path); | 	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 | 	// returns the minimum time until next call is wanted in seconds | ||||||
| 	float tick(float delta); | 	float tick(float delta); | ||||||
| 	float render(float delta); | 	float render(float delta); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user