diff --git a/spack.yaml b/spack.yaml index 5ca1af5..a80c052 100644 --- a/spack.yaml +++ b/spack.yaml @@ -22,6 +22,8 @@ spack: packages: mochi-thallium: require: "@0.14.0:" + mochi-bedrock-module-api: + require: "@0.2.0:" mruby: require: - cflags=-fPIC diff --git a/src/BedrockModule.cpp b/src/BedrockModule.cpp index cf47856..79a2342 100644 --- a/src/BedrockModule.cpp +++ b/src/BedrockModule.cpp @@ -6,70 +6,57 @@ #include "poesie/Client.hpp" #include "poesie/Provider.hpp" #include "poesie/ProviderHandle.hpp" -#include -namespace tl = thallium; - -class PoesieFactory : public bedrock::AbstractServiceFactory { - - public: - - PoesieFactory() {} - - void *registerProvider(const bedrock::FactoryArgs &args) override { - auto provider = new poesie::Provider(args.mid, args.provider_id, - args.config, tl::pool(args.pool)); - return static_cast(provider); - } - - void deregisterProvider(void *p) override { - auto provider = static_cast(p); - delete provider; - } - - std::string getProviderConfig(void *p) override { - auto provider = static_cast(p); - return provider->getConfig(); - } +#include - void *initClient(const bedrock::FactoryArgs& args) override { - return static_cast(new poesie::Client(args.mid)); - } - - void finalizeClient(void *client) override { - delete static_cast(client); - } +namespace tl = thallium; - std::string getClientConfig(void* c) override { - auto client = static_cast(c); - return client->getConfig(); - } +class PoesieComponent : public bedrock::AbstractComponent { - void *createProviderHandle(void *c, hg_addr_t address, - uint16_t provider_id) override { - auto client = static_cast(c); - auto ph = new poesie::ProviderHandle( - client->engine(), - address, - provider_id, - false); - return static_cast(ph); - } + std::unique_ptr m_provider; - void destroyProviderHandle(void *providerHandle) override { - auto ph = static_cast(providerHandle); - delete ph; - } - - const std::vector &getProviderDependencies() override { - static const std::vector no_dependency; - return no_dependency; - } + public: - const std::vector &getClientDependencies() override { - static const std::vector no_dependency; - return no_dependency; - } + PoesieComponent(const tl::engine& engine, + uint16_t provider_id, + const std::string& config, + const tl::pool& pool) + : m_provider{std::make_unique(engine, provider_id, config, pool)} + {} + + void* getHandle() override { + return static_cast(m_provider.get()); + } + + std::string getConfig() override { + return m_provider->getConfig(); + } + + static std::shared_ptr + Register(const bedrock::ComponentArgs& args) { + tl::pool pool; + auto it = args.dependencies.find("pool"); + if(it != args.dependencies.end() && !it->second.empty()) { + pool = it->second[0]->getHandle(); + } + return std::make_shared( + args.engine, args.provider_id, args.config, pool); + } + + static std::vector + GetDependencies(const bedrock::ComponentArgs& args) { + (void)args; + std::vector dependencies{ + bedrock::Dependency{ + /* name */ "pool", + /* type */ "pool", + /* is_required */ false, + /* is_array */ false, + /* is_updatable */ false + } + }; + return dependencies; + } }; -BEDROCK_REGISTER_MODULE_FACTORY(poesie, PoesieFactory) +BEDROCK_REGISTER_COMPONENT_TYPE(poesie, PoesieComponent)