From ac696072507708ce8db67aa4f5b3aa593d71c24c Mon Sep 17 00:00:00 2001 From: Alexey Rybalchenko Date: Mon, 26 Jun 2017 12:29:19 +0200 Subject: [PATCH] make FairProgOptions calls thread safe --- fairmq/options/FairMQProgOptions.h | 5 +++++ fairmq/options/FairProgOptions.cxx | 25 ++----------------------- fairmq/options/FairProgOptions.h | 30 ++++++++++++++++++++++++++++-- 3 files changed, 35 insertions(+), 25 deletions(-) diff --git a/fairmq/options/FairMQProgOptions.h b/fairmq/options/FairMQProgOptions.h index 85077538..5a95ee9b 100644 --- a/fairmq/options/FairMQProgOptions.h +++ b/fairmq/options/FairMQProgOptions.h @@ -19,6 +19,7 @@ #include #include #include +#include #include "FairProgOptions.h" #include "FairMQEventManager.h" @@ -164,6 +165,8 @@ class FairMQProgOptions : public FairProgOptions , public FairMQEventManager template int UpdateValue(const std::string& key, T val) { + std::unique_lock lock(fConfigMutex); + if (fVarMap.count(key)) { // update variable map @@ -204,6 +207,8 @@ class FairMQProgOptions : public FairProgOptions , public FairMQEventManager template void Subscribe(const std::string& key, F&& func) const { + std::unique_lock lock(fConfigMutex); + static_assert(!std::is_same::value || !std::is_same::value, "In template member FairMQProgOptions::Subscribe(key,Lambda) the types const char* or char* for the calback signatures are not supported."); diff --git a/fairmq/options/FairProgOptions.cxx b/fairmq/options/FairProgOptions.cxx index 5ecab041..1ef3ecc1 100644 --- a/fairmq/options/FairProgOptions.cxx +++ b/fairmq/options/FairProgOptions.cxx @@ -28,6 +28,7 @@ FairProgOptions::FairProgOptions() : fConfigFileOptions("Configuration file options"), fSeverityMap(), fVisibleOptions("Visible options"), + fConfigMutex(), fVerbosityLevel("INFO"), fUseConfigFile(false), fConfigFile() @@ -204,29 +205,7 @@ int FairProgOptions::ParseEnvironment(const function& environmen return 0; } -// Given a key, convert the variable value to string -string FairProgOptions::GetStringValue(const string& key) -{ - string valueStr; - try - { - if (fVarMap.count(key)) - { - valueStr=FairMQ::ConvertVariableValue().Run(fVarMap.at(key)); - } - } - catch(exception& e) - { - LOG(ERROR) << "Exception thrown for the key '" << key << "'"; - LOG(ERROR) << e.what(); - } - - return valueStr; -} - -/// ////////////////////////////////////////////////////////////////////////////////////////////////////// -/// Print/notify options -int FairProgOptions::PrintHelp() const +int FairProgOptions::PrintHelp() const { cout << fVisibleOptions << "\n"; return 0; diff --git a/fairmq/options/FairProgOptions.h b/fairmq/options/FairProgOptions.h index 1514e2b0..500eb288 100644 --- a/fairmq/options/FairProgOptions.h +++ b/fairmq/options/FairProgOptions.h @@ -24,6 +24,7 @@ #include #include #include +#include #include /* @@ -77,6 +78,8 @@ class FairProgOptions template T GetValue(const std::string& key) const { + std::unique_lock lock(fConfigMutex); + T val = T(); try { @@ -99,11 +102,32 @@ class FairProgOptions return val; } - // convert value to string that corresponds to the key - std::string GetStringValue(const std::string& key); + // Given a key, convert the variable value to string + std::string GetStringValue(const std::string& key) + { + std::unique_lock lock(fConfigMutex); + + std::string valueStr; + try + { + if (fVarMap.count(key)) + { + valueStr = FairMQ::ConvertVariableValue().Run(fVarMap.at(key)); + } + } + catch (std::exception& e) + { + LOG(ERROR) << "Exception thrown for the key '" << key << "'"; + LOG(ERROR) << e.what(); + } + + return valueStr; + } int Count(const std::string& key) const { + std::unique_lock lock(fConfigMutex); + return fVarMap.count(key); } @@ -162,6 +186,8 @@ class FairProgOptions std::map fSeverityMap; po::options_description fVisibleOptions; + mutable std::mutex fConfigMutex; + std::string fVerbosityLevel; bool fUseConfigFile; boost::filesystem::path fConfigFile;