#pragma once #include "modules/base.hpp" DefineBaseException(RegistryError); DefineChildException(ModuleNotFound, RegistryError); struct RegistryModuleEntry { concurrency::Atomic warmedup; std::unique_ptr module; RegistryModuleEntry(std::unique_ptr &&module) : warmedup(false) { this->module.swap(module); } }; class Registry { // Stopped and no loaded modules const int STAGE_1 = 1; // Modules loaded but waiting for initial broadcast const int STAGE_2 = 2; // Running const int STAGE_3 = 3; // Unloading modules const int STAGE_4 = 4; concurrency::Atomic stage; std::vector> modules; std::mutex wait_mtx; std::condition_variable wait_cv; public: Registry(); bool ready(); void insert(std::unique_ptr &&module); void load(); void unload(); bool wait(); void notify(const std::string& module_name); std::string get(const std::string& module_name); std::unique_ptr& find(const std::string& module_name); }; std::shared_ptr &get_registry();