]> granicus.if.org Git - icinga2/commitdiff
Fixed invalid iterator use.
authorGunnar Beutner <gunnar.beutner@netways.de>
Sat, 4 Aug 2012 12:22:15 +0000 (14:22 +0200)
committerGunnar Beutner <gunnar.beutner@netways.de>
Sat, 4 Aug 2012 12:25:02 +0000 (14:25 +0200)
base/dynamicobject.cpp
base/dynamicobject.h

index 2320e6a55561f6856c893c775b9f725b92c600a4..4ba36c124fe70b43ad876860cdfd1bf35a9927a1 100644 (file)
@@ -21,7 +21,6 @@
 
 using namespace icinga;
 
-map<pair<String, String>, Dictionary::Ptr> DynamicObject::m_PersistentUpdates;
 double DynamicObject::m_CurrentTx = 0;
 set<DynamicObject::Ptr> DynamicObject::m_ModifiedObjects;
 
@@ -442,7 +441,7 @@ void DynamicObject::RestoreObjects(const String& filename)
                } else {
                        /* keep non-replicated objects until another config object with
                         * the same name is created (which is when we restore its tags) */
-                       m_PersistentUpdates[make_pair(type, name)] = update;
+                       GetPersistentObjects()[make_pair(type, name)] = update;
                }
        }
 }
@@ -459,6 +458,13 @@ DynamicObject::ClassMap& DynamicObject::GetClasses(void)
        return classes;
 }
 
+DynamicObject::PersistentUpdateMap& DynamicObject::GetPersistentObjects(void)
+{
+       static DynamicObject::PersistentUpdateMap persistentObjects;
+       return persistentObjects;
+}
+
+
 void DynamicObject::RegisterClass(const String& type, DynamicObject::Factory factory)
 {
        if (GetObjects(type).first != GetObjects(type).second)
@@ -469,7 +475,7 @@ void DynamicObject::RegisterClass(const String& type, DynamicObject::Factory fac
 
        /* restore persistent objects that match the newly-registered class */
        map<pair<String, String>, Dictionary::Ptr>::iterator prev, st;
-       for (st = m_PersistentUpdates.begin(); st != m_PersistentUpdates.end(); st++)
+       for (st = GetPersistentObjects().begin(); st != GetPersistentObjects().end(); )
        {
                /* check type of the update */
                if (st->first.first != type) {
@@ -489,7 +495,7 @@ void DynamicObject::RegisterClass(const String& type, DynamicObject::Factory fac
 
                prev = st;
                st++;
-               m_PersistentUpdates.erase(prev);
+               GetPersistentObjects().erase(prev);
        }
 
 }
@@ -515,14 +521,14 @@ DynamicObject::Ptr DynamicObject::Create(const String& type, const Dictionary::P
 
        /* restore the object's persistent non-config attributes */
        map<pair<String, String>, Dictionary::Ptr>::iterator st;
-       st = m_PersistentUpdates.find(make_pair(obj->GetType(), obj->GetName()));
-       if (st != m_PersistentUpdates.end()) {
+       st = GetPersistentObjects().find(make_pair(obj->GetType(), obj->GetName()));
+       if (st != GetPersistentObjects().end()) {
                Logger::Write(LogDebug, "base",  "Restoring persistent state "
                    "for object " + obj->GetType() + ":" + obj->GetName());
                obj->ApplyUpdate(st->second, Attribute_All & ~Attribute_Config);
 
                /* we're done with this update, remove it */
-               m_PersistentUpdates.erase(st);
+               GetPersistentObjects().erase(st);
        }
 
        /* apply the object's non-config attributes */
index 5a48965d1e90d61007810ea4fd7c9b4b16e87c6a..042e61630d80addc166219cf0965bec55f887ea3 100644 (file)
@@ -138,9 +138,11 @@ private:
        AttributeMap m_Attributes;
        double m_ConfigTx;
 
-       static map<pair<String, String>, Dictionary::Ptr> m_PersistentUpdates;
        static double m_CurrentTx;
 
+       typedef map<pair<String, String>, Dictionary::Ptr> PersistentUpdateMap;
+       static PersistentUpdateMap& GetPersistentObjects(void);
+
        static set<DynamicObject::Ptr> m_ModifiedObjects;
 
        void InternalApplyUpdate(const Dictionary::Ptr& serializedUpdate, int allowedTypes, bool suppressEvents);