Settings: Clean up settings changed callback code

master
kwolekr 2016-06-11 00:10:25 -04:00
parent 817fea6330
commit 33b874fea3
2 changed files with 44 additions and 32 deletions

View File

@ -985,39 +985,38 @@ void Settings::clearDefaultsNoLock()
} }
void Settings::registerChangedCallback(std::string name, void Settings::registerChangedCallback(const std::string &name,
setting_changed_callback cbf, void *userdata) SettingsChangedCallback cbf, void *userdata)
{ {
MutexAutoLock lock(m_callbackMutex); MutexAutoLock lock(m_callback_mutex);
m_callbacks[name].push_back(std::make_pair(cbf, userdata)); m_callbacks[name].push_back(std::make_pair(cbf, userdata));
} }
void Settings::deregisterChangedCallback(std::string name, setting_changed_callback cbf, void *userdata) void Settings::deregisterChangedCallback(const std::string &name,
SettingsChangedCallback cbf, void *userdata)
{ {
MutexAutoLock lock(m_callbackMutex); MutexAutoLock lock(m_callback_mutex);
std::map<std::string, std::vector<std::pair<setting_changed_callback, void*> > >::iterator iterToVector = m_callbacks.find(name); SettingsCallbackMap::iterator it_cbks = m_callbacks.find(name);
if (iterToVector != m_callbacks.end())
{
std::vector<std::pair<setting_changed_callback, void*> > &vector = iterToVector->second;
std::vector<std::pair<setting_changed_callback, void*> >::iterator position = if (it_cbks != m_callbacks.end()) {
std::find(vector.begin(), vector.end(), std::make_pair(cbf, userdata)); SettingsCallbackList &cbks = it_cbks->second;
if (position != vector.end()) SettingsCallbackList::iterator position =
vector.erase(position); std::find(cbks.begin(), cbks.end(), std::make_pair(cbf, userdata));
if (position != cbks.end())
cbks.erase(position);
} }
} }
void Settings::doCallbacks(const std::string name) void Settings::doCallbacks(const std::string &name) const
{ {
MutexAutoLock lock(m_callbackMutex); MutexAutoLock lock(m_callback_mutex);
std::map<std::string, std::vector<std::pair<setting_changed_callback, void*> > >::iterator iterToVector = m_callbacks.find(name);
if (iterToVector != m_callbacks.end()) SettingsCallbackMap::const_iterator it_cbks = m_callbacks.find(name);
{ if (it_cbks != m_callbacks.end()) {
std::vector<std::pair<setting_changed_callback, void*> >::iterator iter; SettingsCallbackList::const_iterator it;
for (iter = iterToVector->second.begin(); iter != iterToVector->second.end(); ++iter) for (it = it_cbks->second.begin(); it != it_cbks->second.end(); ++it)
{ (it->first)(name, it->second);
(iter->first)(name, iter->second);
}
} }
} }

View File

@ -35,8 +35,17 @@ struct NoiseParams;
extern Settings *g_settings; extern Settings *g_settings;
extern std::string g_settings_path; extern std::string g_settings_path;
/** function type to register a changed callback */ // Type for a settings changed callback function
typedef void (*setting_changed_callback)(const std::string &name, void *data); typedef void (*SettingsChangedCallback)(const std::string &name, void *data);
typedef std::vector<
std::pair<
SettingsChangedCallback,
void *
>
> SettingsCallbackList;
typedef std::map<std::string, SettingsCallbackList> SettingsCallbackMap;
enum ValueType { enum ValueType {
VALUETYPE_STRING, VALUETYPE_STRING,
@ -209,24 +218,28 @@ public:
void clearDefaults(); void clearDefaults();
void updateValue(const Settings &other, const std::string &name); void updateValue(const Settings &other, const std::string &name);
void update(const Settings &other); void update(const Settings &other);
void registerChangedCallback(std::string name, setting_changed_callback cbf, void *userdata = NULL);
void deregisterChangedCallback(std::string name, setting_changed_callback cbf, void *userdata = NULL); void registerChangedCallback(const std::string &name,
SettingsChangedCallback cbf, void *userdata = NULL);
void deregisterChangedCallback(const std::string &name,
SettingsChangedCallback cbf, void *userdata = NULL);
private: private:
void updateNoLock(const Settings &other); void updateNoLock(const Settings &other);
void clearNoLock(); void clearNoLock();
void clearDefaultsNoLock(); void clearDefaultsNoLock();
void doCallbacks(std::string name); void doCallbacks(const std::string &name) const;
std::map<std::string, SettingsEntry> m_settings; std::map<std::string, SettingsEntry> m_settings;
std::map<std::string, SettingsEntry> m_defaults; std::map<std::string, SettingsEntry> m_defaults;
std::map<std::string, std::vector<std::pair<setting_changed_callback,void*> > > m_callbacks; SettingsCallbackMap m_callbacks;
mutable Mutex m_callbackMutex; mutable Mutex m_callback_mutex;
mutable Mutex m_mutex; // All methods that access m_settings/m_defaults directly should lock this.
// All methods that access m_settings/m_defaults directly should lock this.
mutable Mutex m_mutex;
}; };