diff --git a/components/common/cpp/src/configuration.cpp b/components/common/cpp/src/configuration.cpp index 607d171cf9703d11b6a34339f8aff267e5f2b681..29ee191f098ff7d13f72d1bf933202641ac40aab 100644 --- a/components/common/cpp/src/configuration.cpp +++ b/components/common/cpp/src/configuration.cpp @@ -237,7 +237,7 @@ static bool mergeConfig(const string path) { } } -static MUTEX mutex; +static SHARED_MUTEX mutex; static std::map<std::string, json_t*> config_index; static std::map<std::string, ftl::Configurable*> config_instance; static std::map<std::string, ftl::Configurable*> config_alias; @@ -284,6 +284,8 @@ ftl::Configurable *ftl::config::find(const std::string &uri) { actual_uri = rootCFG->getID() + uri; } } + + SHARED_LOCK(mutex, lk); auto ix = config_instance.find(actual_uri); if (ix == config_instance.end()) { @@ -295,6 +297,7 @@ ftl::Configurable *ftl::config::find(const std::string &uri) { } void ftl::config::alias(const std::string &uri, Configurable *cfg) { + UNIQUE_LOCK(mutex, lk); config_alias[uri] = cfg; } @@ -304,6 +307,7 @@ const std::vector<Configurable*> &ftl::config::findByTag(const std::string &tag) std::vector<std::string> ftl::config::list() { vector<string> r; + SHARED_LOCK(mutex, lk); for (auto i : config_instance) { r.push_back(i.first); } @@ -312,6 +316,7 @@ std::vector<std::string> ftl::config::list() { const std::vector<Configurable *> ftl::config::getChildren(const string &uri) { std::vector<Configurable *> children; + SHARED_LOCK(mutex, lk); for (const auto &[curi, c] : config_instance) { auto mismatch = std::mismatch(uri.begin(), uri.end(), curi.begin()); if (mismatch.first == uri.end()) { @@ -327,6 +332,8 @@ void ftl::config::registerConfigurable(ftl::Configurable *cfg) { LOG(ERROR) << "Configurable object is missing $id property: " << cfg->getConfig(); return; } + + UNIQUE_LOCK(mutex, lk); auto ix = config_instance.find(*uri); if (ix != config_instance.end()) { // FIXME: HACK NOTE TODO SHOULD BE FATAL @@ -335,7 +342,9 @@ void ftl::config::registerConfigurable(ftl::Configurable *cfg) { config_instance[*uri] = cfg; LOG(INFO) << "Registering instance: " << *uri; + lk.unlock(); auto tags = cfg->get<vector<string>>("tags"); + lk.lock(); if (tags) { for (auto &t : *tags) { //LOG(INFO) << "REGISTER TAG: " << t; @@ -462,6 +471,8 @@ json_t &ftl::config::resolve(const std::string &puri, bool eager) { //} } + SHARED_LOCK(mutex, lk); + ftl::URI uri(uri_str); if (uri.isValid()) { std::string u = uri.getBaseURI();