]> granicus.if.org Git - icinga2/commitdiff
Fix deadlock in DB IDO and external command events
authorMichael Friedrich <michael.friedrich@netways.de>
Mon, 2 Mar 2015 15:20:22 +0000 (16:20 +0100)
committerMichael Friedrich <michael.friedrich@netways.de>
Mon, 2 Mar 2015 15:20:22 +0000 (16:20 +0100)
refs #8511

lib/db_ido/dbobject.cpp
lib/db_ido/dbobject.hpp

index 73aeed745253fb183172cd021de4393d682a9410..7b3068833d06b58ab4038036ceb86e212d5f291c 100644 (file)
@@ -293,6 +293,8 @@ void DbObject::OnStatusUpdate(void)
 
 DbObject::Ptr DbObject::GetOrCreateByObject(const DynamicObject::Ptr& object)
 {
+       boost::mutex::scoped_lock lock(GetStaticMutex());
+
        DbObject::Ptr dbobj = object->GetExtension("DbObject");
 
        if (dbobj)
@@ -326,11 +328,8 @@ DbObject::Ptr DbObject::GetOrCreateByObject(const DynamicObject::Ptr& object)
 
        dbobj = dbtype->GetOrCreateObjectByName(name1, name2);
 
-       {
-               ObjectLock olock(object);
-               dbobj->SetObject(object);
-               object->SetExtension("DbObject", dbobj);
-       }
+       dbobj->SetObject(object);
+       object->SetExtension("DbObject", dbobj);
 
        return dbobj;
 }
@@ -357,3 +356,9 @@ void DbObject::VarsChangedHandler(const CustomVarObject::Ptr& object)
 
        dbobj->SendVarsStatusUpdate();
 }
+
+boost::mutex& DbObject::GetStaticMutex(void)
+{
+       static boost::mutex mutex;
+       return mutex;
+}
index 6ceb850269f605df2507a6f735882c23fbf327fe..559df2f55566d3a2f5708dcab24a5588dd4f6642 100644 (file)
@@ -105,6 +105,7 @@ private:
 
        static void StateChangedHandler(const DynamicObject::Ptr& object);
        static void VarsChangedHandler(const CustomVarObject::Ptr& object);
+       static boost::mutex& GetStaticMutex(void);
 
        friend class DbType;
 };