1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-06-27 16:36:03 +00:00

Settings fixes Make the GameGlobalShaderConstantSetter use the settings callback (8% perf improvement in game loop) Ensure variable is set Ensure settings callback is threadsafe

This commit is contained in:
gregorycu 2015-01-24 20:40:27 +11:00 committed by Craig Robbins
parent 2c4a5e1861
commit ed7c9c4cb8
4 changed files with 67 additions and 33 deletions

View file

@ -963,28 +963,39 @@ void Settings::clearNoLock()
m_defaults.clear();
}
void Settings::registerChangedCallback(std::string name,
setting_changed_callback cbf)
setting_changed_callback cbf, void *userdata)
{
m_callbacks[name].push_back(cbf);
JMutexAutoLock lock(m_callbackMutex);
m_callbacks[name].push_back(std::make_pair(cbf, userdata));
}
void Settings::deregisterChangedCallback(std::string name, setting_changed_callback cbf, void *userdata)
{
JMutexAutoLock lock(m_callbackMutex);
std::map<std::string, std::vector<std::pair<setting_changed_callback, void*> > >::iterator iterToVector = 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 =
std::find(vector.begin(), vector.end(), std::make_pair(cbf, userdata));
if (position != vector.end())
vector.erase(position);
}
}
void Settings::doCallbacks(const std::string name)
{
std::vector<setting_changed_callback> tempvector;
JMutexAutoLock lock(m_callbackMutex);
std::map<std::string, std::vector<std::pair<setting_changed_callback, void*> > >::iterator iterToVector = m_callbacks.find(name);
if (iterToVector != m_callbacks.end())
{
JMutexAutoLock lock(m_mutex);
if (m_callbacks.find(name) != m_callbacks.end())
std::vector<std::pair<setting_changed_callback, void*> >::iterator iter;
for (iter = iterToVector->second.begin(); iter != iterToVector->second.end(); iter++)
{
tempvector = m_callbacks[name];
(iter->first)(name, iter->second);
}
}
std::vector<setting_changed_callback>::iterator iter;
for (iter = tempvector.begin(); iter != tempvector.end(); iter++)
{
(*iter)(name);
}
}