From: Michael Friedrich Date: Mon, 2 Mar 2015 15:20:22 +0000 (+0100) Subject: Fix deadlock in DB IDO and external command events X-Git-Tag: v2.3.0~53 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c61134d55af7ca3c0f32e68d3baa8ebdbc9ac4cc;p=icinga2 Fix deadlock in DB IDO and external command events refs #8511 --- diff --git a/lib/db_ido/dbobject.cpp b/lib/db_ido/dbobject.cpp index 73aeed745..7b3068833 100644 --- a/lib/db_ido/dbobject.cpp +++ b/lib/db_ido/dbobject.cpp @@ -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; +} diff --git a/lib/db_ido/dbobject.hpp b/lib/db_ido/dbobject.hpp index 6ceb85026..559df2f55 100644 --- a/lib/db_ido/dbobject.hpp +++ b/lib/db_ido/dbobject.hpp @@ -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; };