summaryrefslogtreecommitdiff
path: root/qpid/cpp/src/qpid/management
diff options
context:
space:
mode:
Diffstat (limited to 'qpid/cpp/src/qpid/management')
-rw-r--r--qpid/cpp/src/qpid/management/Manageable.h6
-rw-r--r--qpid/cpp/src/qpid/management/ManagementObject.cpp30
-rw-r--r--qpid/cpp/src/qpid/management/ManagementObject.h20
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;