diff options
Diffstat (limited to 'qpid/cpp/src/qpid/management')
-rw-r--r-- | qpid/cpp/src/qpid/management/Manageable.h | 6 | ||||
-rw-r--r-- | qpid/cpp/src/qpid/management/ManagementObject.cpp | 30 | ||||
-rw-r--r-- | qpid/cpp/src/qpid/management/ManagementObject.h | 20 |
3 files changed, 51 insertions, 5 deletions
diff --git a/qpid/cpp/src/qpid/management/Manageable.h b/qpid/cpp/src/qpid/management/Manageable.h index 70c9a5a188..5b263e195d 100644 --- a/qpid/cpp/src/qpid/management/Manageable.h +++ b/qpid/cpp/src/qpid/management/Manageable.h @@ -20,10 +20,12 @@ // under the License. // -#include "qpid/management/ManagementObject.h" +#include "qpid/CommonImportExport.h" #include "qpid/management/Args.h" +#include "qpid/management/ManagementObject.h" +#include "qpid/sys/IntegerTypes.h" + #include <string> -#include "qpid/CommonImportExport.h" namespace qpid { namespace management { diff --git a/qpid/cpp/src/qpid/management/ManagementObject.cpp b/qpid/cpp/src/qpid/management/ManagementObject.cpp index 019963e832..f18f575ff8 100644 --- a/qpid/cpp/src/qpid/management/ManagementObject.cpp +++ b/qpid/cpp/src/qpid/management/ManagementObject.cpp @@ -23,6 +23,7 @@ #include "qpid/management/ManagementObject.h" #include "qpid/framing/FieldTable.h" #include "qpid/framing/Buffer.h" +#include "qpid/framing/reply_exceptions.h" #include "qpid/sys/Time.h" #include "qpid/sys/Thread.h" #include "qpid/log/Statement.h" @@ -245,11 +246,37 @@ ostream& operator<<(ostream& out, const ObjectId& i) }} +// Called with lock held +Manageable* ManagementObject::ManageablePtr::get() const { + if (ptr == 0) + throw framing::ResourceDeletedException("managed object deleted"); + return ptr; +} + +void ManagementObject::ManageablePtr::reset() { + Mutex::ScopedLock l(lock); + ptr = 0; +} + +uint32_t ManagementObject::ManageablePtr::ManagementMethod( + uint32_t methodId, Args& args, std::string& text) +{ + Mutex::ScopedLock l(lock); + return get()->ManagementMethod(methodId, args, text); +} + +bool ManagementObject::ManageablePtr:: AuthorizeMethod( + uint32_t methodId, Args& args, const std::string& userId) +{ + Mutex::ScopedLock l(lock); + return get()->AuthorizeMethod(methodId, args, userId); +} + ManagementObject::ManagementObject(Manageable* _core) : createTime(qpid::sys::Duration::FromEpoch()), destroyTime(0), updateTime(createTime), configChanged(true), instChanged(true), deleted(false), - coreObject(_core), flags(0), forcePublish(false) {} + manageable(_core), flags(0), forcePublish(false) {} void ManagementObject::setUpdateTime() { @@ -261,6 +288,7 @@ void ManagementObject::resourceDestroy() QPID_LOG(trace, "Management object marked deleted: " << getObjectId().getV2Key()); destroyTime = sys::Duration::FromEpoch(); deleted = true; + manageable.reset(); } int ManagementObject::maxThreads = 1; diff --git a/qpid/cpp/src/qpid/management/ManagementObject.h b/qpid/cpp/src/qpid/management/ManagementObject.h index 5719c2354d..a299f1ef4a 100644 --- a/qpid/cpp/src/qpid/management/ManagementObject.h +++ b/qpid/cpp/src/qpid/management/ManagementObject.h @@ -23,6 +23,7 @@ */ #include "qpid/CommonImportExport.h" +#include "qpid/management/Args.h" #include "qpid/management/Mutex.h" #include "qpid/types/Variant.h" #include <map> @@ -33,9 +34,9 @@ namespace qpid { namespace management { -class Manageable; class ObjectId; class ManagementObject; +class Manageable; class AgentAttachment { @@ -135,6 +136,21 @@ public: class QPID_COMMON_CLASS_EXTERN ManagementObject : public ManagementItem { protected: + // Thread safe wrapper for Manageable* with atomic calls and destroy(). + class ManageablePtr { + Manageable* ptr; + mutable Mutex lock; + Manageable* get() const; + ManageablePtr(const ManageablePtr&); // not copyable + ManageablePtr& operator=(const ManageablePtr&); // not copyable + + public: + ManageablePtr(Manageable* m) : ptr(m) {} + + uint32_t ManagementMethod(uint32_t methodId, Args& args, std::string& text); + bool AuthorizeMethod(uint32_t methodId, Args& args, const std::string& userId); + void reset(); + }; uint64_t createTime; uint64_t destroyTime; @@ -143,7 +159,7 @@ protected: mutable bool configChanged; mutable bool instChanged; bool deleted; - Manageable* coreObject; + ManageablePtr manageable; mutable Mutex accessLock; uint32_t flags; |