Module bug fixes

This commit is contained in:
Ken Van Hoeylandt 2026-02-28 23:43:34 +01:00
parent c2177929bc
commit 10ab4dded8
2 changed files with 14 additions and 10 deletions

View File

@ -118,6 +118,7 @@ error_t module_construct_add_start(struct Module* module);
/** /**
* @brief Check if the module is started. * @brief Check if the module is started.
* Can be used when module isn't constructed yet.
* @param module module to check * @param module module to check
* @return true if the module is started, false otherwise * @return true if the module is started, false otherwise
*/ */

View File

@ -12,8 +12,8 @@ struct ModuleInternal {
}; };
struct ModuleLedger { struct ModuleLedger {
std::vector<struct Module*> modules; std::vector<Module*> modules;
struct Mutex mutex {}; Mutex mutex {};
ModuleLedger() { mutex_construct(&mutex); } ModuleLedger() { mutex_construct(&mutex); }
~ModuleLedger() { mutex_destruct(&mutex); } ~ModuleLedger() { mutex_destruct(&mutex); }
@ -23,36 +23,37 @@ static ModuleLedger ledger;
extern "C" { extern "C" {
error_t module_construct(struct Module* module) { error_t module_construct(Module* module) {
module->internal = new (std::nothrow) ModuleInternal(); module->internal = new (std::nothrow) ModuleInternal();
if (module->internal == nullptr) return ERROR_OUT_OF_MEMORY; if (module->internal == nullptr) return ERROR_OUT_OF_MEMORY;
return ERROR_NONE; return ERROR_NONE;
} }
error_t module_destruct(struct Module* module) { error_t module_destruct(Module* module) {
delete static_cast<ModuleInternal*>(module->internal); delete static_cast<ModuleInternal*>(module->internal);
module->internal = nullptr; module->internal = nullptr;
return ERROR_NONE; return ERROR_NONE;
} }
error_t module_add(struct Module* module) { error_t module_add(Module* module) {
mutex_lock(&ledger.mutex); mutex_lock(&ledger.mutex);
ledger.modules.push_back(module); ledger.modules.push_back(module);
mutex_unlock(&ledger.mutex); mutex_unlock(&ledger.mutex);
return ERROR_NONE; return ERROR_NONE;
} }
error_t module_remove(struct Module* module) { error_t module_remove(Module* module) {
mutex_lock(&ledger.mutex); mutex_lock(&ledger.mutex);
ledger.modules.erase(std::remove(ledger.modules.begin(), ledger.modules.end(), module), ledger.modules.end()); ledger.modules.erase(std::remove(ledger.modules.begin(), ledger.modules.end(), module), ledger.modules.end());
mutex_unlock(&ledger.mutex); mutex_unlock(&ledger.mutex);
return ERROR_NONE; return ERROR_NONE;
} }
error_t module_start(struct Module* module) { error_t module_start(Module* module) {
LOG_I(TAG, "start %s", module->name); LOG_I(TAG, "start %s", module->name);
auto* internal = static_cast<ModuleInternal*>(module->internal); auto* internal = module->internal;
if (internal == nullptr) return ERROR_INVALID_STATE;
if (internal->started) return ERROR_NONE; if (internal->started) return ERROR_NONE;
error_t error = module->start(); error_t error = module->start();
@ -61,13 +62,15 @@ error_t module_start(struct Module* module) {
} }
bool module_is_started(struct Module* module) { bool module_is_started(struct Module* module) {
return static_cast<ModuleInternal*>(module->internal)->started; auto* internal = module->internal;
return internal != nullptr && internal->started;
} }
error_t module_stop(struct Module* module) { error_t module_stop(struct Module* module) {
LOG_I(TAG, "stop %s", module->name); LOG_I(TAG, "stop %s", module->name);
auto* internal = static_cast<ModuleInternal*>(module->internal); auto* internal = module->internal;
if (internal == nullptr) return ERROR_INVALID_STATE;
if (!internal->started) return ERROR_NONE; if (!internal->started) return ERROR_NONE;
error_t error = module->stop(); error_t error = module->stop();