Skip to content
Snippets Groups Projects
Commit cc8daf32 authored by Nicolas Pope's avatar Nicolas Pope
Browse files

Add some locks to configurable creation

parent c332509c
No related branches found
No related tags found
1 merge request!316Resolves #343 GUI and Frame Refactor
......@@ -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;
......@@ -285,6 +285,8 @@ ftl::Configurable *ftl::config::find(const std::string &uri) {
}
}
SHARED_LOCK(mutex, lk);
auto ix = config_instance.find(actual_uri);
if (ix == config_instance.end()) {
auto ix = config_alias.find(actual_uri);
......@@ -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();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment