diff options
author | Benoit Foucher <benoit@zeroc.com> | 2012-09-06 14:32:45 +0200 |
---|---|---|
committer | Benoit Foucher <benoit@zeroc.com> | 2012-09-06 14:32:45 +0200 |
commit | 55653e8e80f1a4ed1c54742de9fdb81cc1ca0bd9 (patch) | |
tree | 859ce7d45c580afb8abf6c9c86296e795d8e4a19 /cpp/src/Ice/MetricsAdminI.cpp | |
parent | Added Python properties demo, fixed bugs (diff) | |
download | ice-55653e8e80f1a4ed1c54742de9fdb81cc1ca0bd9.tar.bz2 ice-55653e8e80f1a4ed1c54742de9fdb81cc1ca0bd9.tar.xz ice-55653e8e80f1a4ed1c54742de9fdb81cc1ca0bd9.zip |
Performance improvments
Diffstat (limited to 'cpp/src/Ice/MetricsAdminI.cpp')
-rw-r--r-- | cpp/src/Ice/MetricsAdminI.cpp | 143 |
1 files changed, 59 insertions, 84 deletions
diff --git a/cpp/src/Ice/MetricsAdminI.cpp b/cpp/src/Ice/MetricsAdminI.cpp index 2c0bc9594d3..341c8f852f7 100644 --- a/cpp/src/Ice/MetricsAdminI.cpp +++ b/cpp/src/Ice/MetricsAdminI.cpp @@ -71,7 +71,8 @@ MetricsMapI::RegExp::match(const MetricsHelper& helper) #endif } -MetricsMapI::Entry::Entry(MetricsMapI* map, const MetricsPtr& object) : _object(object), _map(map) +MetricsMapI::Entry::Entry(MetricsMapI* map, const MetricsPtr& object, const list<Entry*>::iterator& pos) : + _object(object), _map(map), _detachedPos(pos) { } @@ -101,25 +102,6 @@ MetricsMapI::Entry::getFailures() const return f; } -void -MetricsMapI::Entry::detach(Ice::Long lifetime) -{ - MetricsMapI* map; - { - IceUtil::Mutex::Lock sync(*this); - _object->totalLifetime += lifetime; - if(--_object->current > 0) - { - return; - } - map = _map; - } - if(map) - { - map->detached(this); - } -} - MetricsPtr MetricsMapI::Entry::clone() const { @@ -133,13 +115,6 @@ MetricsMapI::Entry::id() const return _object->id; } -bool -MetricsMapI::Entry::isDetached() const -{ - Lock sync(*this); - return _object->current == 0; -} - MetricsMapI::Entry* MetricsMapI::Entry::getMatching(const string&, const MetricsHelper&) { @@ -272,20 +247,27 @@ MetricsMapI::getMatching(const MetricsHelper& helper) return 0; } } - - ostringstream os; - vector<string>::const_iterator q = _groupBySeparators.begin(); - for(vector<string>::const_iterator p = _groupByAttributes.begin(); p != _groupByAttributes.end(); ++p) + + string key; + if(_groupByAttributes.size() == 1) + { + key = helper(_groupByAttributes.front()); + } + else { - os << helper(*p); - if(q != _groupBySeparators.end()) + ostringstream os; + vector<string>::const_iterator q = _groupBySeparators.begin(); + for(vector<string>::const_iterator p = _groupByAttributes.begin(); p != _groupByAttributes.end(); ++p) { - os << *q++; + os << helper(*p); + if(q != _groupBySeparators.end()) + { + os << *q++; + } } + key = os.str(); } - string key = os.str(); - Lock sync(*this); map<string, EntryPtr>::const_iterator p = _objects.find(key); if(p == _objects.end()) @@ -298,29 +280,35 @@ MetricsMapI::getMatching(const MetricsHelper& helper) void MetricsMapI::detached(Entry* entry) { - Lock sync(*this); if(_retain == 0) { return; } + Lock sync(*this); assert(static_cast<int>(_detachedQueue.size()) <= _retain); - deque<Entry*>::iterator p = _detachedQueue.begin(); - while(p != _detachedQueue.end()) + if(entry->_detachedPos != _detachedQueue.end()) { - if(*p == entry) - { - _detachedQueue.erase(p); - break; - } - else if(!(*p)->isDetached()) - { - p = _detachedQueue.erase(p); - } - else + _detachedQueue.splice(_detachedQueue.end(), _detachedQueue, entry->_detachedPos); + entry->_detachedPos = --_detachedQueue.end(); + return; + } + + if(static_cast<int>(_detachedQueue.size()) == _retain) + { + // Remove entries which are no longer detached + list<Entry*>::iterator p = _detachedQueue.begin(); + while(p != _detachedQueue.end()) { - ++p; + if(!(*p)->isDetached()) + { + p = _detachedQueue.erase(p); + } + else + { + ++p; + } } } @@ -332,6 +320,7 @@ MetricsMapI::detached(Entry* entry) } _detachedQueue.push_back(entry); + entry->_detachedPos = --_detachedQueue.end(); } MetricsViewI::MetricsViewI(const string& name) : _name(name) @@ -414,17 +403,6 @@ MetricsViewI::getFailures(const string& mapName, const string& id) return MetricsFailures(); } -MetricsMapI::EntryPtr -MetricsViewI::getMatching(const string& mapName, const MetricsHelper& helper) const -{ - map<string, MetricsMapIPtr>::const_iterator p = _maps.find(mapName); - if(p != _maps.end()) - { - return p->second->getMatching(helper); - } - return 0; -} - vector<string> MetricsViewI::getMaps() const { @@ -436,6 +414,17 @@ MetricsViewI::getMaps() const return maps; } +MetricsMapIPtr +MetricsViewI::getMap(const string& mapName) const +{ + map<string, MetricsMapIPtr>::const_iterator p = _maps.find(mapName); + if(p != _maps.end()) + { + return p->second; + } + return 0; +} + MetricsAdminI::MetricsAdminI(const Ice::PropertiesPtr& properties) : _properties(properties) { } @@ -527,23 +516,6 @@ MetricsAdminI::updateViews() } } -vector<MetricsMapI::EntryPtr> -MetricsAdminI::getMatching(const string& mapName, const MetricsHelper& helper) const -{ - Lock sync(*this); - vector<MetricsMapI::EntryPtr> objects; - for(map<string, MetricsViewIPtr>::const_iterator p = _views.begin(); p != _views.end(); ++p) - { - MetricsMapI::EntryPtr e = p->second->getMatching(mapName, helper); - if(e) - { - objects.push_back(e); - } - } - sort(objects.begin(), objects.end()); - return objects; -} - Ice::StringSeq MetricsAdminI::getMetricsViewNames(const ::Ice::Current&) { @@ -593,15 +565,18 @@ MetricsAdminI::getMetricsFailures(const string& view, const string& map, const s return p->second->getFailures(map, id); } -void -MetricsAdminI::updated(const PropertyDict& props) +vector<MetricsMapIPtr> +MetricsAdminI::getMaps(const string& mapName) const { - for(PropertyDict::const_iterator p = props.begin(); p != props.end(); ++p) + Lock sync(*this); + vector<MetricsMapIPtr> maps; + for(std::map<string, MetricsViewIPtr>::const_iterator p = _views.begin(); p != _views.end(); ++p) { - if(p->first.find("IceMX.") == 0) + MetricsMapIPtr map = p->second->getMap(mapName); + if(map) { - updateViews(); - return; + maps.push_back(map); } } + return maps; } |