summaryrefslogtreecommitdiff
path: root/cpp/src/Ice/MetricsAdminI.cpp
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2012-10-16 12:15:14 +0200
committerBenoit Foucher <benoit@zeroc.com>2012-10-16 12:15:14 +0200
commit1edb603754a8ab3922a3b9b8c69e0dd3614e0dab (patch)
treed5d56c91a42187cbd68b0dcf65e95eab68cde22d /cpp/src/Ice/MetricsAdminI.cpp
parentICE-4856 - Fix multicast for JDK 7 (diff)
downloadice-1edb603754a8ab3922a3b9b8c69e0dd3614e0dab.tar.bz2
ice-1edb603754a8ab3922a3b9b8c69e0dd3614e0dab.tar.xz
ice-1edb603754a8ab3922a3b9b8c69e0dd3614e0dab.zip
Fixed IceMX race condition, VC9 build
Diffstat (limited to 'cpp/src/Ice/MetricsAdminI.cpp')
-rw-r--r--cpp/src/Ice/MetricsAdminI.cpp42
1 files changed, 39 insertions, 3 deletions
diff --git a/cpp/src/Ice/MetricsAdminI.cpp b/cpp/src/Ice/MetricsAdminI.cpp
index 1bde9603020..8322dae4898 100644
--- a/cpp/src/Ice/MetricsAdminI.cpp
+++ b/cpp/src/Ice/MetricsAdminI.cpp
@@ -100,7 +100,11 @@ MetricsMapI::RegExp::RegExp(const string& attribute, const string& regexp) : _at
throw SyscallException(__FILE__, __LINE__);
}
#else
+# if _MSC_VER < 1600
+ _regex = std::tr1::regex(regexp, std::tr1::regex_constants::extended | std::tr1::regex_constants::nosubs);
+# else
_regex = regex(regexp, std::regex_constants::extended | std::regex_constants::nosubs);
+# endif
#endif
}
@@ -117,7 +121,11 @@ MetricsMapI::RegExp::match(const string& value)
#ifndef ICE_CPP11_REGEXP
return regexec(&_preg, value.c_str(), 0, 0, 0) == 0;
#else
+# if _MSC_VER < 1600
+ return std::tr1::regex_match(value, _regex);
+# else
return regex_match(value, _regex);
+# endif
#endif
}
@@ -204,6 +212,15 @@ MetricsViewI::MetricsViewI(const string& name) : _name(name)
{
}
+void
+MetricsViewI::destroy()
+{
+ for(map<string, MetricsMapIPtr>::const_iterator p = _maps.begin(); p != _maps.end(); ++p)
+ {
+ p->second->destroy();
+ }
+}
+
bool
MetricsViewI::addOrUpdateMap(const PropertiesPtr& properties, const string& mapName,
const MetricsMapFactoryPtr& factory, const Ice::LoggerPtr& logger)
@@ -227,6 +244,7 @@ MetricsViewI::addOrUpdateMap(const PropertiesPtr& properties, const string& mapN
map<string, MetricsMapIPtr>::iterator q = _maps.find(mapName);
if(q != _maps.end())
{
+ q->second->destroy();
_maps.erase(q);
return true;
}
@@ -245,6 +263,7 @@ MetricsViewI::addOrUpdateMap(const PropertiesPtr& properties, const string& mapN
map<string, MetricsMapIPtr>::iterator q = _maps.find(mapName);
if(q != _maps.end())
{
+ q->second->destroy();
_maps.erase(q);
return true;
}
@@ -257,21 +276,26 @@ MetricsViewI::addOrUpdateMap(const PropertiesPtr& properties, const string& mapN
return false; // The map configuration didn't change, no need to re-create.
}
+ if(q != _maps.end())
+ {
+ // Destroy the previous map
+ q->second->destroy();
+ _maps.erase(q);
+ }
+
try
{
- _maps[mapName] = factory->create(mapPrefix, properties);
+ _maps.insert(make_pair(mapName, factory->create(mapPrefix, properties)));
}
catch(const std::exception& ex)
{
Ice::Warning warn(logger);
warn << "unexpected exception while creating metrics map:\n" << ex;
- _maps.erase(mapName);
}
catch(const string& msg)
{
Ice::Warning warn(logger);
warn << msg;
- _maps.erase(mapName);
}
return true;
}
@@ -282,6 +306,7 @@ MetricsViewI::removeMap(const string& mapName)
map<string, MetricsMapIPtr>::iterator q = _maps.find(mapName);
if(q != _maps.end())
{
+ q->second->destroy();
_maps.erase(q);
return true;
}
@@ -354,6 +379,16 @@ MetricsAdminI::MetricsAdminI(const PropertiesPtr& properties, const LoggerPtr& l
}
void
+MetricsAdminI::destroy()
+{
+ Lock sync(*this);
+ for(map<string, MetricsViewIPtr>::const_iterator p = _views.begin(); p != _views.end(); ++p)
+ {
+ p->second->destroy();
+ }
+}
+
+void
MetricsAdminI::updateViews()
{
set<MetricsMapFactoryPtr> updatedMaps;
@@ -418,6 +453,7 @@ MetricsAdminI::updateViews()
{
updatedMaps.insert(_factories[*q]);
}
+ p->second->destroy();
}
}
}