Kernel improvements (#485)

* **New Features**
  * Added public accessors for querying module/device start and ready state.

* **Refactor**
  * Internal state moved to opaque internal objects; module/device/driver initializers now explicitly initialize internal pointers.
  * Lifecycle handling updated to construct/destruct internal state and use accessors.

* **Tests**
  * Tests updated to use public accessors and explicit construct/destruct lifecycle calls.

* **Chores**
  * Test build/include paths and small metadata updated.
This commit is contained in:
Ken Van Hoeylandt
2026-02-06 16:32:30 +01:00
committed by GitHub
parent 1757af859c
commit 79e43b093a
105 changed files with 338 additions and 331 deletions
+19 -10
View File
@@ -1,14 +1,19 @@
#include <vector>
#include <string.h>
#include <cstring>
#include <algorithm>
#include <new>
#include <tactility/concurrent/mutex.h>
#include <tactility/module.h>
#include <vector>
#define TAG "module"
struct ModuleInternal {
bool started = false;
};
struct ModuleLedger {
std::vector<struct Module*> modules;
struct Mutex mutex = { 0 };
struct Mutex mutex {};
ModuleLedger() { mutex_construct(&mutex); }
~ModuleLedger() { mutex_destruct(&mutex); }
@@ -19,11 +24,14 @@ static ModuleLedger ledger;
extern "C" {
error_t module_construct(struct Module* module) {
module->internal.started = false;
module->internal = new (std::nothrow) ModuleInternal();
if (module->internal == nullptr) return ERROR_OUT_OF_MEMORY;
return ERROR_NONE;
}
error_t module_destruct(struct Module* module) {
delete static_cast<ModuleInternal*>(module->internal);
module->internal = nullptr;
return ERROR_NONE;
}
@@ -44,28 +52,30 @@ error_t module_remove(struct Module* module) {
error_t module_start(struct Module* module) {
LOG_I(TAG, "start %s", module->name);
if (module->internal.started) return ERROR_NONE;
auto* internal = static_cast<ModuleInternal*>(module->internal);
if (internal->started) return ERROR_NONE;
error_t error = module->start();
module->internal.started = (error == ERROR_NONE);
internal->started = (error == ERROR_NONE);
return error;
}
bool module_is_started(struct Module* module) {
return module->internal.started;
return static_cast<ModuleInternal*>(module->internal)->started;
}
error_t module_stop(struct Module* module) {
LOG_I(TAG, "stop %s", module->name);
if (!module->internal.started) return ERROR_NONE;
auto* internal = static_cast<ModuleInternal*>(module->internal);
if (!internal->started) return ERROR_NONE;
error_t error = module->stop();
if (error != ERROR_NONE) {
return error;
}
module->internal.started = false;
internal->started = false;
return error;
}
@@ -106,4 +116,3 @@ bool module_resolve_symbol_global(const char* symbol_name, uintptr_t* symbol_add
}
}