From 022be22fa2d548fb4817f6e7b3f89dad22e605b1 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Sun, 24 Feb 2013 08:27:00 +0100 Subject: [PATCH] Added some missing files. --- lib/base/base.vcxproj | 2 ++ lib/base/objectlock.cpp | 52 +++++++++++++++++++++++++++++++++++++++++ lib/base/objectlock.h | 45 +++++++++++++++++++++++++++++++++++ 3 files changed, 99 insertions(+) create mode 100644 lib/base/objectlock.cpp create mode 100644 lib/base/objectlock.h diff --git a/lib/base/base.vcxproj b/lib/base/base.vcxproj index 7f136821c..c115d7465 100644 --- a/lib/base/base.vcxproj +++ b/lib/base/base.vcxproj @@ -38,6 +38,7 @@ + @@ -79,6 +80,7 @@ + diff --git a/lib/base/objectlock.cpp b/lib/base/objectlock.cpp new file mode 100644 index 000000000..c51171853 --- /dev/null +++ b/lib/base/objectlock.cpp @@ -0,0 +1,52 @@ +/****************************************************************************** + * Icinga 2 * + * Copyright (C) 2012 Icinga Development Team (http://www.icinga.org/) * + * * + * This program is free software; you can redistribute it and/or * + * modify it under the terms of the GNU General Public License * + * as published by the Free Software Foundation; either version 2 * + * of the License, or (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the Free Software Foundation * + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * + ******************************************************************************/ + +#include "i2-base.h" + +using namespace icinga; + +ObjectLock::ObjectLock(void) + : m_Object(NULL), m_Lock() +{ } + +ObjectLock::ObjectLock(const Object::Ptr& object) + : m_Object(object.get()), m_Lock() +{ + if (m_Object) + Lock(); +} + +ObjectLock::ObjectLock(const Object *object) + : m_Object(object), m_Lock() +{ + if (m_Object) + Lock(); +} + +void ObjectLock::Lock(void) +{ + assert(!m_Lock.owns_lock() && m_Object != NULL); + + m_Lock = recursive_mutex::scoped_lock(m_Object->GetMutex()); +} + +void ObjectLock::Unlock(void) +{ + m_Lock = recursive_mutex::scoped_lock(); +} diff --git a/lib/base/objectlock.h b/lib/base/objectlock.h new file mode 100644 index 000000000..580439bd7 --- /dev/null +++ b/lib/base/objectlock.h @@ -0,0 +1,45 @@ +/****************************************************************************** + * Icinga 2 * + * Copyright (C) 2012 Icinga Development Team (http://www.icinga.org/) * + * * + * This program is free software; you can redistribute it and/or * + * modify it under the terms of the GNU General Public License * + * as published by the Free Software Foundation; either version 2 * + * of the License, or (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the Free Software Foundation * + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * + ******************************************************************************/ + +#ifndef OBJECTLOCK_H +#define OBJECTLOCK_H + +namespace icinga +{ + +/** + * A scoped lock for Objects. + */ +struct I2_BASE_API ObjectLock { +public: + ObjectLock(void); + ObjectLock(const Object::Ptr& object); + ObjectLock(const Object *object); + + void Lock(void); + void Unlock(void); + +private: + const Object *m_Object; + recursive_mutex::scoped_lock m_Lock; +}; + +} + +#endif /* OBJECTLOCK_H */